FFmpeg: замена звука в потоковом видео - PullRequest
0 голосов
/ 16 января 2020

Я использую FFmpeg для кодирования и потокового видео, записанного с помощью карты захвата DeckLink. Видео с карты идет с аудиопотоком, но я хочу заменить аудиопоток другим. Этот другой аудиопоток исходит из того же источника, но проходит через аудиопроцессор, который добавляет фиксированную задержку. Звук подается обратно в p c, который запускает FFmpeg через виртуальную звуковую карту (аудио через IP, но для Windows это похоже на звуковую карту).

Я знаю, как компенсировать это исправленное задержка, но проблема в том, что аудио и видео медленно смещаются из-за несоответствия c во время работы потока. Я предполагаю, что это связано с небольшой разницей в тактовых частотах между виртуальной звуковой картой и картой DeckLink.

Я попробовал опцию vsyn c и фильтр aresample в FFmpeg, пытаясь получить аудио и видео для синхронизации. Однако мне это пока не удалось. Есть ли способ заставить FFmpeg повторно сэмплировать кадры аудио и / или drop / dup, чтобы оба потока оставались синхронизированными c?

В настоящее время я запускаю эту команду, которая не может оставаться в syn c.

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"

1 Ответ

0 голосов
/ 28 января 2020

Я обнаружил, что решение заключается в использовании флага -use_wallclock_as_timestamps 1 как для аудио, так и для видеопотока ( ffmpeg docs здесь ). Полная команда в моем случае становится такой:

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"

Затем через несколько дней оба потока синхронизируются c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...