MP4文件中实现音视频(A/V)同步的标准技术方案是什么?
MP4音视频同步实现困惑
我正在使用一款仅含头文件的小型MP4库(minimp4)写入包含AAC音频和HVEC视频流的MP4文件,并通过FFmpeg/ffplay/ffprobe进行检查和播放,但对MP4中的解码时间戳(DTS)、显示时间戳(PTS)、合成时间(CTTS)等概念,以及如何利用它们实现音视频同步感到困惑。
尝试过的解决方法与问题
- 最初按样本到达顺序写入所有音视频样本,使用预期时长作为样本时长,结果出现视频样本先于音频样本到达时,音频超前于视频的同步问题。
- 尝试手动设置库写入的“timestamp”参数并使用实际计算的时长,但在非分片模式下此方法无效,且该参数会被写入为解码时间戳(
tfdt)而非显示时间戳,这种方式并不恰当。 - 修改写入函数,丢弃任何早于另一路媒体就绪时间的音视频样本,目前效果良好,但不确定能否长期抵御时间偏移。
查看FFmpeg源码的发现
查看FFmpeg源码时发现,至少ffprobe会在某些情况下将解码时间戳当作显示时间戳使用,相关代码如下:
int64_t pts = pkt->pts != AV_NOPTS_VALUE ? pkt->pts : pkt->dts;
目前我也无法找到有效pkt->pts的来源,这似乎是预期情况。
关于CTTS的疑问
通过搜索了解到CTTS表/合成时间戳,但它似乎更多用于帧重排序(由于我使用的全是I帧视频,无需担心此问题)。
核心困惑
我现在对MP4文件中音视频同步的标准技术方案,或是最通用、兼容性最好的实现方式感到困惑。
内容的提问来源于stack exchange,提问作者Douglas B
相关产品推荐
相关产品推荐

