Windows 8将一个流传递给一个MFSourceReader。

问题描述 投票:3回答:3

我试图制作一个程序,可以从用户的音乐库中提取一个mp3文件,并使用Windows Media Foundation的 "转换 "功能将其转换。IMFSourceReader 到一个包含PCM值的数组中,以便进行一些令人兴奋的DSP操作。然而,我遇到了问题。

我的解决方案有两个项目,一个是C#XAML项目,包含UI代码,另一个是C++库,包含一些用于Media Foundation和XAudio2的原生代码,再加上一些 public ref 类,C#代码可以与之交互。

我不能使用 MFCreateSourceReaderFromURL 因为它返回一个访问被拒绝的HRESULT,即使你有音乐库功能的应用程序清单。所以,看来我必须使用以下两种方法之一 MFCreateSourceReaderFromByteStreamMFCreateSourceReaderFromMediaSource. 现在,它很容易访问的音乐文件,使用 Windows.Storage.KnownFolders.MusicLibrary 并获得 StreamIInputStream 以及其他一些流类型,但我如何能将其转换为一个 IMFByteStreamIMFMediaSource 或只是以某种方式解码的MP3到一个字节数组与PCM值?

我也曾想过将音乐文件重新保存在应用程序文件夹中,这样我就可以使用 MFCreateSourceReaderFromURL 或者也许可以不直接与媒体基金会合作,而使用类似于 Windows.Media.Transcoding 来进行PCM的转换。我不确定这是否是Transcoding命名空间的目的。

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

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

c++ audio windows-8 windows-runtime ms-media-foundation
3个回答
5
投票

大家好,我知道你们都在吵着要回答这个问题,但经过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^ 你想给源码阅读器的。下面是一个运行它的代码示例

是时候吃点吐司了。


0
投票

如果你能做一个组件出来(授权或没有),我会感兴趣。我不知道任何组件,可以转码MP4,WMA或M4A音频文件到PCM的WinRT。不幸的是,Windows 8不支持录制音频文件为PCM。


0
投票

姗姗来迟,补充一下原来的答案,对于那些想走用COM封装托管流的路线的人来说,我的回答是 IStream 介面。这里有一个很好的实现.

© www.soinside.com 2019 - 2024. All rights reserved.