ffmpeg цикл потокового видео вперед и в обратном направлении

#ffmpeg

#ffmpeg

Вопрос:

Я хочу взять входное видео и горизонтально объединить его с самим собой в обратном порядке (воспроизвести его вперед, а затем назад), используя filter_complex . До сих пор я разделил его на 3 команды: реверсирование, объединение и потоковое воспроизведение, но я хочу сделать это одной командой. Следующее передает видео дважды, но я не знаю, как отменить второе видео. Как можно отменить вторую копию видео, не изменяя первую?

 ffmpeg -re -stream_loop -1 -i self_recording.mkv -filter_complex 
    "[0:v]split=2[r1][r2];[0:v][r1][0:v][r2] concat=n=4:v=1[v]" 
    -map "[v]" -f v4l2 /dev/video2
 

Комментарии:

1. Вам нужно будет закодировать видео один раз, когда прямое воспроизведение соединяется с обратным воспроизведением. Затем stream_loop этот результирующий файл.

2. Есть ли способ сделать это в ffmpeg, не дожидаясь, пока видео будет полностью перевернуто и объединено, прежде чем начнется потоковая передача? Например. если требуется потоковое видео продолжительностью 2 минуты, может ли поток начаться немедленно без создания временных файлов? Мой неэффективный способ потоковой передачи вперед и назад можно найти здесь в строках 112, 116 и, наконец, 130, и я хочу заменить его чем-то более эффективным. github.com/intermezzio/webcam-video-effects/blob /…

3. Нет. В этом случае ввод должен быть готов до запуска команды потоковой передачи. Но файл можно подготовить за один шаг с помощью водяных знаков.

4. Какой будет команда для подготовки ввода в одной команде с помощью водяных знаков?

Ответ №1:

Подготовка к видео:

 ffmpeg -i "$video" -i "$watermark" 
       -filter_complex "[0]split=2[fr][rv];[rv]reverse[rv]; 
                        [fr][rv]concat=n=2:v=1:a=0,$memestr,$rotatestr[jt]; 
                        [1][jt]scale2ref[i][m];[m][i]overlay=format=auto,format=yuv420p[v]" 
       -map "[v]" -g 30 stream.mp4
 

Поток:

 ffmpeg -stream_loop -1 -re -i "stream.mp4" -c copy -f v4l2 "/dev/video$output"