4

我正在尝试制作一个程序,该程序可以从用户的音乐库中获取 .mp3 文件,并使用 Windows Media Foundation 将其转换IMFSourceReader为包含 PCM 值的数组,以进行一些令人兴奋的 DSP 操作。但是,我遇到了问题。

我的解决方案有两个项目;一个 C#/XAML 包含 UI 代码和一个 C++ 库,其中包含一些用于使用 Media Foundation 和 XAudio2 的本机代码以及一些public refC# 代码可以与之交互的类。

我无法使用MFCreateSourceReaderFromURL,因为即使您在应用程序清单中具有音乐库功能,它也会返回 ACCESS DENIED HRESULT。所以看起来我将不得不使用MFCreateSourceReaderFromByteStreamor 或MFCreateSourceReaderFromMediaSource. 现在,很容易使用Windows.Storage.KnownFolders.MusicLibrary并获取 aStream或 anIInputStream以及其他一些流类型来访问音乐文件,但是如何将其转换为 anIMFByteStream或 anIMFMediaSource或仅以某种方式将 mp3 解码为具有 PCM 值的字节数组?

我还考虑了将音乐文件重新保存在应用程序文件夹中的想法,以便我可以使用MFCreateSourceReaderFromURL或者可能可以绕过直接使用 Media Foundation 并使用类似Windows.Media.Transcoding转换为 PCM 的方法。我不确定这是 Transcoding 命名空间的用途。

我花了几个小时阅读媒体基金会文档,发现了一线希望,MFCreateMFByteStreamOnStream可以将 COM 转换IStream为字节流,但我需要找到/编写一个包装器来将我的 .net 流转换为 IStream。在我开始这项任务之前,我只想确保我朝着正确的方向前进,或者有更好的方法吗?

提前致谢。如果我犯了一个愚蠢的错误或错过了使用这些库的一些关键方面,也请提前道歉。

4

3 回答 3

5

好的大家,我知道你们都在吵着要回答这个问题,但是经过 2 天的挠头,我找到了解决方案。您可以将Windows::Storage::Streams::IRandomAccessStream^对象传递给MFCreateMFByteStreamOnStreamExhttp://msdn.microsoft.com/en-us/library/windows/desktop/hh162754(v=vs.85).aspx),方法(IUnknown*)是:

ComPtr<IMFByteStream> spMFByteStream = nullptr; 

MFCreateMFByteStreamOnStreamEx((IUnknown*)streamHandle, &spMFByteStream);

//remember to add your own HRESULT error handling code

ComPtr<IMFSourceReader> _sourceReader = nullptr;

MFCreateSourceReaderFromByteStream(spMFByteStream.Get(),nullptr,&_sourceReader);

streamHandle成为IRandomAcessStream^您想要提供给 Source Reader 的东西 。这是一个正在运行的代码示例

是时候吃些吐司了。

于 2012-07-02T11:32:21.380 回答
0

如果你可以用它制作一个组件(许可与否),我会感兴趣。我不知道有任何组件可以在 WinRT 下将 MP4、WMA 或 M4A 音频文件转码为 PCM。不幸的是,Windows 8 不支持将音频文件录制为 PCM。

于 2012-07-13T17:40:37.227 回答
0

晚会,补充原来的答案,对于那些想要采取用 COMIStream接口包装托管流的路线的人来说,这里是一个很好的实现

于 2020-05-05T15:58:55.777 回答