使用 IMFSourceReader (Microsoft Media Foundation) 的音频流

audio streaming with IMFSourceReader (Microsoft Media Foundation)

我使用 MFCreateSourceReaderFromByteStream 创建一个带有自定义 IMFByteStream 的 IMFSourceReader,从远程 HTTP 源获取数据。

当源是 m4a 文件时,一切正常。然而,当源是 mp3 时,函数 MFCreateSourceReaderFromByteStream 不会 return 直到整个文件被下载。关于如何避免这种行为并在下载结束前开始解码音频的任何想法?

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

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

此 mediafoundation 源仅管理 mp1/mp2 音频文件,并执行 decoding.This 不是 mp3,但一旦有有效的音频 mpeg header,它就会提供字节流,并且执行没有阅读完整文件(你可以相信我......)。

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

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