我试图制作一个程序,可以从用户的音乐库中提取一个mp3文件,并使用Windows Media Foundation的 "转换 "功能将其转换。IMFSourceReader
到一个包含PCM值的数组中,以便进行一些令人兴奋的DSP操作。然而,我遇到了问题。
我的解决方案有两个项目,一个是C#XAML项目,包含UI代码,另一个是C++库,包含一些用于Media Foundation和XAudio2的原生代码,再加上一些 public ref
类,C#代码可以与之交互。
我不能使用 MFCreateSourceReaderFromURL
因为它返回一个访问被拒绝的HRESULT,即使你有音乐库功能的应用程序清单。所以,看来我必须使用以下两种方法之一 MFCreateSourceReaderFromByteStream
或 MFCreateSourceReaderFromMediaSource
. 现在,它很容易访问的音乐文件,使用 Windows.Storage.KnownFolders.MusicLibrary
并获得 Stream
或 IInputStream
以及其他一些流类型,但我如何能将其转换为一个 IMFByteStream
或 IMFMediaSource
或只是以某种方式解码的MP3到一个字节数组与PCM值?
我也曾想过将音乐文件重新保存在应用程序文件夹中,这样我就可以使用 MFCreateSourceReaderFromURL
或者也许可以不直接与媒体基金会合作,而使用类似于 Windows.Media.Transcoding
来进行PCM的转换。我不确定这是否是Transcoding命名空间的目的。
我花了好几个小时阅读媒体基金会的文档,我发现了一丝希望。MFCreateMFByteStreamOnStream
它可以从COM的 IStream
到一个字节流,但我需要写一个包装器来将我的.net流转换为一个IStream。在我开始这个任务之前,我只是想确保我的方向是正确的,或者有更好的方法来完成这个任务?
先谢谢你。如果我犯了一个愚蠢的错误,或者错过了使用这些库的一些关键方面,也要提前道歉。
大家好,我知道你们都在吵着要回答这个问题,但经过2天的头疼,我已经找到了一个解决方案。你可以通过一个 Windows::Storage::Streams::IRandomAccessStream^
反对 MFCreateMFByteStreamOnStreamEx
( http:/msdn.microsoft.comen-uslibrarywindowsdesktophh162754(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^
你想给源码阅读器的。下面是一个运行它的代码示例
是时候吃点吐司了。
如果你能做一个组件出来(授权或没有),我会感兴趣。我不知道任何组件,可以转码MP4,WMA或M4A音频文件到PCM的WinRT。不幸的是,Windows 8不支持录制音频文件为PCM。
姗姗来迟,补充一下原来的答案,对于那些想走用COM封装托管流的路线的人来说,我的回答是 IStream
介面。这里有一个很好的实现.