Uma vez eu escrevi um script Ruby que faz exatamente isso. Você precisa de Ruby ≥1.9.2 (por exemplo, através de RVM ) e uma versão recente de FFmpeg instalado (veja aqui sobre como instalar a partir da fonte).
-
Meu script está disponível aqui:
video-extract.rb
-
Você precisa alimentá-lo com uma lista de entradas de CSV das edições, o que é mais importante, contendo as seguintes colunas:
- um prefixo (pode estar vazio)
- um ID de vídeo (algum número sequencial)
- o nome do arquivo de entrada
- o ponto de entrada em
HH:MM:SS.ms
ou segundos - o tamanho da edição em
HH:MM:SS.ms
ou segundos
Por exemplo (observe que a coluna
Out
não é usada): -
Em seguida, ajuste as variáveis no cabeçalho do script. Mais importante ainda, altere
COPY
paratrue
se você quiser uma cópia de bitstream e não recodificar. Altere também o índice das colunas CSV e o separador CSV.
Sinta-se à vontade para melhorar o script ou sugerir alterações (especialmente se você já conhece o Ruby). Eu usei esse script com muita frequência e ainda não tive problemas. A única coisa que falta é o suporte de áudio adequado - basta copiar o fluxo de áudio, o que pode ou não funcionar no seu caso. Em caso de problemas, reporte-se.
Se você precisar calcular a diferença entre um ponto de entrada e de saída, poderá fazer isso com este pequeno script Ruby, com base em este Stack Overflow Q & A :
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
Você acabou de criar um arquivo chamado ins.txt
e outs.txt
, onde cada linha corresponde a um ponto de entrada e saída (veja a imagem acima). A diferença será gravada em diffs.txt
. Simples assim.