Ripeti / loop Ingresso video con ffmpeg?


52

Voglio solo girare un video mp4 con ffmpeg e mantenere le impostazioni e il codec correnti.

Ad esempio, se input.mp4 è lungo 0:10 e vorrei eseguirne il ciclo 4 volte, quindi output.mp4 è lungo 0:40, come posso modificare la seguente riga di comando per farlo?

ffmpeg -i input.mp4 -c copy output.mp4

Provai...

ffmpeg -loop 4 -i input.mp4 -c copy output.mp4

... ma viene visualizzato l'errore "Opzione loop non trovato."


Usa il contenitore quicktime 7 pro e mov. Quindi non otterrai una dimensione del file più grande rispetto a quella di opensource.
Дмитрий Мышков,

Risposte:


69

Demolitore Concat

Ciò consente di eseguire il looping di un input senza ricodificare.

  1. Crea un file di testo. Contenuto di un file di testo di esempio da ripetere 4 volte.

    file 'input.mp4'
    file 'input.mp4'
    file 'input.mp4'
    file 'input.mp4'
    
  2. Quindi eseguire ffmpeg:

    ffmpeg -f concat -i list.txt -c copy output.mp4
    

Per utenti Linux

Questo esempio è uguale al precedente ma non è necessario effettuare manualmente list.txt:

for i in {1..4}; do printf "file '%s'\n" input.mp4 >> list.txt; done
ffmpeg -f concat -i list.txt -c copy output.mp4

Con le shell moderne più comunemente usate, puoi persino evitare completamente la creazione del list.txtfile. Ad esempio, con bash:

ffmpeg -f concat -i <(for i in {1..4}; do printf "file '%s'\n" input.mp4; done) -c copy output.mp4

Vedi anche:


filtro ad anello

Esempio di utilizzo del filtro loop per loop 4 volte, ogni loop è di 75 frame, ogni loop salta i primi 25 frame dell'ingresso:

