【问题标题】:Media Foundation - cross platform audio sync issue when creating MP4Media Foundation - 创建 MP4 时的跨平台音频同步问题
【发布时间】:2016-09-20 22:41:04
【问题描述】:

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

详情

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

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

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

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 在合适的视频编辑器中打开并检查视频和音频轨道的时间。可能是您的帧数比同步音轨多。还要检查帧持续时间。

标签: video mp4 ms-media-foundation


【解决方案1】:

MP4 文件呈现无错误,并在 Windows 下(通过 Windows Media Player 或“电影和电视”)正确播放(音效在正确位置播放)。但是,当我在 MacOS (QuickTime) 下播放视频时,音频没有正确同步。音效出现的时间比预期的要早得多。

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

也就是说,即使使用正确的数据时序创建文件,也可能会发生这种情况,并且确实会发生玩家无法很好地播放它的情况。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • +1 用于解决自己的问题。关于 "input subtype MFAudioFormat_PCM" 您应该快速了解 PCM 和采样的工作原理。在 PCM 数据中写入零值样本以实现静音(填充)是预期的解决方案。你说对了!!现在唯一的谜团是“在Windows下(通过W.M.Player)播放正确......”,微软真的那么好吗?
    • 感谢@VC.One!似乎 MS 播放器处理流滴答声的方式与其他播放器不同(如 @Roman 的回答中所述)。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    • 2012-10-06
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    相关资源
    最近更新 更多