Skript zum Schneiden von Videos basierend auf der Bearbeitungsliste

Skript zum Schneiden von Videos basierend auf der Bearbeitungsliste

Ich habe jede Menge Spielaufnahmen aus der Saison meiner Fußballmannschaft und habe jedem meiner Teamkollegen ein Spiel zum Anschauen zugeteilt und die Zeitintervalle mit den Höhepunkten notiert.

Anstatt das alles jetzt manuell ausschneiden zu müssen, möchte ich ein Skript schreiben, das das für mich erledigt. Ich kenne mich mit Shell-Skripten, Python und Ruby aus.

Kennt jemand von euch gute Videobearbeitungstools, mit denen sich diese Aufgabe automatisieren lässt? Ich hatte gehofft, die Intervalle in eine einfache Eingabedatei einfügen zu können, die meine Teamkollegen verwenden können.

Antwort1

Dazu benötigen Sie FFmpeg (laden Sie sich einestatischer Aufbau) und Bash.

Erstellen Sie eine CSV-ähnliche Liste von Eingabe- und Ausgabepunkten, zB:

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

Anschließend können Sie das folgende Bash-Skript ausführen, um das Video in einzelne Teile zu schneiden:

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

Speichern Sie diese Datei unter cut.sh(oder einer ähnlichen Datei) und führen Sie dann Folgendes aus:

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

Dabei werden die Video- und Audio-Bitströme in Ausgabedateien kopiert und mit der Endung 00001, 00002usw. fortlaufend nummeriert.


Alte Antwort unten …

Ich habe einmal ein Ruby-Skript geschrieben, das genau das tut. Sie benötigen Ruby ≥1.9.2 (z. B. durchRVM) und eine aktuelle Version vonFFmpeginstalliert ist (sieheHierInformationen zur Installation aus der Quelle).

  1. Mein Skript ist hier verfügbar:video-extract.rb

  2. Sie müssen es mit einer CSV-Eingabeliste der Änderungen füttern, die vor allem die folgenden Spalten enthält:

  • ein Präfix (kann leer sein)
  • eine Video-ID (eine fortlaufende Nummer)
  • der Name der Eingabedatei
  • der In-Punkt in HH:MM:SS.msoder Sekunden
  • die Länge der Bearbeitung in HH:MM:SS.msSekunden

Beispiel (beachten Sie, dass die OutSpalte nicht verwendet wird):

  1. Passen Sie dann die Variablen im Skriptkopf an. Ändern Sie vor allem COPYin true, wenn Sie eine Bitstream-Kopie und keine Neucodierung wünschen. Ändern Sie auch den Index der CSV-Spalten und das CSV-Trennzeichen.

Fühlen Sie sich frei, das Skript zu verbessern oder Änderungen vorzuschlagen (insbesondere, wenn Sie bereits Ruby kennen). Ich habe dieses Skript sehr oft verwendet und bin bisher auf keine Probleme gestoßen. Das einzige, was fehlt, ist eine richtige Audiounterstützung – es kopiert einfach den Audiostream, was in Ihrem Fall funktionieren kann, aber nicht muss. Melden Sie sich im Problemfall wieder.

Wenn Sie die Differenz zwischen einem In- und Out-Point berechnen müssen, können Sie dies mit diesem kleinen Ruby-Skript tun, basierend aufdiese Stack Overflow-Fragen und -Antworten:

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

Sie erstellen einfach eine Datei mit dem Namen ins.txtund , outs.txtwobei jede Zeile einem In- und Out-Point entspricht (siehe Screenshot oben). Die Differenz wird in geschrieben diffs.txt. So einfach ist das.

Antwort2

MEncoder ist hier dein Freund. Es ist ein großartiges Tool für Skriptoperationen an Videos. Ich verwende es häufig, um Videodateien aus einzelnen Frames zu erstellen.

Ich habe dieses Perl-Skript gefunden, das möglicherweise genau das tut, was Sie möchten:Video Cutter V2: Videoschneiden mit Mencoder

Antwort3

Versuchenffmpeg.

Zum Beispiel:

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

Öffnet die ursprüngliche Videodatei ( -i original.mpg), überspringt die ersten 20 Sekunden ( -ss 20) und speichert dann 30 Sekunden ( -t 30) in einem neuen Film namensnewmovie.mpg

verwandte Informationen