Sottrazione del file video in più segmenti

Sto attualmente utilizzando ffmpeg per tagliare i file video. Ho automatizzato il process attraverso uno script chiamato ffmpeg_split.sh. Anche se questo è molto lento è efficace nel suddividere i video in impostazioni equivalenti. L'unico problema è che ha problemi di frame rate. Sotto la malvagia zuppa consigliato un modo per fare tutto questo utilizzando il segment in ffmpeg. Ho provato questo ma non mi danno segmenti di durata equivalente.

AGGIORNARE

Per evilsoup utilizzando questo command per segmentare i video:

ffmpeg -i input.mp4 -c copy -map 0 -segment_time 8 -f segment output%03d.mp4

VECCHIO:

Ecco la syntax per tagliare un video con script: ffmpeg_split.sh -s test_vid.mp4 -o video-part%03d.mp4 -c 00:00:08

risultati

my_split_script.sh

 input.mp4 – Duration 00:01:20 #EXTINF:10, Output01.mp4 #EXTINF:10, Output02.mp4 #EXTINF:10, Output03.mp4 #EXTINF:9, Output04.mp4 #EXTINF:10, Output05.mp4 #EXTINF:10, Output06.mp4 #EXTINF:11, Output07.mp4 #EXTINF:10, Output08.mp4 real 0m30.517s #execution time 

ffmpeg

 input.mp4 – Duration 00:01:20 #EXTINF:10, Output01.mp4 #EXTINF:10, Output02.mp4 #EXTINF:6, Output03.mp4 #EXTINF:10, Output04.mp4 #EXTINF:10, Output05.mp4 #EXTINF:7, Output06.mp4 #EXTINF:10, Output07.mp4 #EXTINF:9, Output08.mp4 real 0m7.493s #executition time 

Potete farlo direttamente da ffmpeg senza l'utilizzo di uno script. Essenzialmente each volta che utilizzi il ffmpeg segment , andrà avanti e farà del suo meglio per dividersi vicino all'ora specificata per each segmento. Questo è basato su key_frames che troverà il frame più vicino e tagliato lì. Per tagliare i segmenti esatti, è necessario codificare l'integer video.

 ffmpeg -i input.mp4 -c:v libx264 -crf 22 -map 0 -segment_time 9 -g 9 -sc_threshold 0 -force_key_frames "expr:gte(t,n_forced*9)" -f segment output%03d.mp4 

Dovnetworking leggere in -crf , -sc_threshold e -force_key_frames . Nella wiki per ffmpeg .

ffmpeg può effettivamente farlo, utilizzando il muxer del segmento

 ffmpeg -i input.mp4 -c copy -map 0 -segment_time 8 -f segment output%03d.mp4 

Devi sicuramente leggere la documentazione e giocare un po 'per get i migliori risultati (il valore predefinito sarà abbastanza buono per la maggior parte degli scopi, ma non ti permetterà di dividere 100%).


In generale, se hai bisogno di get informazioni come la durata di un file, è meglio utilizzare ffprobe , che viene fornito in dotazione con ffmpeg – printing le informazioni come un paio di coppie key=value , rendendo molto più facile da affrontare .

 ffprobe -show_format file.mp4 | grep -F duration | cut -d= -f2 ## or, if you want hh:mm:ss format: ffprobe -show_format -sexagesimal file.mp4 | grep -F duration | cut -d= -f2 

ma penso sia probabilmente meglio fare affidamento sulle proprie opzioni di ffmpeg , piuttosto che su uno script di shell (che sarà molto less efficiente, in quanto deve call molteplici istanze di ffmpeg ).