使用,我尝试从图像帧创建一个视频(H.264/AAC),并在不同的地方添加一个由声音效果组成的音频轨道。音效之间会有音流之间的间隙。我正在使用配置有音频和视频流的IMFSinkWriter (详见下文)。我目前正在测试的只是一个单一的声音效果放在2秒的视频。MP4文件无错误地呈现,并在Windows下正确播放(声音效果在正确的位置播放)(通过或“影视”)。然而,当我在MacOS (QuickTime)下播放视频时,音频没有被正确同步。声音效应的发生比预期的要早得多。
详细信息
我的SinkWriter配置了一个视频流、输出子类型MFVideoFormat_H264和输入子类型MFVideoFormat_RGB32。音频流被配置为输出子类型MFAudioFormat_AAC和输入子类型MFAudioFormat_PCM (匹配提供音频示例的IMFSourceReader )。
我先写所有的视频帧,然后写音频样本。在写音频时,我使用SendStreamTick (每0.5秒),当音频中存在空白时,无论是在声音效果之前还是之后。我还在第一个音频示例上设置了MFSampleExtension_Discontinuity。我还试着在声音效果之后发送NotifyEndOfSegment,但这似乎没有什么区别。
我不写样例描述框,因为我相信它是自动生成的我的配置。
任何帮助都将不胜感激。谢谢!
发布于 2016-09-21 09:58:41
MP4文件无错误地呈现,并在Windows下正确播放(声音效果在正确的位置播放)(通过或“影视”)。然而,当我在MacOS (QuickTime)下播放视频时,音频没有被正确同步。声音效应的发生比预期的要早得多。
不同的玩家处理音轨间隙的方式不同,而且他们经常无法保持音轨之间的良好同步。更令人困惑的是,他们以不同的方式做到了这一点:一些人在保持同步的同时跳过了间隙,另一些人则一直在顺利地演奏“大师”曲目,而忽略了另一首曲目上的差距。
也就是说,即使一个文件是用正确的数据时间创建的,它也可能会发生,而且确实会发生玩家玩不好的情况。
在所有播放器上产生良好播放的文件的最佳策略是避免视频和音频音轨数据中的空白。对于音频,编码人工沉默是一个很好的解决方案。
发布于 2016-09-21 04:18:31
我想出了一个很好的解决方案。我的解决方案是将静默(零)写入音频流,而不是使用SetStreamTick。
https://stackoverflow.com/questions/39604819
复制相似问题