C++ Windows 8将流传递给MFSourceReader
我正在尝试制作一个程序,可以从用户的音乐库中获取.mp3文件,并使用Windows Media Foundation的C++ Windows 8将流传递给MFSourceReader,c++,audio,windows-8,windows-runtime,ms-media-foundation,C++,Audio,Windows 8,Windows Runtime,Ms Media Foundation,我正在尝试制作一个程序,可以从用户的音乐库中获取.mp3文件,并使用Windows Media Foundation的IMFSourceReader将其转换为一个包含PCM值的数组,用于一些激动人心的DSP操作。然而,我有问题 我的解决方案有两个项目;一个包含用户代码和C++库的C/X/XAML,其中包含一些用于处理媒体基础和XDeOdio加上一些代码>公共REF 类的本地代码。 我无法使用MFCreateSourceReaderFromURL,因为它返回一个拒绝访问的HRESULT,即使您在应
IMFSourceReader
将其转换为一个包含PCM值的数组,用于一些激动人心的DSP操作。然而,我有问题
我的解决方案有两个项目;一个包含用户代码和C++库的C/X/XAML,其中包含一些用于处理媒体基础和XDeOdio加上一些代码>公共REF 类的本地代码。
我无法使用MFCreateSourceReaderFromURL
,因为它返回一个拒绝访问的HRESULT,即使您在应用程序清单中具有音乐库功能。因此,看起来我必须使用MFCreateSourceReaderFrombyTestStream
或MFCreateSourceReaderFromMediaSource
。现在,使用Windows.Storage.KnownFolders.MusicLibrary
访问音乐文件非常简单,可以获得流
或IInputStream
以及一些其他流类型,但如何将其转换为IMFByteStream
或IMFMediaSource
或以某种方式将mp3解码为字节数组使用PCM值
我还考虑了在App文件夹中重放音乐文件,这样我就可以使用<代码> MFCCRATESULADEADADEFROMURL ,或者可以直接绕过媒体基础工作,使用诸如“代码> Windows .Media.T转译< /Cord>”这样的转换来转换为PCM。我不确定这就是代码转换名称空间的用途
<>我花了好几个小时阅读了媒体基础文档,我在代码> MFCurtEnffEythRealon流<代码>中发现了一丝希望,它可以将COM的代码> iStRAM转换成字节流,但我需要找到/编写一个包装器来将M.NET流转换成istRAM。在我开始这项任务之前,我只想确定我走的方向是正确的,还是有更好的方法提前谢谢。如果我犯了一个愚蠢的错误或错过了使用这些库的一些关键方面,也要提前道歉。好的,各位,我知道你们都在大声回答这个问题,但经过两天的头颅刮伤,我找到了解决办法。您可以将
Windows::Storage::Streams::irandomaccesstream^
对象通过强制转换为(IUnknown*)
将其传递给MFCreateMFByteStreamOnStreamEx
(),如下所示:
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);
ComPtr spMFByteStream=nullptr;
MFCreateMfByTestStreamOnStreamex((IUnknown*)流句柄和SPMFByTestStream);
//请记住添加您自己的HRESULT错误处理代码
ComPtr_sourceReader=nullptr;
MFCreateSourceReaderFrombyTestStream(spmfbyTestStream.Get(),nullptr,&_sourceReader);
streamHandle
是要提供给源读取器的IRandomAcessStream^
。
是时候干杯了。如果你能用它制作一个组件(无论是否有许可证),我很感兴趣。我不知道有任何组件可以在WinRT下将MP4、WMA或M4A音频文件转码到PCM。不幸的是,Windows 8不支持将音频文件录制为PCM。对于那些希望使用COM
IStream
接口包装托管流的人来说,迟到是对原始答案的补充 从我所读到的内容来看,我非常确定您可以使用Media Foundation录制到PCM:。这里的第一个代码示例获取一个IMFMediaSource
,您可以从中使用MFCreateSourceReaderFromMediaSource
创建一个SourceReader。一旦有了SourceReader,您就可以像这样获得PCM数据。至少可以说,我发现要让所有这些工作顺利进行是很棘手的;但是有很多COM电话。