如何解释 FFMPEG 实时流编码的节奏差异?

如何解释 FFMPEG 实时流编码的节奏差异?

背景: 我正在使用 FFMPEG 将音频和视频流合并为网络上的 MPEGTS 流。视频来自树莓派摄像头的 h264 编码,音频来自声卡通过本地 TCP 流的 ogg vorbis 编码。单个 FFMPEG 进程负责将音频编码为 AAC 并合并音频/视频。

命令

raspivid --nopreview --ev 10 -ih -t 0 -rot 180 -w 720 -h 480 -fps 30 -b $BITRATE -g $KEYFRAME_PERIOD -pf baseline -o - | ffmpeg -r 30 -i - -i tcp://127.0.0.1:3000 -vcodec copy -acodec libfdk_aac -b:a 64k -ac 2 -filter:a "atempo=0.9945" -f mpegts tcp://192.168.42.2:6000

问题: 我遇到了音频和视频随着时间的推移不同步的问题。我通过自己调整声卡驱动程序解决了最初的时间差异,但随着时间的推移,流仍然会非常缓慢地失去同步:音频播放速度比视频稍快。让它继续运行最终会导致播放缓冲重新采样音频,从而导致视频延迟增加。

这种节奏偏移的原因可能是声卡的时钟与树莓派的时钟略有不同。我设法使用阿滕波音频滤波器。但是,考虑到这可能要运行数小时到数天,这是不够的,因为晶体时钟速度会有所不同。

问题: 考虑到音频是以音频流的形式传入的,我想知道是否有办法自动调整节奏以保持缓冲音频采样时间恒定? 让 FFMPEG 保持稳定的音频流,保持X缓冲区始终有 100 秒,如果缓冲区满了,播放速度就会变慢。节奏是这里的关键:如果不改变节奏,音频和视频组合时播放时就会出现问题。

我无法使用标准同步方法,因为 h264 流没有时间戳,而 ogg 流时间戳有节奏问题。

如能提供任何有助于解决此问题的提示,我们将不胜感激。

相关内容