ffmpeg -i input -filter_complex loop=loop=3:size=75:start=25 output
  • Oppure usa la scorciatoia: loop=3:75:25
  • Il filtro richiede una ricodifica.
  • Questo filtro inserisce tutti i frame in memoria .
  • L'uso loop=3verrà ripetuto 4 volte.
  • Per eseguire il loop all'infinito -1.
  • È necessario elencare il numero di frame da eseguire in loop (mostrato come 75 nell'esempio sopra). Il valore massimo è 32767.
  • Vedere anche ffmpeg -h filter=loop.

filtro film

Il filtro film ha un'opzione loop. Vedi la risposta sotto di Monah Tuk. Il filtro richiede una ricodifica. Per l'audio usa il filtro amovie.


-stream_loop opzione

Vedi la risposta di seguito di Thingy e la risposta di Gyan.

Nota che questa opzione era difettosa (vedi segnalazioni di bug # 5719 , # 6121 e # 7043 ), quindi potrebbe non funzionare con build precedenti (qualsiasi cosa precedente al 06-27 2018 incluso il ramo di rilascio di FFmpeg 4.0.x). Per gli utenti di build precedenti, come menzionato da mulvya nel ticket n. 6121, una soluzione alternativa consiste nel re-mux in MKV o TS, quindi utilizzare -stream_loopnel comando successivo.


-loop opzione

L' -loopopzione è specifica per il demuxer di file di immagine e gif muxer , quindi non può essere utilizzata per file video tipici, ma può essere utilizzata per eseguire in sequenza infinita una serie di immagini di input. Questo esempio ripeterà ripetutamente ma -t 30limiterà la durata dell'uscita a 30 secondi:

ffmpeg -loop 1 -i %03d.png -t 30 output.mkv

O per eseguire il loop di un output GIF:

ffmpeg -i input -loop 3 output.gif

Funziona bene con i file mp4?
Thomas King,

3
Ottengo questo errore> <(for i in {1..4}; do printf "file '%s'\n" input.mp4; done) -bash: /dev/fd/63: Permission denied
JZ11

1
@jamesfzhang - Penso che sia perché hai bisogno di un percorso assoluto per il file (come spiegato qui: trac.ffmpeg.org/wiki/Concatenate ). Per fare ciò, potresti scrivere: ffmpeg -safe 0 -f concat -i <(per i in {1..4}; fai printf "file '$ PWD' / '% s' \ n" input.mp4; fatto ) -c copy output.mp4
Plenus Franckly,

1
Per quanto mi riguarda, questo funziona per ripetere video a tempo pieno senza saltare le fames per 4 volteffmpeg -i video.mp4 -filter_complex "loop=4:32767" output.mp4
Vlad

Questo numero ha 4 anni e nessuno ha notato che il link al secondo numero nella -stream_loopsezione punta allo stesso biglietto del primo ...
Leonid Usov

15

Almeno su FFmpeg 2.8.x (ma anche oldie dovrebbe funzionare) puoi usare lavficome formato di input e grafico di filtro complesso usando moviee setptsfiltri come argomento per l' -iopzione.

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. setptsfiltri 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_loopAll'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 copyanche. 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.


1
L'esecuzione di questo comando mi dà l'errore: "[mp4 @ 00000000053fa1a0] Impossibile trovare il tag per codec rawvideo nello stream # 0, codec attualmente non supportato nel contenitore". Se aggiungo -vcodec h264 prima dell'input, quell'errore scompare, ma l'encoder non esce. Fornire un conteggio di loop diverso da zero produce molti errori ma esce. Il file non è un output valido.
Gyan,

1
La documentazione per stream_loop dice "Loop 0 significa nessun loop, loop -1 significa loop infinito".
Gyan,

Sembra file di input errato. Potresti condividerlo? "Loop 0 significa nessun loop, loop -1 significa loop infinito." - Mi sembra di vedere vecchi documenti :-)
Monah Tuk,

1
Ho dimenticato: i filtri assumono la transcodifica (decodifica / codifica). Di progettazione. Quindi è necessario rimuovere -c copy. Risposta risolta.
Monah Tuk,

1
Bello da sapere, ma questa è una limitazione significativa se hai un ciclo grande da generare.
Gyan,

14

Con ffmpeg 2.8.4, il seguente comando crea output.mp4 che è una copia ripetuta di input.mp4 fino a quando il processo ffmpeg non viene arrestato:

ffmpeg -stream_loop -1 -i input.mp4 -c copy output.mp4

Questo comando non terminerà da solo e il file di output crescerà all'infinito.


2
Sembra essere il metodo più veloce
josef

2
Il metodo più veloce è un eufemismo, questo metodo accelera fino a video di più ore in pochi secondi.
SleighBoy,

Questo è un metodo molto conveniente, perché non è necessario creare un file con linee ripetute.
Markus Zeller,

-1

D: "... come posso modificare la seguente riga di comando per farlo? Ffmpeg -i input.mp4 -c copy output.mp4"?

A: Il metodo semplice che evita i problemi di cui funzionano i comandi con quale versione è la 'soluzione banale':

ffmpeg -i input.mp4 -i input.mp4 -i input.mp4 -i input.mp4 -c copia output.mp4

Vedi anche: https://trac.ffmpeg.org/wiki/Concatenate per molti esempi.


2
Questo non fa alcuna concatenazione. È necessario utilizzare almeno uno dei metodi concat: protocollo, filtro o demuxer. In questo comando, la mappatura automatica di ffmpeg selezionerà un flusso video, uno audio e uno sottotitoli tra gli ingressi. Dato che sono identici, è equivalente al primo comando del PO.
Gyan,

Grazie per aver testato Mulvya, in quanto differisce dal comportamento descritto in Documenti: ffmpeg.org/ffmpeg.html#Description - Se c'è una somiglianza nei nomi dei file usando "-i -i /tmp/test%d.mp4" ( et. al) è anche possibile.
Rob
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.