我使用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/