FFMPEG: бесконечное повторение нескольких видео

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

Вот команда, которую я сейчас использую:

ffmpeg \
    -re -stream_loop -1 -fflags +genpts -i 01.mp4 \
    -re -stream_loop -1 -fflags +genpts -i 02.mp4 \
    -re -stream_loop -1 -fflags +genpts -i 03.mp4 \
    -re -stream_loop -1 -fflags +genpts -i 04.mp4 \
    -map 0:v -map 0:a \
        -c:a speex -ar 16000 -ac 1 \
        -c:v libx264 -preset ultrafast \
        -b:v 500k -b:a 32k \
        -f flv rtmp://output/01 \
    -map 1:v -map 1:a \
        -c:a speex -ar 16000 -ac 1 \
        -c:v libx264 -preset ultrafast \
        -b:v 500k -b:a 32k \
        -f flv rtmp://output/02 \
    -map 2:v -map 2:a \
        -c:a speex -ar 16000 -ac 1 \
        -c:v libx264 -preset ultrafast \
        -b:v 500k -b:a 32k \
        -f flv rtmp://output/03 \
    -map 3:v -map 3:a \
        -c:a speex -ar 16000 -ac 1 \
        -c:v libx264 -preset ultrafast \
        -b:v 500k -b:a 32k \
        -f flv rtmp://output/04

Эта команда корректно синхронизирует потоки и транслирует все четыре, однако в момент окончания видео прекращается и поток. Из-за -stream_loop -1 я ожидаю, что видео будет бесконечно повторяться. Это вывод stdout, когда поток умирает:

[flv @ 0x2392d40] Failed to update header with correct duration.
[flv @ 0x2392d40] Failed to update header with correct filesize.
[flv @ 0x229b980] Failed to update header with correct duration.
[flv @ 0x229b980] Failed to update header with correct filesize.
[flv @ 0x22f3bc0] Failed to update header with correct duration.
[flv @ 0x22f3bc0] Failed to update header with correct filesize.
[flv @ 0x23a4240] Failed to update header with correct duration.
[flv @ 0x23a4240] Failed to update header with correct filesize.
[libx264 @ 0x25ebd00] frame I:236   Avg QP:29.17  size: 20892
[libx264 @ 0x25ebd00] frame P:5412  Avg QP:32.33  size:  1892
[libx264 @ 0x25ebd00] mb I  I16..4: 100.0%  0.0%  0.0%
[libx264 @ 0x25ebd00] mb P  I16..4:  0.2%  0.0%  0.0%  P16..4: 18.5%  0.0%  0.0%  0.0%  0.0%    skip:81.3%
[libx264 @ 0x25ebd00] final ratefactor: 31.62
[libx264 @ 0x25ebd00] coded y,uvDC,uvAC intra: 68.8% 62.8% 34.6% inter: 8.8% 1.8% 0.0%
[libx264 @ 0x25ebd00] i16 v,h,dc,p: 38% 25% 19% 18%
[libx264 @ 0x25ebd00] i8c dc,h,v,p: 40% 22% 27% 11%
[libx264 @ 0x25ebd00] kb/s:515.11
[libspeex @ 0x2537580] 1 frames left in the queue on closing
[libx264 @ 0x2531d00] frame I:236   Avg QP:31.85  size: 15843
[libx264 @ 0x2531d00] frame P:5412  Avg QP:34.95  size:  2086
[libx264 @ 0x2531d00] mb I  I16..4: 100.0%  0.0%  0.0%
[libx264 @ 0x2531d00] mb P  I16..4:  2.8%  0.0%  0.0%  P16..4: 37.8%  0.0%  0.0%  0.0%  0.0%    skip:59.4%
[libx264 @ 0x2531d00] final ratefactor: 32.38
[libx264 @ 0x2531d00] coded y,uvDC,uvAC intra: 48.4% 40.8% 13.5% inter: 12.1% 4.0% 0.0%
[libx264 @ 0x2531d00] i16 v,h,dc,p: 41% 21% 26% 13%
[libx264 @ 0x2531d00] i8c dc,h,v,p: 48% 20% 24%  8%
[libx264 @ 0x2531d00] kb/s:510.33
[libspeex @ 0x2533080] 1 frames left in the queue on closing
[libx264 @ 0x22da600] frame I:236   Avg QP:26.11  size: 13705
[libx264 @ 0x22da600] frame P:5412  Avg QP:29.17  size:  2185
[libx264 @ 0x22da600] mb I  I16..4: 100.0%  0.0%  0.0%
[libx264 @ 0x22da600] mb P  I16..4:  4.5%  0.0%  0.0%  P16..4: 35.2%  0.0%  0.0%  0.0%  0.0%    skip:60.3%
[libx264 @ 0x22da600] final ratefactor: 28.44
[libx264 @ 0x22da600] coded y,uvDC,uvAC intra: 37.1% 40.1% 10.4% inter: 12.3% 6.2% 0.1%
[libx264 @ 0x22da600] i16 v,h,dc,p: 40% 21% 22% 17%
[libx264 @ 0x22da600] i8c dc,h,v,p: 43% 18% 28% 11%
[libx264 @ 0x22da600] kb/s:511.43
[libspeex @ 0x22db080] 1 frames left in the queue on closing
[libx264 @ 0x22d7a00] frame I:236   Avg QP:30.31  size: 13811
[libx264 @ 0x22d7a00] frame P:5412  Avg QP:33.28  size:  2209
[libx264 @ 0x22d7a00] mb I  I16..4: 100.0%  0.0%  0.0%
[libx264 @ 0x22d7a00] mb P  I16..4:  5.4%  0.0%  0.0%  P16..4: 37.4%  0.0%  0.0%  0.0%  0.0%    skip:57.2%
[libx264 @ 0x22d7a00] final ratefactor: 31.52
[libx264 @ 0x22d7a00] coded y,uvDC,uvAC intra: 37.9% 36.7% 9.5% inter: 11.4% 5.0% 0.1%
[libx264 @ 0x22d7a00] i16 v,h,dc,p: 41% 23% 21% 16%
[libx264 @ 0x22d7a00] i8c dc,h,v,p: 45% 19% 27%  9%
[libx264 @ 0x22d7a00] kb/s:516.78
[libspeex @ 0x22d8d80] 1 frames left in the queue on closing

