ffmpeg aggiunge l'audio ma mantiene la lunghezza del video uguale (non più breve)


12

Sto aggiungendo l'audio a un file video usando ffmpeg in questo modo

ffmpeg -i videofile.mp4 -i audiofile.wav output.mp4

Tuttavia, ciò estende il file video di output in modo che sia la lunghezza del file audio se è più lungo del video. L'uso di -shortest abbrevia il file video se il file audio è più corto del video. Quindi c'è un flag per dire a ffmpeg di tagliare la lunghezza del video in uscita alla lunghezza del video in ingresso?


Seleziona una risposta corretta. L'unico vero vero è quello di @Zurechtweiser.
Roel Van de Paar,

Risposte:


13

Credo che puoi raggiungere il tuo obiettivo desiderato usando l'opzione -filter_complex e l'opzione filtro apad per riempire il tuo audio con silenzio alla fine se il video è più lungo. Il tuo comando sarebbe:

ffmpeg -i videofile.mp4 -i audiofile.wav -filter_complex " [1:0] apad " -shortest output.mp4

Ciò presuppone che l'audio desiderato sia nel primo flusso di audiofile.wav, la sintassi [A: B] dice di prendere il B'th stream dall'ingresso A'th (entrambi iniziano con 0, quindi [1: 0] è il primo flusso dal secondo ingresso, o audiofile.wav sopra).

Dettagli su: https://www.ffmpeg.org/ffmpeg-filters.html#Examples-68


Dovresti menzionare che l' -filter_complexopzione impone la ricodifica - ad esempio è possibile eseguire ffmpeg -i videofile.mp4 -i audiofile.wav -c:v copy output.mp4ma nonffmpeg -i videofile.mp4 -i audiofile.wav -filter_complex " [1:0] apad " -c:v copy -shortest output.mp4
Eugen Rieck il

Questa è la risposta opposta a ciò che è richiesto. OP chiede di terminare il video al termine dell'audio, la risposta fornita è quella di aggiungere il silenzio audio se l'audio è più corto del video. Questa risposta non è corretta
Roel Van de Paar

Non è "il contrario" di quanto richiesto dall'OP. L'OP vuole che il video in uscita sia la lunghezza del video in ingresso, indipendentemente dalla lunghezza della traccia audio. La mia risposta affronta la circostanza in cui il video di input è più lungo del file audio. L'OP ha già una soluzione per quando il video in ingresso è più corto del file audio, che deve usare -cortocircuito.
deadcode del

12
  • Se la lunghezza del video è inferiore alla lunghezza dell'audio, -shortestè quello che vuoi.
  • Se la lunghezza del video è più lunga della lunghezza dell'audio, nessuna bandiera sarà quella che desideri.

Non c'è bandiera per automatizzare questa decisione.

MODIFICARE

Ispirato dalla risposta di @ deadcode, devo chiarire che "nessuna bandiera da automatizzare" non è ovviamente vero, se sei disposto a ricodificare : in questo caso apadprocedi come suggerito da @deadcode.

Se tuttavia vuoi evitare la ricodifica (cioè -c:v copy) la risposta è valida.

C'è una soluzione alternativa usando il ffconcatdemuxer, ma ha bisogno di un po 'di lavoro:

  • crea un file contenente silenzio esattamente nello stesso formato del tuo file audio ("silence.wav")
  • crea un file concat "audio.ffconcat" (con tutte le linee di silenzio di cui hai bisogno per assicurarti che l'audio sia abbastanza lungo):

.

file 'audiofile.wav'
file 'silence.wav'
file 'silence.wav'
...
file 'silence.wav'
  • correre ffmpeg -i videofile.mp4 -f concat -i audio.ffconcat -c:v copy output.mp4

Questo sintetizzerà il apadfiltro senza un grafico del filtro, consentendo così un mux senza ricodifica.


@RoelVandePaar Come ho detto: se la lunghezza del video è inferiore all'utilizzo della lunghezza dell'audio -shortest, utilizzare questa soluzione alternativa se si desidera aggiungere silenzio senza ricodificare.
Eugen Rieck,

Corretto, mancato durante la revisione. Input rimosso. Sentiti libero di fare lo stesso.
Roel Van de Paar

5

Se conosci la lunghezza del tuo file video, puoi farlo usando

ffmpeg -i videofile.mp4 -i audiofile.wav -t 43 output.mp4

Dove 43 è la lunghezza del file video in secondi.


la domanda dell'autore vuole eseguire il loop del file audio mentre il video non è terminato. Funziona così?
Rafael Sanches,

@RafaelSanches No, non lo fa.
Zurechtweiser,

L'autore non vuole riprodurre l'audio in loop. Questa risposta è anche l'unica corretta che fa ciò che l'OP stava chiedendo; termina il video quando termina il video di input.
Roel Van de Paar,
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.