Usando ffmpeg per tagliare il video


333

Sto usando ffmpeg per ritagliare una sezione di un file di grandi dimensioni come questo:

ffmpeg -i input.wmv -ss 60 -t 60 -acodec copy -vcodec copy output.wmv

La -ssparte funziona bene ma -tviene ignorata. Rimuove correttamente i secondi iniziali specificati specificati con -ssma poi continua fino alla fine dell'input con la copia.

C'è un modo per usare ffmpeg per tagliare la fine di un video senza ricodificarlo?


1
questa sintassi è corretta.
jiggunjer,

Risposte:


394

È possibile utilizzare l' -ssopzione per specificare un timestamp di inizio e l' -topzione per specificare la durata della codifica. I timestamp devono essere in HH:MM:SS.xxxformato o in secondi ( s.msec).

Di seguito, i primi 30 secondi verranno ritagliati, quindi ritagliano tutto ciò che è dopo 10 secondi:

ffmpeg -ss 00:00:30.0 -i input.wmv -c copy -t 00:00:10.0 output.wmv
ffmpeg -ss 30 -i input.wmv -c copy -t 10 output.wmv

Si noti che -tè un'opzione di output e deve sempre essere specificata dopo -i .

Alcuni suggerimenti:

  • Per le versioni precedenti di ffmpeg, se lo usi -ssdopo -i, otterrai una ricerca più accurata a scapito di un'esecuzione più lenta del tutto. Vedi anche: Ricerca con FFmpeg
  • È possibile utilizzare -toinvece di -tspecificare il timestamp in cui si desidera tagliare. Quindi, al posto -i <input> -ss 30 -t 10tuo potresti anche fare -i <input> -ss 30 -to 40la stessa cosa.

  • Se il tuo ffmpeg non supporta -c, o -to, è probabilmente molto obsoleto. Compila tu stesso una nuova versione o scarica una build statica dalla loro homepage. Non è davvero complicato.


1
@Mondain In realtà, si ottiene una maggiore precisione inserendo -ss dopo. E slhck menziona questo blog.superuser.com/2012/02/24/… anche nella documentazione di ffmpeg per -ss menziona una differenza tra metterlo prima o dopo.
barlop

5
+1 Sono venuto qui per capire come ignorare tutto dopo i primi 35 secondi, grazie:ffmpeg -i input.wmv -c copy -t 35 output.wmv
karlphillip

2
Questo non funziona per me (mp4). Produce solo uno schermo nero di 5 secondi:frame= 150 fps=0.0 q=-1.0 Lsize= 264kB time=00:00:09.97 bitrate= 216.6kbits/s
fabbro

2
Questo ha prodotto una schermata nera di 3-4 s all'inizio del mio video. La modifica di Chris con l'omissione ha -c copyrimosso la schermata nera iniziale, vedere la sua risposta per i dettagli.
joelostblom,

4
Scrivi "Quanto segue verrebbe tagliato i primi 30 secondi, quindi ritaglierebbe tutto ciò che è dopo 10 secondi:" <- Cosa significa? Per clip intendi includere? 'cos clip può significare clip out. Supponendo che intendi includere. Vuoi dire Inizia da 30 secondi in poi e includi solo 10 secondi da lì? In tal caso, ti suggerisco di scrivere che sarebbe molto più chiaro.
barlop

94

Come altre persone hanno detto, mettere -ssprima (molto più velocemente) o dopo (più preciso) ciò -ifa una grande differenza. La sezione "Ricerca rapida e accurata" nella pagina di ricerca di ffmpeg spiega come ottenerli entrambi, e io l'ho usato e fa una grande differenza. Fondamentalmente hai messo -ssprima E dopo -i, assicurati di lasciare abbastanza tempo prima di dove vuoi iniziare a tagliare per avere un altro fotogramma chiave. Esempio: se vuoi realizzare una clip di 1 minuto, da 9min0sec a 10min 0sec in Video.mp4, puoi farlo in modo rapido e preciso usando:

ffmpeg -ss 00:08:00 -i Video.mp4 -ss 00:01:00 -t 00:01:00 -c copy VideoClip.mp4

Il primo -sscerca velocemente (approssimativamente) 8min0sec, quindi il secondo -sscerca accuratamente fino a 9min0sec, e -t 00:01:00estrae una clip da 1min0sec.

Nota anche questo importante punto di quella pagina: "Se lo usi -sscon -c:v copy, il bitstream risultante potrebbe finire per essere instabile, non riproducibile o non sincronizzato con il flusso audio, poiché ffmpeg è costretto a usare / dividere solo su i-frame. "

