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文件播放不出来,不知道什么原因
这里只是简单的记录下,更详细的用法请自行百度.