c++ - 使用IMFSourceReader进行音频流传输(Microsoft Media Foundation)

标签 c++ windows ms-media-foundation

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

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

最佳答案

假设您使用的是默认媒体基础源,那么这可能是MP3文件源和MPEG-4文件源的默认行为。

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

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

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

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

关于c++ - 使用IMFSourceReader进行音频流传输(Microsoft Media Foundation),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59679646/

相关文章:

c++ - UWP,媒体基础,选择特定的编码器

c++ - 这是C++中的错误吗? (本书《 C++入门》可能是错误的?)

c++ - 为什么 C-forkbombs 不像 bash 那样工作?

java - Android SDK 突然停止工作

Windows BAT 或 CMD : send some data to a localhost udp port

c++ - 使用 IMFSourceReaderCallback 检测 USB 摄像头断开连接

c++ - 如何在 Qt 应用程序中获取 MAC 操作系统中驱动器的文件格式?

c++ - 使用 QVariant Maps 在 Qt 5.7 中使用更简单的方法替换 json 格式的字段

windows - 在 Windows 8 上声明每个窗口的高 DPI 感知

c++ - 我还应该合并 IMFMediaBuffer 对象吗?