Есть ли какой-нибудь способ чередовать несколько циклов видеопотоков с помощью ffmpeg?

#ffmpeg #video-processing

#ffmpeg #обработка видео

Вопрос:

Есть ли какой-нибудь способ, которым я мог бы взять, скажем, 4 видеопотока в реальном времени и заставить их циклически вращаться на экране? Я хочу взять видеопоток и воспроизвести, подождать 5 секунд, перейти к следующему видеопотоку, подождать 5 секунд и т.д…Ниже приведена фактическая ffmpeg команда, которую я хочу использовать, и единственная идея, которая у меня пока есть:

 for rotation in $source4 $source5 $source6 $source7; do
    ffmpeg -rtsp_transport tcp -stimeout 100 -i $source1
           -rtsp_transport tcp -stimeout 100 -i $source2
           -rtsp_transport tcp -stimeout 100 -i $source3
           -rtsp_transport tcp -stimeout 100 -i $rotation
           -filter_complex "nullsrc=size=3840x2160 [base];
           [0:v] setpts=PTS-STARTPTS [upperleft];
           [1:v] setpts=PTS-STARTPTS [upperright];
           [2:v] setpts=PTS-STARTPTS [lowerleft];
           [3:v] setpts=PTS-STARTPTS [lowerright];
           [base][upperleft] overlay=shortest=1 [tmp1];
           [tmp1][upperright] overlay=shortest=1:x=1920 [tmp2];
           [tmp2][lowerleft] overlay=shortest=1:y=1080 [tmp3];
           [tmp3][lowerright] overlay=shortest=1:x=1920:y=1080"
           -c:v h264_nvenc -preset llhq -f matroska - | ffplay -
           sleep 5
    done
  

Как вы можете видеть, это было бы не очень эффективно или даже полезно, учитывая, сколько времени требуется, чтобы все заработало. Если у кого-нибудь есть какие-либо идеи, я был бы признателен. Я свободно владею только сценариями оболочки Linux (Bash), поэтому в настоящее время любой другой язык будет вне моей досягаемости. Я демонстративно открыт для предложений попробовать другие инструменты или фреймворки. Основная цель — создать сценарий для группы камер безопасности с одной в мозаике, которая вращается по всем дополнительным каналам с камер, которые не включают 3 уже на экране. Он должен быть как можно более простым в обслуживании, т.Е. При сбое сетевого соединения он должен автоматически продолжать проверять наличие подключения и перезапускаться при установлении. Я могу сделать это в скрипте Bash очень легко, но вывести все видео на экран было непросто. Я рассматривал возможность создания полностью отдельных вызовов ffplay для каждого канала, а затем использования wmctrl или аналогичного для их размещения на экране, но у меня все еще остается проблема постоянного перезапуска вращающегося канала.

Ответ №1:

Бесконечный цикл:

 #!/bin/bash
INP=("input 1.mp4" test01.mkv test02.mkv test03.mkv)
while true; do
  for i in "${INP[@]}"; do
    ffmpeg -i "$i" -c:v h264_nvenc -t 5 -f matroska - | ffplay -autoexit -
  done
done
  

Может быть, лучший способ — запускать каждый ввод отдельно и играть с wmctrl