Media Foundation -创建MP4时跨平台音频同步问题



使用MS Media Foundation,我试图从图像帧创建视频(H.264/AAC),并在各个地方添加由声音效果组成的音轨。在声音效果之间的音频流中会有间隙。我使用的是配置了音频和视频流的IMFSinkWriter(详情如下)。我目前正在测试一个单独的声音效果,在视频中放置2秒。在Windows下(通过Windows Media Player或"Movies &"),MP4文件呈现无误,并且播放正确(声音效果在正确位置播放)。电视")。但是,当我在MacOS (QuickTime)下播放视频时,音频无法正确同步。

我的SinkWriter配置一个视频流,输出子类型为MFVideoFormat_H264,输入子类型为MFVideoFormat_RGB32。音频流配置为输出子类型MFAudioFormat_AAC和输入子类型MFAudioFormat_PCM(与提供音频样本的IMFSourceReader匹配)。

我先写所有的视频帧,然后写音频样本。在编写音频时,我使用SendStreamTick(每0.5秒)当音频中有间隙时,无论是在声音效果之前还是之后。我还在第一个音频样本上设置了MFSampleExtension_Discontinuity。我还试着在音效后发送NotifyEndOfSegment,但这似乎没有什么不同。

我没有写一个示例描述框,因为我相信它是为我的配置自动生成的。

任何帮助都会很感激。谢谢!

在Windows(通过Windows Media Player或"Movies &")下,MP4文件呈现无误,并且播放正确(声音效果在正确位置播放)。电视")。但是,当我在MacOS (QuickTime)下播放视频时,音频无法正确同步。

不同的玩家处理音轨间隙的方式不同,所以他们经常无法保持音轨之间的良好同步。更令人困惑的是,他们会以不同的方式做到这一点:有些人在保持同步的同时跳过间隙,有些人则继续流畅地播放"主"音轨,而忽略另一个音轨的间隙。

也就是说,即使一个文件是用正确的数据计时创建的,它也可能发生,并且确实发生了玩家不能很好地播放它。

制作可在所有播放器上播放的文件的最佳策略是避免视频和音频轨道数据的间隙。对于音频,编码人工静音是一个很好的解决方案。

我想出了一个解决方案,似乎工作得很好。我的解决方案是将静音(零)写入音频流,而不是使用SetStreamTick

最新更新