媒体基础 - 创建 MP4 时出现跨平台音频同步问题

Media Foundation - cross platform audio sync issue when creating MP4

我正在尝试使用 MS Media Foundation 从图像帧创建视频 (H.264/AAC),并在不同位置添加由音效组成的音轨。音效之间的音频流中会有间隙。我正在使用配置有音频和视频流的 IMFSinkWriter(详情如下)。我目前正在测试在视频中放置 2 秒的单一音效。 MP4 文件呈现无误,并在 Windows 下正确播放(音效在正确的位置播放)(通过 Windows 媒体播放器或 "Movies & TV")。但是,当我在 MacOS (QuickTime) 下播放视频时,音频没有正确同步。音效出现的时间比预期的要早得多。

详情

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

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

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

如有任何帮助,我们将不胜感激。谢谢!

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

The MP4 file renders without error, and plays correctly (sound effect plays at correct location) under Windows (via Windows Media Player or "Movies & TV"). However, when I play the video under MacOS (QuickTime), the audio is not synced correctly. The sound effect occurs much earlier than expected.

不同的玩家处理曲目间隙的方式不同,而且他们常常无法在曲目之间保持良好的同步。更令人困惑的是,他们以不同的方式做到这一点:一些人在保持同步的同时跳过间隙,另一些人继续流畅地播放 "master" 曲目,同时忽略另一首曲目上的间隙。

也就是说,即使创建的文件具有正确的数据时序,也可能会发生这种情况,并且确实会发生播放器无法播放的情况。

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