winapi - Windows 中简单的 .wav 或 .mp3 播放 - 它去哪儿了?

标签 winapi audio mp3

是否有一个“现代”替代旧的 Windows sndPlaySound() 函数,这是一种在您专注于其他事务时在后台播放 .wav 文件的非常方便的方法?我现在发现自己需要在后台播放 .mp3 文件,并且想知道如何以系统固有支持的相对简单的方式完成同样的事情。也许有一个 COM 组件可以完成基本的 .mp3 播放?

最佳答案

多年来,出现了一些与音频和媒体相关的 API,并且有几种方法可以实现这一目标。

就缺少第三方库、最佳操作系统版本覆盖范围、功能集和简单性而言,最好的是 DirectShow API。已有 15 年历史,但仍然击败了竞争对手,受当前 Visual Studio 和早期版本的 Visual Studio 可以针对的所有 Windows 版本支持(WinRT 除外)。

下面的代码片段播放 MP3 和 WMA 文件。它是 C++,但由于它完全是 COM,因此可以很好地跨语言移植。

#include "stdafx.h"
#include <dshow.h>
#include <dshowasf.h>
#include <atlcom.h>

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

#define V(x) ATLVERIFY(SUCCEEDED(x))

int _tmain(int argc, _TCHAR* argv[])
{
    static LPCTSTR g_pszPath = _T("F:\\Music\\Cher - Walking In Memphis.mp3");
    V(CoInitialize(NULL));
    {
        CComPtr<IGraphBuilder> pGraphBuilder;
        V(pGraphBuilder.CoCreateInstance(CLSID_FilterGraph));
        CComPtr<IBaseFilter> pBaseFilter;
        V(pBaseFilter.CoCreateInstance(CLSID_WMAsfReader));
        CComQIPtr<IFileSourceFilter> pFileSourceFilter = pBaseFilter;
        ATLASSERT(pFileSourceFilter);
        V(pFileSourceFilter->Load(CT2COLE(g_pszPath), NULL));
        V(pGraphBuilder->AddFilter(pBaseFilter, NULL));
        CComPtr<IEnumPins> pEnumPins;
        V(pBaseFilter->EnumPins(&pEnumPins));
        CComPtr<IPin> pPin;
        ATLVERIFY(pEnumPins->Next(1, &pPin, NULL) == S_OK);
        V(pGraphBuilder->Render(pPin));
        CComQIPtr<IMediaControl> pMediaControl = pGraphBuilder;
        CComQIPtr<IMediaEvent> pMediaEvent = pGraphBuilder;
        ATLASSERT(pMediaControl && pMediaEvent);
        V(pMediaControl->Run());
        LONG nEventCode = 0;
        V(pMediaEvent->WaitForCompletion(INFINITE, &nEventCode));
    }
    CoUninitialize();
    return 0;
}

如果您正在播放自己的文件,您肯定不会包含大的 ID3 标记部分,the code might be twice as short .

关于winapi - Windows 中简单的 .wav 或 .mp3 播放 - 它去哪儿了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12878812/

相关文章:

winapi - WindowsFromDc 返回 null

python - 按时间戳分解 .wav 文件

http - 从 mp3/ogg 中删除精确的时间范围

audio - MP3 存储库距离引用它的帧最远是多少?

winapi - 地穴导出 key : how to export private key from PKCS#12 store?

c++ - 如何获取给定监视器上存在的所有窗口的 HWND?

audio - 如何更改SoX的录制音频设备?

iOS - 无法播放音频文件

c - 是否可以应用抗锯齿/其他功能来更好地绘制拉伸(stretch)的 TIcon?

在本地播放 mp3 时,Android MediaPlayer 错误(1,-2147483648)