Моя версия FFMPEG:

$ ffmpeg -version
ffmpeg version N-90065-g8a8d0b3 Copyright (c) 2000-2018 the FFmpeg developers
built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.5) 20160609
configuration: --prefix=/home/sbarnett/ffmpeg_build --pkg-config-flags=--static --extra-cflags=-I/home/sbarnett/ffmpeg_build/include --extra-ldflags=-L/home/sbarnett/ffmpeg_build/lib --extra-libs='-lpthread -lm' --bindir=/home/sbarnett/bin --enable-gpl --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libspeex --enable-nonfree
libavutil      56.  7.101 / 56.  7.101
libavcodec     58. 11.101 / 58. 11.101
libavformat    58.  9.100 / 58.  9.100
libavdevice    58.  1.100 / 58.  1.100
libavfilter     7. 12.100 /  7. 12.100
libswscale      5.  0.101 /  5.  0.101
libswresample   3.  0.101 /  3.  0.101
libpostproc    55.  0.100 / 55.  0.100

Как сделать, чтобы видео зацикливалось бесконечно? Почему -stream_loop -1 не работает?

Обновление (отредактировано с новой ошибкой)

Следуя совету @Gyan, я попытался использовать filter_complex с кинофильтром, однако, возможно, я делаю это неправильно:

ffmpeg \
    -stream_loop -1 \
    -re -i 01.mp4 \
    -re -i 02.mp4 \
    -re -i 03.mp4 \
    -re -i 04.mp4 \
    -filter_complex \
        "movie=01.mp4:loop=0[v1];[v1]setpts=N/FRAME_RATE/TB[v1];
         amovie=01.mp4:loop=0[a1];[a1]asetpts=N/SR/TB[a1];
         movie=02.mp4:loop=0[v2];[v2]setpts=N/FRAME_RATE/TB[v2];
         amovie=02.mp4:loop=0[a2];[a2]asetpts=N/SR/TB[a2];
         movie=03.mp4:loop=0[v3];[v3]setpts=N/FRAME_RATE/TB[v3];
         amovie=03.mp4:loop=0[a3];[a3]asetpts=N/SR/TB[a3];
         movie=04.mp4:loop=0[v4];[v4]setpts=N/FRAME_RATE/TB[v4];
         amovie=04.mp4:loop=0[a4];[a4]asetpts=N/SR/TB[a4]" \
    -map "[v1]" -map "[a1]" \
        -c:a speex -ar 16000 -ac 1 \
        -c:v libx264 -preset ultrafast \
        -b:v 500k -b:a 32k \
        -f flv rtmp://output/01 \
    -map "[v2]" -map "[a2]" \
        -c:a speex -ar 16000 -ac 1 \
        -c:v libx264 -preset ultrafast \
        -b:v 500k -b:a 32k \
        -f flv rtmp://output/02 \
    -map "[v3]" -map "[a3]" \
        -c:a speex -ar 16000 -ac 1 \
        -c:v libx264 -preset ultrafast \
        -b:v 500k -b:a 32k \
        -f flv rtmp://output/03 \
    -map "[v4]" -map "[a4]" \
        -c:a speex -ar 16000 -ac 1 \
        -c:v libx264 -preset ultrafast \
        -b:v 500k -b:a 32k \
        -f flv rtmp://output/04

