2016-09-20 96 views
2

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

详细

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

我先写所有的视频帧,然后写出音频采样。在写音频时,如果在音效之前和之后都存在音频间隙,我会使用SendStreamTick(每0.5秒)。我还在第一个音频样本上设置了MFSampleExtension_Discontinuity。声音效果后我也尝试发送NotifyEndOfSegment,但这似乎没有什么区别。

我不写样本描述框,因为我相信它是为我的配置自动生成的。

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

+0

在合适的视频编辑器中打开并检查视频和音频轨道的时间。可能是你有更多的帧比同步音轨。同时检查帧持续时间。 –

回答

2

MP4文件渲染,没有错误,并且在Windows下可以正常播放(声音效果发挥在正确的位置)(通过Windows Media Player或“电影&电视”)。但是,当我在MacOS(QuickTime)下播放视频时,音频无法正确同步。声音效果比预期的要早得多。

不同的播放器处理轨道间隔的方式不同,很多时候它们无法保持轨道之间的良好同步。更令人困惑的是,他们以不同的方式做到了这一点:一些人在保持同步的同时跳过空白,另一些人则顺利地播放“主”乐曲,同时忽略另一首乐曲的差距。

也就是说,即使一个文件是用正确的数据定时创建的,它也可能发生,并且确实发生了玩家未能发挥出色的情况。

生成适合所有玩家的文件的最佳策略是避免视频和音频轨道数据中的空白。对于音频,编码人工静音是一个很好的解决方案。

1

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

+0

+1解决自己的问题。关于_“输入子类型'MFAudioFormat_PCM'”_你应该快速阅读PCM和采样如何工作。预期的解决方案是在PCM数据中写入具有零值的采样(填充)。你说对了!!现在唯一的奥秘是“在Windows下(通过W.M.Player)正确播放......”,微软真的很好吗? –

+0

谢谢@ VC.One!似乎MS球员处理流勾号的方式与其他球员不同(如@罗曼的回答中所述)。再次感谢! – Avidd