добавление задержки в аудиопоток прямой трансляции в ffmpeg - PullRequest
0 голосов
/ 18 апреля 2020

Я сейчас снимаю видео с помощью карты колоды Blackmagi c на macOS. Мои аудио и видео не синхронизированы c. Звук впереди примерно на секунду. Я подозреваю, что видео медленнее из-за задержки кодирования. Мое решение состоит в том, чтобы замедлить звук с помощью фильтра flaymdeg adelay. Первоначально я добавил -af "adelay = 1000 | 1000" к моей команде, чтобы задержать звук на 1000 мс, но я обнаружил, что этот аудио фильтр ничего не делал. Следовательно, я пытался построить complex_filter, но это не удалось. Моя команда выдает слишком много потоков, поэтому ffmpeg не может направить их к соответствующей конечной точке rtp. Итак, каков наилучший способ задержки аудио и можно ли выбрать, какие потоки отображаются на конечные точки rtp?

ffmpeg \
-format_code 23ps \
-f decklink \
-i "DeckLink HD Extreme 3" \
-filter_complex "[0:a] adelay=2s|2s [delayed]" \
-map [delayed] -map 0:v \
-r 24 \
-g 1 \
-s 1920x1080 \
-quality realtime \
-speed 8 \
-threads 8 \
-row-mt 1 \
-tile-columns 2 \
-frame-parallel 1 \
-qmin 30 \
-qmax 35 \
-b:v 2000k \
-pix_fmt yuv420p \
-c:v libvpx-vp9 \
-strict experimental \
-an -f rtp rtp://myurl.com:5004?pkt_size=1300 \
-c:a libopus \
-b:a 128k \
-vn -f rtp rtp://myurl.com:5002?pkt_size=1300

добавление полного журнала при выполнении команды без какой-либо задержки:

-filter_complex "[0:a] adelay=2s|2s [delayed]" \
-map [delayed] -map 0:v \

ffmpeg version N-97362-g889ad93c88 Copyright (c) 2000-2020 the FFmpeg developers
  built with Apple LLVM version 9.0.0 (clang-900.0.39.2)
  configuration: --prefix=/usr/local --pkg-config-flags=--static --extra-cflags='-fno-stack-check -I/Users/admin/Documents/ffmpeg_build/include -I/Users/admin/Documents/BDS/Mac/include' --extra-ldflags=-L/Users/admin/Documents/ffmpeg_build/lib --extra-libs='-lpthread -lm' --bindir=/Users/admin/Documents/ffmpeg_build/bin --enable-gpl --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-nonfree --enable-decklink
  libavutil      56. 42.102 / 56. 42.102
  libavcodec     58. 80.100 / 58. 80.100
  libavformat    58. 42.100 / 58. 42.100
  libavdevice    58.  9.103 / 58.  9.103
  libavfilter     7. 77.101 /  7. 77.101
  libswscale      5.  6.101 /  5.  6.101
  libswresample   3.  6.100 /  3.  6.100
  libpostproc    55.  6.100 / 55.  6.100
[decklink @ 0x7fcfb2000000] Found Decklink mode 1920 x 1080 with rate 23.98
[decklink @ 0x7fcfb2000000] Frame received (#2) - No input signal detected - Frames dropped 1
Guessed Channel Layout for Input Stream #0.0 : stereo
Input #0, decklink, from 'DeckLink HD Extreme 3':
  Duration: N/A, start: 0.000000, bitrate: 797002 kb/s
    Stream #0:0: Audio: pcm_s16le, 48000 Hz, stereo, s16, 1536 kb/s
    Stream #0:1: Video: rawvideo (UYVY / 0x59565955), uyvy422(progressive), 1920x1080, 795466 kb/s, 23.98 tbr, 1000k tbn, 1000k tbc
[decklink @ 0x7fcfb2000000] Frame received (#3) - Input returned - Frames dropped 2
Stream mapping:
  Stream #0:1 -> #0:0 (rawvideo (native) -> vp9 (libvpx-vp9))
  Stream #0:0 -> #1:0 (pcm_s16le (native) -> opus (libopus))
Press [q] to stop, [?] for help
[libvpx-vp9 @ 0x7fcfb180d200] v1.8.2
Output #0, rtp, to 'rtp://myurl.com.com:5004?pkt_size=1300':
  Metadata:
    encoder         : Lavf58.42.100
    Stream #0:0: Video: vp9 (libvpx-vp9), yuv420p, 1920x1080, q=30-35, 2000 kb/s, 24 fps, 90k tbn, 24 tbc
    Metadata:
      encoder         : Lavc58.80.100 libvpx-vp9
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
Output #1, rtp, to 'rtp://myrul.com:5002?pkt_size=1300':
  Metadata:
    encoder         : Lavf58.42.100
    Stream #1:0: Audio: opus (libopus), 48000 Hz, stereo, s16, 128 kb/s
    Metadata:
      encoder         : Lavc58.80.100 libopus
SDP:
v=0
o=- 0 0 IN IP4 127.0.0.1
s=No Name
t=0 0
a=tool:libavformat 58.42.100
m=video 5004 RTP/AVP 96
c=IN IP4 54.183.58.143
b=AS:2000
a=rtpmap:96 VP9/90000
m=audio 5002 RTP/AVP 97
c=IN IP4 54.183.58.143
b=AS:128
a=rtpmap:97 opus/48000/2
a=fmtp:97 sprop-stereo=1

frame=  434 fps= 24 q=0.0 size=   37063kB time=00:00:18.09 bitrate=16780.7kbits/s speed=1.01x   

1 Ответ

1 голос
/ 19 апреля 2020

Параметр -map является позиционным и относится к первому выходному URL-адресу сразу после него. Таким образом, задержанное аудио должно отображаться после первого вывода и перед вторым выходным URL.

ffmpeg \
-format_code 23ps \
-f decklink \
-i "DeckLink HD Extreme 3" \
-filter_complex "[0:a] adelay=2s|2s [delayed]" \
-map 0:v \
-r 24 \
-g 1 \
-s 1920x1080 \
-quality realtime \
-speed 8 \
-threads 8 \
-row-mt 1 \
-tile-columns 2 \
-frame-parallel 1 \
-qmin 30 \
-qmax 35 \
-b:v 2000k \
-pix_fmt yuv420p \
-c:v libvpx-vp9 \
-strict experimental \
-an -f rtp rtp://myurl.com:5004?pkt_size=1300 \
-map [delayed]
-c:a libopus \
-b:a 128k \
-vn -f rtp rtp://myurl.com:5002?pkt_size=1300
...