Ed *_*ers 4 c++ audio windows-8 windows-runtime ms-media-foundation
我正在尝试制作一个程序,该程序可以从用户的音乐库中获取 .mp3 文件,并使用 Windows Media Foundation 将其转换IMFSourceReader为包含 PCM 值的数组,用于一些令人兴奋的 DSP 操作。但是,我遇到了问题。
我的解决方案有两个项目;一个包含 UI 代码的 C#/XAML 和一个 C++ 库,其中包含一些与 Media Foundation 和 XAudio2 一起使用的本机代码以及一些public refC# 代码可以与之交互的类。
我无法使用,MFCreateSourceReaderFromURL因为即使您在应用程序清单中具有音乐库功能,它也会返回 ACCESS DENIED HRESULT。所以看起来我将不得不使用MFCreateSourceReaderFromByteStream或MFCreateSourceReaderFromMediaSource。现在,使用Windows.Storage.KnownFolders.MusicLibraryaStream或 anIInputStream以及其他一些流类型来访问音乐文件很容易,但是如何将其转换为 anIMFByteStream或 anIMFMediaSource或仅以某种方式将 mp3 解码为具有 PCM 值的字节数组?
我还考虑了将音乐文件重新保存在应用程序文件夹中的想法,以便我可以使用,MFCreateSourceReaderFromURL或者可以直接绕过与 Media Foundation 的工作,并使用类似Windows.Media.Transcoding的方法转换为 PCM。我不确定这是 Transcoding 命名空间的用途。
我花了几个小时阅读 Media Foundation 文档,我发现了一丝希望MFCreateMFByteStreamOnStream,可以将 COM 转换IStream为字节流,但我需要找到/编写一个包装器来将我的 .net 流转换为 IStream。在我开始这项任务之前,我只想确保我朝着正确的方向前进,或者有更好的方法来做到这一点?
提前致谢。如果我犯了一个愚蠢的错误或错过了使用这些库的一些关键方面,也提前道歉。
大家好,我知道你们都吵着要回答这个问题,但经过 2 天的头疼我找到了解决方案。您可以通过将Windows::Storage::Streams::IRandomAccessStream^对象强制转换为MFCreateMFByteStreamOnStreamEx(http://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);
Run Code Online (Sandbox Code Playgroud)
随着streamHandle作为IRandomAcessStream^要分给源读取。
这是一个运行它的代码示例
是时候吐司了。