Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Windows 8将流传递给MFSourceReader_C++_Audio_Windows 8_Windows Runtime_Ms Media Foundation - Fatal编程技术网

C++ Windows 8将流传递给MFSourceReader

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,即使您在应

我正在尝试制作一个程序,可以从用户的音乐库中获取.mp3文件,并使用Windows Media Foundation的
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电话。