Almeno su FFmpeg 2.8.x (ma anche oldie dovrebbe funzionare) puoi usare lavfi
come formato di input e grafico di filtro complesso usando movie
e setpts
filtri come argomento per l' -i
opzione.
Prossimo comando facendo questo lavoro per te:
ffmpeg -re -f lavfi -i "movie=filename=input.mp4:loop=0, setpts=N/(FRAME_RATE*TB)" output.mp4
loop=
Argomenti zero significa ciclo infinito. Valori maggiori di zero imposta conteggi ripetuti. setpts
filtri necessari per la regolazione PTS per le ripetizioni seconde e successive, altrimenti la maggior parte dei muxer di output fallirà con l'aumento del PTS non monotonico: il loop non ricalcola il PTS.
Si noti che l'utilizzo dei filtri presuppone che sia impossibile bypassare i frame senza decodifica / codifica: in base alla progettazione, i filtri si occupano solo dei frame decodificati.
-stream_loop
All'FFmpeg 2.8.2 sono state introdotte nuove opzioni di input. A prima vista, funziona in modo più semplice e consente di copiare il contenuto senza transcodificare:
ffmpeg -re -stream_loop -1 -i input.mp4 -c copy -y output.mp4
Ma non ricalcola PTS e il file di output è errato. Se aggiungi filtro per correggere PTS (vedi setpts
), devi rimuovere -c copy
anche. Solo i filtri bitstream possono gestire i pacchetti codificati, ma non esistono filtri bitstream per correggere PTS (vedi: https://ffmpeg.org/ffmpeg-bitstream-filters.html )
In ogni caso ffmpeg al secondo passaggio fallisce con errore:
input.mp4: Resource temporarily unavailable
Per me è stato risolto il problema: utilizzare il contenitore per il file di input senza limiti PTS (contenitore di streaming). Uno di questi, mi conosce, è MPEG-TS. Quindi, puoi semplicemente convertire il tuo file MP4 in MPEG-TS:
ffmpeg -i input.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts input.ts
E usa il comando successivo per comporre il file infinito:
ffmpeg -re -stream_loop -1 -i input.ts -c copy -strict -2 -bsf:a aac_adtstoasc -y output.mp4
(i filtri bitstream dovrebbero essere usati solo se necessario, sui miei campioni è richiesto)
In questo caso è richiesto FFmpeg> = 2.8.2.