c - 使用 Microsoft Media Foundation 从非文件源解码音频

标签 c audio decoding ms-media-foundation

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

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

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

因为我想遵循教程并尽可能少地进行更改,所以我认为我只需要更改创建源阅读器的方式,其余过程将是相同的。我查看了其他 SourceReader availableMFCreateSourceReaderFromByteStream听起来很适合我的目的。

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

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

Image describing what a Source Reader is

这张图片显示了源阅读器中的媒体源仅指向源文件,这是真正的限制还是简单的示例?

我用普通的 c 语言编写此内容,但指向 c++ 文档或示例很好,因为将 c++ 翻译为 c 通常非常简单,而且似乎没有 c 的文档。

编辑: 我添加了一张关于我获得的数据类型的图像,红色区域是我在下面的评论中引用的数据 block Sourceenter image description here

最佳答案

非文件来源不是准确的描述。它有文件结构,但不是文件吗?结构不同?原始流?

如果您使用源阅读器查看示例,它们会假设存在并使用能够将传入流解析为具有已知类型和属性的基本流的流处理程序。然后您或媒体基金会可以应用解码器或以其他方式转换数据。

当您指定数据“以 block 的形式”出现时,您很可能对使用 AAC Decoder 的替代选项感兴趣。明确地。您可以创建它的一个实例,初始化输入和输出类型,然后向其提供压缩音频并在输出上拉出解码后的 PCM。解码器有MFT界面。

关于c - 使用 Microsoft Media Foundation 从非文件源解码音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41874941/

相关文章:

swift - 如何在 Swift 中制作解码泛型函数

c - 如何在库代码中分配和维护内存?

c - INT_MIN 及其正等价物大小相同

c - 段错误(转储核心)

android - Android上的音频文件的ListView

java - Scala:使用 circe.io 解码 Any[] 数组

c - 强制使用 ANSI 编辑控件而不是 comctl32 编辑控件

c# - SoundPlayer.Stop 不会停止声音播放

node.js - 如何在HTML5中通过客户端扬声器播放实时二进制流

python - 如何解决这个奇怪的Python编码问题?