使用 Microsoft Media Foundation 解码来自非文件源的音频

Decoding audio from non-file source with Microsoft Media Foundation

我的问题基本上是我是这个框架的新手,我正在寻找如何使用媒体基础中的非文件源的指针,因为前面的文档似乎缺乏在我的脑海里。下面是一些关于我在做什么以及我现在正在使用什么方法的信息,但我不知道这是否是使用该框架的正确方法。

我目前正在尝试使用 Microsoft Media Foundation 来解码我通过蓝牙获得的音频,然后将其作为 PCM 音频发送。在查看 ms media foundation 的文档时,似乎几乎所有示例都假定源是一个文件。

查看 tutorial for decoding audio 例如他们使用 MFCreateSourceReaderFromURL,我不能使用它,因为我的源不是文件。

因为我想遵循教程并尽可能少地进行更改,所以我认为我只需要更改创建源代码的方式 reader,其余过程将相同。我查看了其他 SourceReaders available and MFCreateSourceReaderFromByteStream 听起来很适合我的目的。

我是否有可能只需要创建一个字节流并不断地用我通过无线方式获得的数据填充它,而 MFCreateSourceReaderFromByteStream 创建的媒体源可以很好地处理这个问题?或者我是否需要创建一个自定义媒体源并在 API 的下部做更多的手动工作才能使这样的东西起作用?

或者当源不是文件时,源 reader 可能是完全错误的方法?在关于来源的主页 Reader here 他们有下面的图片:

并且此图片显示源中的媒体源 reader 仅指向源文件,这是真正的限制还是简单的例子?

我是用普通的 c 写的,但是指向 c++ 文档或示例很好,因为将 c++ 转换为 c 通常非常简单,而且似乎没有 c 的文档。

编辑: 我添加了一张关于我得到什么样的数据的图像,红色区域是我在下面的评论中提到的数据块 Source

Non-file 来源描述不准确。它有文件结构,只是没有文件吗?结构不同?原始流?

如果您查看来源为 reader 的样本,它们会假定流处理程序的存在和使用能够将传入流解析为具有已知类型和属性的基本流。然后您或 Media Foundation 可以应用解码器或以其他方式转换数据。

由于您指定数据来自 "in chunks",很可能您对使用 AAC Decoder explicitly. You can create an instance of it, initialize input and output types, then feed it with compressed audio and pull decoded PCM on the output. The decoder has MFT 界面的替代选项感兴趣。