您的位置:首页 > 其它

简单记录下VC中常用的播放音频API用法

2015-10-18 10:36 387 查看
1.playsound

只能播放wma文件

MCI可以播放 Media Player 所支持的所有格式文件,包括各种音频和视频文件

2.mcisendstring

首先加入头文件,及其相应库

#include <mmsystem.h>

#pragma comment(lib , "winmm.lib")

只能播放大部分mp3文件,少数不能播放

such as:

LPCTSTR lpszPathName = L"G:\\张信哲 - 白月光.mp3";

// 保存短路径名

WCHAR szShortPath[256] = { 0 };

// 保存命令字符串

WCHAR szCommand[256] = { 0 };

// 把长路径转换成短路径

GetShortPathName( lpszPathName, szShortPath, sizeof( szShortPath ) );

// 写入命令字符串

wsprintf( szCommand, L"open \"%s\" alias song", szShortPath );

mciSendString( szCommand, nullptr, 0, nullptr );

mciSendString( L"play song repeat", nullptr, 0, nullptr );

//mciSendString( L"close song", nullptr, 0, nullptr );

3.mcisendcommand

和mcisendstring一样

首先加入头文件,及其相应库

#include <mmsystem.h>

#pragma comment(lib , "winmm.lib")

// 文件路径名

LPCTSTR lpszPathName = L"G:\\张信哲 - 白月光.mp3";

// 保存短路径名

WCHAR szShortPath[256] = { 0 };

// 把长路径转换成短路径

GetShortPathName( lpszPathName, szShortPath, sizeof( szShortPath ) );

///////////////////////////////////////////////////////////////////////

// 打开文件

MCI_OPEN_PARMS mciOpenParms;

mciOpenParms.lpstrDeviceType = nullptr;

mciOpenParms.lpstrElementName = szShortPath;

DWORD dwResult = mciSendCommand( 0, MCI_OPEN,

MCI_OPEN_ELEMENT | MCI_WAIT | MCI_OPEN_SHAREABLE,

(DWORD)&mciOpenParms );

if ( dwResult != 0 )

{

AfxMessageBox( L"Load Music Failed!" );

return;

}

////////////////////////////////////////////////////////////////////////

// 播放文件

MCIDEVICEID nDeviceID;

nDeviceID = mciOpenParms.wDeviceID;

MCI_PLAY_PARMS mciPlay;

//set the window that will receive notification message

mciPlay.dwCallback = (DWORD)AfxGetMainWnd( )->m_hWnd;

dwResult = mciSendCommand( nDeviceID, MCI_PLAY, MCI_NOTIFY, (DWORD)&mciPlay );

if ( dwResult != 0 )

{

AfxMessageBox( L"Play Music Failed!" );

}

// close

//dwResult = mciSendCommand( nDeviceID, MCI_CLOSE, NULL, NULL );

//////////////////////////////////////////////////////////////////////

接下来,在当前类中添加如下消息映射及处理函数,实现循环播放:

如要实现循环播放的话,还可以直接用MCI_DGV_PLAY_REPEAT命令,

首先包含 #include <Digitalv.h> 头文件

然后在播放的时候,修改下面这句,

mciSendCommand( nDeviceID, MCI_PLAY, MCI_NOTIFY, (DWORD)&mciPlay );

为:

mciSendCommand( nDeviceID, MCI_PLAY,

MCI_DGV_PLAY_REPEAT, (DWORD)&mciPlay );

指定MCI_DGV_PLAY_REPEAT而不是MCI_NOTIFY(也就不需要消息处理函数了),如下

//////////////////////////////////////////////////////////////////////

ON_MESSAGE( MM_MCINOTIFY, &CSnowWnd::OnMciNotify )

LRESULT CSnowWnd::OnMciNotify( WPARAM wParam, LPARAM lParam )

{

switch ( wParam )

{

case MCI_NOTIFY_SUCCESSFUL:

{

MCI_PLAY_PARMS mciPlay;

mciPlay.dwFrom = 0;

mciPlay.dwCallback = (DWORD)AfxGetMainWnd( )->m_hWnd;

mciSendCommand( m_nDeviceID, MCI_SEEK, MCI_SEEK_TO_START, 0 );

mciSendCommand( m_nDeviceID, MCI_PLAY, MCI_NOTIFY, (DWORD)&mciPlay );

}

break;

}

return LRESULT( );

}

4.vfw库

加入头文件#include <vfw.h>

#pragma comment(lib , "vfw32.lib")

// 文件路径名

LPCTSTR lpszPathName = L"G:\\张信哲 - 白月光.mp3";

// 保存短路径名

WCHAR szShortPath[256] = { 0 };

// 把长路径转换成短路径

GetShortPathName( lpszPathName, szShortPath, sizeof( szShortPath ) );

HWND hWnd = MCIWndCreate( m_hWnd, nullptr, MCIWNDF_NOPLAYBAR, szShortPath );

MCIWndSetVolume( hWnd, 1000 ); // 设置音量 1000:normal >1000:higher <1000:lower

MCIWndPlay( hWnd );

//MCIWndDestroy( hWnd );

5.dshow库

#include "dshow.h"

#pragma comment(lib,"strmiids.lib") // dshow lib

CoInitialize( NULL ); // 在使用之前先初始化COM

// 文件路径名

LPCTSTR lpszPathName = L"G:\\张信哲 - 白月光.mp3";

// 保存短路径名

WCHAR szShortPath[256] = { 0 };

// 把长路径转换成短路径

GetShortPathName( lpszPathName, szShortPath, sizeof( szShortPath ) );

IGraphBuilder * pGBuilder;

IMediaControl * pMControl;

IMediaPosition * pMPos;

IMediaEvent * pMEvent;

CoCreateInstance( CLSID_FilterGraph, nullptr, CLSCTX_INPROC,

IID_IGraphBuilder, (void**)&pGBuilder );

pGBuilder->QueryInterface( IID_IMediaControl, (void**)&pMControl );

pGBuilder->QueryInterface( IID_IMediaEvent, (void**)&pMEvent );

pGBuilder->QueryInterface( IID_IMediaPosition, (void**)&pMPos );

// 打开文件

HRESULT res = pGBuilder->RenderFile( szShortPath, nullptr ); // 读取MP3文件

if ( res == E_FAIL )

AfxMessageBox( L"Open Failed!" );

// 播放文件

pMPos->put_CurrentPosition( 0 ); // 移动到文件头

pMControl->Run( ); // play music

// 关闭文件

//pMControl->Stop( ); // stop music

//pMControl->Release( );

//pMEvent->Release( );

//pMPos->Release( );

//pGBuilder->Release( );

CoUninitialize( ); // 在使用之后要关闭COM

注意:这里播放音频的几种API经我的测试有些MP3文件播放不出来,不知道什么原因

这里只是简单的记录下,更详细的用法请自行百度.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: