Script para cortar vídeos com base na lista de edição

1

Eu tenho um monte de imagens do jogo da temporada do meu time de futebol e atribui a cada um dos meus companheiros de equipe um jogo para assistir e anotar os intervalos de tempo onde os destaques acontecem.

Agora, em vez de cortar tudo manualmente, quero escrever um script que faça isso para mim. Estou familiarizado com scripts de shell, python e ruby.

Algum de vocês conhece alguma boa ferramenta de edição de vídeo que possa ajudar a automatizar essa tarefa? Eu estava esperando poder colocar os intervalos em um arquivo de entrada simples que meus colegas de equipe poderão usar.

    
por Curtis Bowman 02.05.2012 / 01:28

3 respostas

2

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).

  1. Meu script está disponível aqui: video-extract.rb

  2. 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):

  3. Em seguida, ajuste as variáveis no cabeçalho do script. Mais importante ainda, altere COPY para true 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.

    
por 02.05.2012 / 09:14
0

MEncoder é seu amigo aqui. É uma ótima ferramenta para operações de script em vídeo. Eu uso muito para criar arquivos de vídeo de quadros individuais.

Eu encontrei este script Perl que pode fazer exatamente o que você quer: Video Cutter V2: Corte de Vídeo Usando o Mencoder

    
por 02.05.2012 / 01:43
0

Experimente o ffmpeg .

Por exemplo:

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

Abrirá o arquivo de vídeo original ( -i original.mpg ), ignorará os primeiros 20 segundos ( -ss 20 ) e economizará 30 segundos ( -t 30 ) em um novo filme chamado newmovie.mpg

    
por 02.05.2012 / 04:07