Tenho um monte de filmagens de jogos da temporada do meu time de futebol e atribuí a cada um dos meus companheiros um jogo para assistir e anotar os intervalos de tempo em que ocorrem os destaques.
Agora, em vez de ter que cortar tudo isso 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 esperava poder colocar os intervalos em um arquivo de entrada simples que meus colegas de equipe pudessem usar.
Responder1
Para isso você precisa do FFmpeg (baixe umconstrução estática) e Bash.
Crie uma lista semelhante a CSV de pontos de entrada e saída, por exemplo:
00:01:00,00:02:00
00:03:00,00:03:02
…
Você pode então executar o seguinte script Bash para cortar o vídeo em partes individuais:
#!/usr/bin/env bash
if [[ $# -ne 2 ]]; then
echo "Usage: $0 <input> <editList>"
exit 1
fi
inputFile=$1
editFile=$2
inputFileBase="${inputFile%.*}"
extension="${inputFile##*.}"
cnt=0
while IFS=, read -r start end; do
suffix="$(printf "%05d" $cnt)"
outfile="${inputFileBase}-${suffix}.${extension}"
ffmpeg -nostdin -ss "$start" -i "$inputFile" -to "$end" -c copy -map 0 "$outfile"
cnt=$((cnt+1))
done < "$editFile"
Salve este arquivo como cut.sh
(ou similar) e execute:
chmod +x cut.sh
./cut.sh /path/to/input.mp4 /path/to/editList.csv
Ele copiará os fluxos de bits de vídeo e áudio para arquivos de saída, numerados sequencialmente com o sufixo 00001
e 00002
assim por diante.
Resposta antiga abaixo…
Certa vez, escrevi um script Ruby que faz exatamente isso. Você precisa de Ruby ≥1.9.2 (por exemplo, atravésRVM) e uma versão recente doFFmpeginstalado (veraquisobre como instalar a partir do código-fonte).
Meu script está disponível aqui:
video-extract.rb
Você precisa alimentá-lo com uma lista de edições de entrada CSV, contendo principalmente 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 em
HH:MM:SS.ms
ou segundos - a duração da edição em
HH:MM:SS.ms
ou segundos
Por exemplo (observe que a Out
coluna não é utilizada):
- Em seguida, ajuste as variáveis no cabeçalho do script. Mais importante ainda, mude
COPY
paratrue
se desejar uma cópia bitstream e nenhuma recodificação. 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 Ruby). Usei esse script com muita frequência e ainda não tive problemas. A única coisa que falta é o suporte de áudio adequado – ele apenas copiará o fluxo de áudio, o que pode ou não funcionar no seu caso. Em caso de problemas, reporte.
Se você precisar calcular a diferença entre um ponto de entrada e um ponto de saída, poderá fazer isso com este pequeno script Ruby, baseado emestas perguntas e respostas sobre Stack Overflow:
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.
Responder2
MEncoder é seu amigo aqui. É uma ótima ferramenta para operações de script em vídeo. Eu uso muito para criar arquivos de vídeo a partir de quadros individuais.
Encontrei este script Perl que pode fazer exatamente o que você deseja:Video Cutter V2: Corte de vídeo usando Mencoder
Responder3
Tentarffmpeg.
Por exemplo:
ffmpeg -i original.mpg -ss 20 -t 30 newmovie.mpg
Irá abrir o arquivo de vídeo original ( -i original.mpg
), pular os primeiros 20 segundos ( -ss 20
) e salvar 30 segundos ( -t 30
) em um novo filme chamadonewmovie.mpg