Ciò significa che è necessario ricodificare il video, anche se si desidera semplicemente copiarlo o rischiare che sia instabile e non sincronizzato. Potresti provare solo -c copyprima, ma se il video fa schifo dovrai rifarlo.


lo stesso avvertimento vale -c:a copyper questo modo di cercare.
jiggunjer,

1
La migliore risposta, in questo modo ha funzionato al meglio per me.
Ondra Žižka,

3
Sembra che "-ss" sia ora veloce e preciso in ffmpeg 2.1+ senza specificarlo due volte. trac.ffmpeg.org/wiki/Seeking
Conrad Meyer

25

Ho scoperto che -sscombinato con ha -c copyprovocato un taglio di mezzo secondo all'inizio.

Per evitare ciò, è necessario rimuovere il -c copy(che, certamente, farà una transcodifica).


4
C'è un'altra risposta che si occupa di precisione. La ricodifica con l'opzione predefinita spesso NON è ciò che si desidera fare!
Tomasz Gandor,

Buon punto @TomaszGandor
Chris

1
Non ho capito affatto la risposta di @ TomaszGandor, ma la rimozione l'ha -c copyrisolta.
Iulian Onofrei,

14

MANUALE

Aprire il file in un lettore multimediale che eseguirà il fotogramma per fotogramma avanzato e riprodurre un file AVISynth con dati come:

DirectShowSource(("C:\Downloads\Video\Do you want him.flv"), Pixel_Type="yuy2").Crop(0,0,-0,-0)
Subtitle("C:\Downloads\Video\Do you want him.flv", font="Arial", size=24, text_color=$ff0000, align=3)
ShowFrameNumber(scroll=true, x=336, y=27, font="Arial", size=24, text_color=$ff0000)
ShowTime(x=398, y=44, font="Arial", size=24, text_color=$ff0000)

Quindi tagliare con il formato ora ESATTO:

ffmpeg -i "Path\do you want him.flv"        \
       -ss 00:00:05.240 -to 00:00:08.360    \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him1.flv"

e

ffmpeg -i "Path\do you want him.flv"        \
       -ss 00:00:10.240 -to 00:00:14.360    \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him2.flv"

Ora crea un file txt con i file video con contenuti come:

file 'C:\Downloads\Video\Do you want him1.flv'
file 'C:\Downloads\Video\Do you want him2.flv'

Esegui ffmpeg:

ffmpeg -f concat -i FileList.txt -c copy "Path\NewName_joined.flv"

9

Per me l' -topzione non ha funzionato, ma ha -vframesfunzionato. Preferisco usare #frames, poiché preferirei tagliare su I-Frames e ho scoperto GOP per l'utilizzo di video ffprobe.

La riga di comando che ha funzionato per me è:

ffmpeg -ss 60s -i input.wmv -vframes 1800 -acodec copy -vcodec copy output.wmv

A proposito, mettere -ssin primo piano -ifa una grande differenza nei tempi di esecuzione.


1
In realtà -vframes(o -frames:v) dovrebbe venire dopo -iperché è un'opzione di output.
slhck,

5

Come con user225366, l'opzione -t non funziona per i video brevi, ma per i video più lunghi. Per i brevi video sembra che -frames: v è meglio. Questo è ciò che ha funzionato per me.

ffmpeg -ss 4 -i input.mp4 -frames:v 200 -vcodec copy output.mp4

-codec copia deve essere aggiunto se il video ha audio, come mostrano le altre risposte.


0

Non vedo molti menzionarlo (non sono un esperto, quindi forse c'è un problema), ma se il tuo file ha altri flussi come sottotitoli e altri metadati come capitoli e così via, è possibile tagliare / tagliare e mantenere tutti i flussi con il seguente comando

ffmpeg -to 60 -i input.mkv -map 0 -c copy output.mkv

Con -map 0te prendi tutti i flussi nel file e con -c copyte copiali tutti come sono.
L'uso -todell'omissione dell'inizio via -ssridurrà il video in ingresso dall'inizio alla seconda 60.

Giocherellare con mapè utile anche se vuoi mantenere solo flussi specifici nel taglio (forse non hai bisogno di tutte le fonti audio nel file o solo di alcuni sottotitoli).

Lo uso quando ho bisogno di dividere file MKV di grandi dimensioni che non possono essere archiviati nella memoria FAT32.

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.