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



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文件播放不出来,不知道什么原因


这里只是简单的记录下,更详细的用法请自行百度.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值