Script per tagliare i video basati sull'elenco di modifica

Ho un mucchio di filmati della stagione della mia squadra di calcio e ho assegnato a ciascuno dei miei compagni di squadra una partita per osservare e annotare gli intervalli di tempo in cui si verificano i punti culminanti.

Ora invece di wherer tagliare tutto questo manualmente, voglio scrivere uno script che farà questo per me. Sono a conoscenza dello script di shell, pitone e ruby.

Qualcuno di voi sa di qualunque buon strumento di editing video che possa aiutare a automatizzare questo task? Speravo di poter mettere gli intervalli in un semplice file di input che i miei compagni di squadra potranno usare.

Una volta ho scritto uno script Ruby che fa proprio questo. Hai bisogno di Ruby ≥1.9.2 (ad esempio tramite RVM ) e una versione recente di FFmpeg installata (vedi qui come installare dalla sorgente).

  1. Il mio script è disponibile qui: video-extract.rb

  2. È necessario alimentarlo con un elenco di modifiche di modifica CSV, in particolare contenente le seguenti colonne:

    • un prefisso (può essere vuoto)
    • un ID video (alcuni numbers sequenziali)
    • il nome del file di input
    • il punto in HH:MM:SS.ms o secondi
    • la lunghezza della modifica in HH:MM:SS.ms o secondi

    Ad esempio (si noti che la colonna Out non è utilizzata):

  3. Quindi, regolare le variables nell'intestazione di script. Soprattutto, cambiare COPY su true se si desidera una copia bitstream e non ricodifica. Modificare anche l'indice delle colonne CSV e del separatore CSV.


Sentitevi liberi di migliorare lo script o suggerire modifiche (specialmente se già conosci Ruby). Ho usato questo script molto spesso e non sono ancora in problemi. L'unica cosa che manca è il supporto audio appropriato – copierà semplicemente il stream audio, che potrebbe o potrebbe non funzionare nel tuo caso. In caso di guai, segnalate.

Se hai bisogno di calcolare la differenza tra un in e out-point, puoi farlo con questo piccolo script Ruby, basato su questo Q & A Overflow stack :

 require "Time" def time_diff(time1_str, time2_str) t = Time.at( Time.parse(time2_str) - Time.parse(time1_str) ) (t - t.gmt_offset).strftime("%H:%M:%S.%L") end ins, outs, diffs = File.open("ins.txt"), File.open("outs.txt"), File.new("diffs.txt", "w") inlines, outlines = [], [] ins.each { |l| inlines << l } outs.each { |l| outlines << l } inlines.zip(outlines).each { |ins, outs| diffs.puts time_diff(ins, outs) } diffs.close 

ins.txt semplicemente un file chiamato ins.txt e outs.txt where each row corrisponde ad un punto di outs.txt e output (vedi lo screenshot sopra). La differenza verrà scritta a diffs.txt . Semplice come quella.

MEncoder è il tuo amico qui. È un ottimo strumento per eseguire operazioni di scripting sul video. Lo uso molto per creare file video da singoli frame.

Ho trovato questo script Perl che potrebbe fare esattamente quello che vuoi: Video Cutter V2: Taglio video utilizzando Mencoder

Prova ffmpeg .

Per esempio:

 ffmpeg -i original.mpg -ss 20 -t 30 newmovie.mpg 

Apri il file video originale ( -i original.mpg ), salta i primi 20 secondi ( -ss 20 ) e poi salva 30 secondi ( -t 30 ) in un nuovo filmato chiamato newmovie.mpg