Это вызвало следующую ошибку:

[libspeex @ 0x23f4d80] nb_samples (325) != frame_size (320) (avcodec_encode_audio2)

person stevendesu    schedule 04.05.2018    source источник


Ответы (1)


stream_loop еще не реализован для несколько входов; вам придется использовать кино фильтр.

ffmpeg \
    -filter_complex \
        "movie=01.mp4:loop=0,setpts=N/FRAME_RATE/TB,realtime[v1];
         amovie=01.mp4:loop=0,asetpts=N/SR/TB,arealtime[a1];
         movie=02.mp4:loop=0,setpts=N/FRAME_RATE/TB,realtime[v2];
         amovie=02.mp4:loop=0,asetpts=N/SR/TB,arealtime[a2];
         movie=03.mp4:loop=0,setpts=N/FRAME_RATE/TB,realtime[v3];
         amovie=03.mp4:loop=0,asetpts=N/SR/TB,arealtime[a3];
         movie=04.mp4:loop=0,setpts=N/FRAME_RATE/TB,realtime[v4];
         amovie=04.mp4:loop=0,asetpts=N/SR/TB,arealtime[a4]" \
    -map "[v1]" -map "[a1]" \
        -c:a speex -ar 16000 -ac 1 \
        -c:v libx264 -preset ultrafast \
        -b:v 500k -b:a 32k \
        -f flv rtmp://output/01 \
    -map "[v2]" -map "[a2]" \
        -c:a speex -ar 16000 -ac 1 \
        -c:v libx264 -preset ultrafast \
        -b:v 500k -b:a 32k \
        -f flv rtmp://output/02 \
    -map "[v3]" -map "[a3]" \
        -c:a speex -ar 16000 -ac 1 \
        -c:v libx264 -preset ultrafast \
        -b:v 500k -b:a 32k \
        -f flv rtmp://output/03 \
    -map "[v4]" -map "[a4]" \
        -c:a speex -ar 16000 -ac 1 \
        -c:v libx264 -preset ultrafast \
        -b:v 500k -b:a 32k \
        -f flv rtmp://output/04
person Gyan    schedule 04.05.2018
comment
Спасибо за направление. К сожалению, кинофильтр также выдал ошибку (это более значимо): [Parsed_movie_0 @ 0x27b5240] Loop with several streams is currently unsupported [AVFilterGraph @ 0x27b5140] Error initializing filter 'movie' with args '01.mp4:s=dv+da:loop=0' Error initializing complex filters. Not yet implemented in FFmpeg, patches welcome - person stevendesu; 04.05.2018
comment
Изменено на отдельные исходные фильтры - person Gyan; 04.05.2018
comment
Я получаю другую ошибку сейчас. Возможно, я просто неправильно использую параметр filter_complex. Я обновлю свой вопрос своей новой командой - person stevendesu; 04.05.2018
comment
Добавлена ​​полная команда. Возможно, вам придется переключиться на одинарные кавычки для аргументов карты. - person Gyan; 04.05.2018
comment
Как только вы обновили свой пост, я многое понял (я гуглил и нашел, как правильно использовать карту с filter_complex) - однако есть еще одна ошибка :( nb_samples (325) != frame-size (320) - это ошибка libspeex, поэтому я могу просто переключиться на aac или что-то, чтобы обойти это - person stevendesu; 04.05.2018
comment
Переключение на aac действительно решило последнюю проблему, и теперь у меня воспроизводится поток (ожидание 5 минут, чтобы увидеть, зацикливается ли он, когда я нажму на конец видео) - хотя есть новая проблема, которую я, вероятно, сделаю новый вопрос к. Частота кадров зашкаливает во всех смыслах. - person stevendesu; 04.05.2018
comment
Это зациклилось!. Я сделаю новый вопрос для нового выпуска - person stevendesu; 04.05.2018