我使用FFmpeg对通过DeckLink捕获卡捕获的实时视频进行编码.卡上的视频有一个音频流,但我想用另一个音频流来代替。此另一个音频流来自同一源,但通过添加固定延迟的音频处理器运行。音频通过虚拟声卡( IP上的音频,但在Windows上看起来像声卡)反馈到运行FFmpeg的pc中。
我知道如何补偿这个固定的延迟,但问题是音频和视频在流运行时缓慢地偏离同步。我假设这是由于虚拟声卡和DeckLink卡之间时钟速度的微小差异所致。
我尝试了vsync选项和FFmpeg中的高级过滤器,试图使音频和视频保持同步。但是我还没有成功。是否有办法使FFmpeg重采样音频和/或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"发布于 2020-01-28 08:58:04
我发现解决方案是为音频和视频流(这里的文件)使用-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"几天后,这两个流仍保持同步。
https://stackoverflow.com/questions/59767925
复制相似问题