Ich habe viele hundert Videos, jedes ein paar Minuten lang und denen eine Intro- und Outro-Sequenz angehängt wurde, die ich automatisch entfernen möchte. Unmittelbar nach der Intro-Sequenz und unmittelbar vor der Outro-Sequenz befindet sich immer ein vollständig schwarzer Rahmen.
Gibt es eine Möglichkeit, im Batch (für alle Videos in einem Ordner, macOS High Sierra) das gesamte Material vor dem ersten schwarzen Bild in einem Video zu erkennen und zu entfernen? (Ich habe die gleiche Frage zum Entfernen der Outro-Sequenz, falls es eine praktikable Lösung gibt.)
Danke dir.
Sie können versuchen, das ffprobe - Szenenerkennungstool zu verwenden, um die schwarze Framezeit zu finden, und dann ffmpeg verwenden, um zu suchen und zu trimmen.
Ich bin nicht sehr gut im Scripting, aber hier ist etwas, das Sie ausprobieren können. Es ist sehr wichtig, dass der schwarze Rahmen nur ein einziger Rahmen ist, damit dies funktioniert! Außerdem ist das Szene-Tool von ffprobe sehr wählerisch in Bezug auf Dateipfade. Stellen Sie daher sicher, dass der Dateiname oder Dateipfad der Videos, die Sie bearbeiten müssen, keine Leerzeichen oder Sonderzeichen enthält.
Kopieren Sie den folgenden Code und fügen Sie ihn in eine Bash- oder Befehlsskriptdatei ein. Ich werde jeden Schritt durchgehen, um zu erklären, was danach passiert.
#!/bin/bash
echo "Enter Source Folder"
read input
cd "$input"
mkdir -p "$input"/output
dir="$input"/output
for video in *; do
if [[ -f "$video" ]]; then
filename="${video%.*}"
extension="${video##*.}"
mkdir "$dir"/"$filename"
dest="$dir"/"$filename"
ffprobe -show_frames -of compact=p=0 -f lavfi "movie="$video",select=gt(scene\,0.9)" -show_entries frame=best_effort_timestamp_time > tmp.txt
sed -e 's/.*best_effort_timestamp_time=\(.*\)|tag:lavfi.scene_score.*/\1/' tmp.txt > chapter.txt
rm tmp.txt
file=chapter.txt
while read line
do
time+=($line)
done <"$file"
ffmpeg -i "$video" -ss "${time[0]}" -to "${time[1]}" "$dest"/middle-"$filename"."$extension"
rm chapter.txt
fi
done
Nervenzusammenbruch
Bestimmen Sie den Ordner, der die Videos enthält, die Sie zuschneiden möchten, und legen Sie ihn als Arbeitsverzeichnis fest.
#!/bin/bash
echo "Enter Source Folder"
read input
cd "$input"
Ausgabeverzeichnis erstellen
mkdir -p "$input"/output
dir="$input"/output
Gehen Sie für jede Datei im Ordner wie folgt vor:
Erstellen Sie für jedes Video ein neues Ausgabeverzeichnis
for video in *; do
if [[ -f "$video" ]]; then
filename="${video%.*}"
extension="${video##*.}"
mkdir "$dir"/"$filename"
dest="$dir"/"$filename"
Finden Sie alle Frames, die sich um 9/10 vom Frame davor unterscheiden, und speichern Sie die Zeit in einer TXT-Datei.
ffprobe -show_frames -of compact=p=0 -f lavfi "movie="$video",select=gt(scene\,0.9)" -show_entries frame=best_effort_timestamp_time > tmp.txt
Textdatei bereinigen und ersetzen.
sed -e 's/.*best_effort_timestamp_time=\(.*\)|tag:lavfi.scene_score.*/\1/' tmp.txt > chapter.txt
rm tmp.txt
Array-Variable mal aus der Textdatei erstellen.
file=chapter.txt
while read line
do
time+=($line)
done <"$file"
Schneiden Sie das Video zwischen den beiden schwarzen Rahmen.
ffmpeg -i "$video" -ss "${time[0]}" -to "${time[1]}" "$dest"/middle-"$filename"."$extension"
Nicht mehr benötigte Textdatei löschen und beenden.
rm chapter.txt
fi
done
Benutzerdefinierter Soundtrack
aclab28