FFmpeg:替换实时视频流中的音频

FFmpeg: replacing audio in live video stream

我正在使用 FFmpeg 对通过 DeckLink 采集卡采集的视频进行编码和直播。来自卡的视频带有音频流,但我想用另一个替换音频流。此其他音频流源自同一来源,但 运行 通过添加固定延迟的音频处理器。音频通过虚拟声卡反馈到运行 FFmpeg 的 pc 中(音频通过 IP,但对 Windows 来说它看起来像声卡)。

我知道如何补偿这个固定延迟,但问题是音频和视频在流运行时慢慢地不同步。我假设这是由于虚拟声卡和 DeckLink 卡之间的时钟速度差异很小。

我尝试了 FFmpeg 中的 vsync 选项和 aresample 过滤器,试图让音频和视频保持同步。但是我还没有成功。有没有办法让 FFmpeg 重新采样音频 and/or drop/dup 帧以使两个流保持同步?

目前我是运行这个命令,它无法保持同步。

ffmpeg.exe -f dshow -i audio="WNIP Input  1 (Wheatstone Network Audio (WDM))" -itsoffset 2.3 -f decklink -thread_queue_size 128 -i "DeckLink SDI (3)" -filter_complex "[1:v:0]bwdif,format=yuv420p,setdar=16/9,scale=-1:576:flags=bicubic[vidout];[0:a:0]aresample=min_comp=0.02:comp_duration=15:max_soft_comp=0.005[audioout]" -c:v libx264 -preset slow -crf 25 -maxrate 1200k -bufsize 2400k -map "[vidout]:0" -map "[audioout]:0" -vsync 1 -r 50 -g 90 -keyint_min 90 -sc_threshold 0 -c:a libfdk_aac -b:a 192k -ac 2 -f flv "rtmp://somewhere"

我发现解决方案是对音频和视频流 (ffmpeg docs here) 使用 -use_wallclock_as_timestamps 1 标志。 在我的例子中,完整的命令变成了:

ffmpeg.exe -f dshow -use_wallclock_as_timestamps 1 -i audio="WNIP Input  1 (Wheatstone Network Audio (WDM))" -itsoffset 2.1 -f decklink -thread_queue_size 128  -use_wallclock_as_timestamps 1 -i "DeckLink SDI (3)" -filter_complex "[1:v:0]bwdif,format=yuv420p,setdar=16/9,scale=-1:576:flags=bicubic[vidout];[0:a:0]aresample=min_comp=0.02:comp_duration=15:max_soft_comp=0.005[audioout]" -c:v libx264 -preset slow -crf 25 -maxrate 1200k -bufsize 2400k -map "[vidout]:0" -map "[audioout]:0" -vsync 1 -r 50 -g 90 -keyint_min 90 -sc_threshold 0 -c:a libfdk_aac -b:a 192k -ac 2 -f flv "rtmp://somewhere"

然后几天后两个流仍然同步。