Script para cortar videos según la lista de edición

Script para cortar videos según la lista de edición

Tengo un montón de imágenes de juegos de la temporada de mi equipo de fútbol y le he asignado a cada uno de mis compañeros un juego para que mire y escriba los intervalos de tiempo en los que ocurren los aspectos más destacados.

Ahora, en lugar de tener que cortar todo esto manualmente, quiero escribir un script que lo haga por mí. Estoy familiarizado con los scripts de Shell, Python y Ruby.

¿Alguno de ustedes conoce alguna buena herramienta de edición de video que pueda ayudar a automatizar esta tarea? Esperaba poder poner los intervalos en un archivo de entrada simple que mis compañeros de equipo pudieran usar.

Respuesta1

Para esto necesitas FFmpeg (descarga unconstrucción estática) y Golpe.

Cree una lista similar a CSV de puntos de entrada y salida, por ejemplo:

00:01:00,00:02:00
00:03:00,00:03:02

Luego puedes ejecutar el siguiente script Bash para cortar el vídeo en partes individuales:

#!/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"

Guarde este archivo como cut.sh(o similar), luego ejecute:

chmod +x cut.sh
./cut.sh /path/to/input.mp4 /path/to/editList.csv

Copiará los flujos de bits de vídeo y audio en archivos de salida, numerados secuencialmente con el sufijo 00001, 00002etc.


Antigua respuesta a continuación...

Una vez escribí un script Ruby que hace exactamente eso. Necesita Ruby ≥1.9.2 (por ejemplo, hastaRVM) y una versión reciente deFFmpeginstalado (veraquísobre cómo instalar desde la fuente).

  1. Mi guión está disponible aquí:video-extract.rb

  2. Debe alimentarlo con una lista de ediciones de entrada CSV, que contiene lo más importante las siguientes columnas:

  • un prefijo (puede estar vacío)
  • una identificación de video (algún número secuencial)
  • el nombre del archivo de entrada
  • el punto de entrada en HH:MM:SS.mso segundos
  • la duración de la edición en HH:MM:SS.mso segundos

Por ejemplo (tenga en cuenta que la Outcolumna no se utiliza):

  1. Luego, ajuste las variables en el encabezado del script. Lo más importante es cambiar COPYa truesi desea una copia de flujo de bits y no volver a codificar. Cambie también el índice de las columnas CSV y el separador CSV.

No dudes en mejorar el script o sugerir cambios (especialmente si ya conoces Ruby). He usado este script muy a menudo y todavía no he tenido problemas. Lo único que falta es la compatibilidad de audio adecuada: simplemente copiará la transmisión de audio, lo que podría funcionar o no en su caso. En caso de problemas, informe.

Si necesita calcular la diferencia entre un punto de entrada y de salida, puede hacerlo con este pequeño script de Ruby, basado enestas preguntas y respuestas de desbordamiento de pila:

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

Simplemente crea un archivo llamado ins.txty outs.txtdonde cada línea corresponde a un punto de entrada y salida (vea la captura de pantalla anterior). La diferencia se escribirá en diffs.txt. Simple como eso.

Respuesta2

MEncoder es tu amigo aquí. Es una gran herramienta para operaciones de secuencias de comandos en video. Lo uso mucho para crear archivos de vídeo a partir de fotogramas individuales.

Encontré este script en Perl que podría hacer exactamente lo que quieres:Video Cutter V2: Corte de video usando Mencoder

Respuesta3

Intentarffmpeg.

Por ejemplo:

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

Abrirá el archivo de video original ( -i original.mpg), omitirá los primeros 20 segundos ( -ss 20) y luego guardará 30 segundos ( -t 30) en una nueva película llamadanewmovie.mpg

información relacionada