使用 IMFSourceReader 进行音频流式传输(Microsoft Media Foundation)

Posted

技术标签:

【中文标题】使用 IMFSourceReader 进行音频流式传输(Microsoft Media Foundation)【英文标题】:audio streaming with IMFSourceReader (Microsoft Media Foundation) 【发布时间】:2020-01-10 10:15:06 【问题描述】:

我使用 MFCreateSourceReaderFromByteStream 创建一个 IMFSourceReader,其中包含一个自定义 IMFByteStream 从远程 HTTP 源获取数据。

当源是 m4a 文件时,一切都按预期工作。但是,当源是 mp3 时,函数 MFCreateSourceReaderFromByteStream 直到整个文件下载后才会返回。关于如何避免这种行为并在下载结束之前开始解码音频的任何想法?

【问题讨论】:

【参考方案1】:

假设您使用默认的 mediafoundation 源,这可能是 MP3 文件源和 MPEG-4 文件源的默认行为。

要确认这一点,您可以尝试使用自定义音频 mpeg 文件源,例如我实现的这个:MFSrMpeg12Decoder

这个 mediafoundation 源只管理 mp1/mp2 音频文件,并执行解码。这不是 mp3,但是一旦有有效的音频 mpeg 头,它就会提供字节流,并且不会读取完整文件(你可以相信我。 ..)。

这将确认默认 MP3 文件源需要在提供字节流之前读取完整文件。

一个可能的答案是 MP3 文件源读取整个文件以查看是否存在可变比特率,从而提供文件的正确持续时间 (MF_PD_DURATION)。 对于 m4a 音频文件,持续时间由 moov atom 提供,因此无需读取完整文件。

【讨论】:

确实如此。我对各种音频文件进行了测试。可变比特率 mp3 需要完全下载。恒定比特率 mp3 没有。

以上是关于使用 IMFSourceReader 进行音频流式传输(Microsoft Media Foundation)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Media Foundation 从 IMFSourceReader 播放音频缓冲区

使用Nearby Connections API进行音频流式传输

试图通过 TCP 流式传输 2 路音频?

是否可以从 USB 摄像头流式传输视频和从移动麦克风传输音频以在 android 中进行 RTMP 流式传输

流式传输音频文件并缓存它

Objective-C 流式上传音频