2010-05-06 14:12:17 +0000 2010-05-06 14:12:17 +0000
357
357

Usando ffmpeg per tagliare il video

sto usando ffmpeg per tagliare 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 parte -ss funziona bene ma il -t viene ignorato. Rimuove correttamente i secondi iniziali specificati con -ss ma poi continua ad andare alla fine dell'input con la copia.

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

Risposte (7)

105
105
105
2014-01-20 04:07:24 +0000

Come altri hanno detto, mettere l’-ss prima (molto più veloce) o dopo (più preciso) l’-i fa una grande differenza. La sezione “Ricerca veloce e precisa” nella pagina di ricerca ffmpeg vi dice come ottenere entrambi, e io l'ho usata, e fa una grande differenza. Fondamentalmente si mette -ss prima e dopo l’-i, basta assicurarsi di lasciare abbastanza tempo prima di dove si vuole iniziare a tagliare per avere un altro fotogramma chiave. Esempio: Se volete fare una clip di 1 minuto, da 9min0sec a 10min 0sec in Video.mp4, potete farlo velocemente e accuratamente usando:

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

Il primo -ss cerca velocemente fino a (circa) 8min0sec, e poi il secondo -ss cerca accuratamente fino a 9min0sec, e il -t 00:01:00 tira fuori una clip di 1min0sec.

Notate anche questo punto importante da quella pagina: “Se si usa -ss con -c:v copy, il bitstream risultante potrebbe finire per essere frammentato, non riproducibile, o fuori sincrono con il flusso audio, dal momento che ffmpeg è costretto a usare solo/split su i-frame”.

Questo significa che è necessario ricodificare il video, anche se si vuole solo copiarlo, o rischiare che sia frammentato e fuori sincrono. Potreste provare prima solo -c copy, ma se il video fa schifo dovrete rifarlo.

27
27
27
2014-05-09 02:24:58 +0000

Ho scoperto che -ss combinato con -c copy ha portato ad un taglio di mezzo secondo all'inizio.

Per evitare questo, è necessario rimuovere l’-c copy (che sicuramente farà un transcode).

13
13
13
2014-09-04 05:48:57 +0000

MANUALMENTE

Aprire il file in un media player che avanzerà fotogramma per fotogramma e riprodurrà 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)
``` ```
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"

Poi tagliare con il formato EXACT time:

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"
``` ```
file 'C:\Downloads\Video\Do you want him1.flv'
file 'C:\Downloads\Video\Do you want him2.flv'

e

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

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


&001 &001 


Esegui ffmpeg: 


&001 &001
8
8
8
2013-05-19 03:14:56 +0000

Per me l'opzione -t non ha funzionato, ma -vframes ha funzionato. Io preferisco usare #frames, perché preferisco tagliare a I-Frames e ho scoperto GOP per il video usando ffprobe.

La linea di comando che ha funzionato per me è:

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

A proposito, mettere -ss davanti a -i fa una grande differenza nel tempo di esecuzione.

5
5
5
2016-12-08 11:24:57 +0000

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

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


-acodec copy deve essere aggiunto se il video ha l'audio, come dimostrano le altre risposte.
0
0
0
2020-02-12 02:20:00 +0000

utilizzare questo formato:

ffmpeg <start time> <input file> <cut duration> <out file>

ad es. tagliare una clip di 60 secondi dopo 1 minuto di video

ffmpeg.exe -ss 00:01:00 -i "in file.mp4" -to 00:01:00 -c copy out.mp4

0
0
0
2019-09-01 05:29:02 +0000

Vedo che non molti ne parlano (non sono un esperto quindi forse c'è un tranello), ma se il vostro file ha altri stream come sottotitoli e altri metadati come capitoli e così via, è possibile tagliare/tagliare e mantenere tutti gli stream con il seguente comando

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

Con -map 0 si prendono tutti gli stream del file, e con -c copy li si copia tutti così come sono.
Usando -to omettendo l'avvio tramite -ss si taglia il video in ingresso dall'inizio alla seconda 60.

Fidarsi con map è utile anche se si vogliono mantenere nel taglio solo specifici stream (forse non si ha bisogno di tutte le sorgenti audio nel file, o solo di alcuni sottotitoli).

Lo uso quando ho bisogno di dividere grandi file MKV che non possono essere memorizzati in memoria FAT32.