简单记录下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文件播放不出来,不知道什么原因
这里只是简单的记录下,更详细的用法请自行百度.
只能播放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文件播放不出来,不知道什么原因
这里只是简单的记录下,更详细的用法请自行百度.
相关文章推荐
- 冒泡排序法
- 安装gVim
- 微信企业号开发之中文编码 40006
- Oracle数据泵的使用
- java中的线程(三)——控制线程的几种简单的方法和线程同步
- SQL的主键和外键的作用
- 20.Climbing Stairs
- ORACLE功能GREATEST功能说明具体实例
- Bootstrap 按钮分组
- Clos Network 与 Leaf Spine 架构
- Android(ViewPager中的ViewPager)ViewPager FragmentPagerAdapter嵌套子ViewPager FragmentPagerAdapter页面不能正常显示
- tinyos 串口通信
- Bootstrap 下拉菜单
- auto_ptr智能指针
- 简单二叉树的创建,连接树结点,二叉树的深度(转载)
- java--通过DOM4J方式生成rss文件简单实例
- 04-06组合数学实践_交通问题
- 使用批处理文件
- 算法录 之 BFS和DFS
- How to translate virtual to physical addresses through /proc/pid/pagemap