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

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

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 00001e 00002assim 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).

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

  2. 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.msou segundos
  • a duração da edição em HH:MM:SS.msou segundos

Por exemplo (observe que a Outcoluna não é utilizada):

  1. Em seguida, ajuste as variáveis ​​no cabeçalho do script. Mais importante ainda, mude COPYpara truese 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.txte outs.txtonde 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

informação relacionada