Wie kann ich alles Material aus Videos stapelweise entfernen, das vor dem ersten komplett schwarzen Bild kommt?

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.

Antworten (1)

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:

  1. Stellen Sie sicher, dass es sich um eine Datei und nicht um einen Ordner handelt
  2. Speichern Sie den Dateinamen und die Erweiterung als Variable
  3. 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"
    
  4. 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
    
  5. Textdatei bereinigen und ersetzen.

    sed -e 's/.*best_effort_timestamp_time=\(.*\)|tag:lavfi.scene_score.*/\1/' tmp.txt > chapter.txt
    rm tmp.txt
    
  6. Array-Variable mal aus der Textdatei erstellen.

    file=chapter.txt
    while read line
    do
        time+=($line)   
    done <"$file"
    
  7. Schneiden Sie das Video zwischen den beiden schwarzen Rahmen.

    ffmpeg -i "$video" -ss "${time[0]}" -to "${time[1]}" "$dest"/middle-"$filename"."$extension"
    
  8. Nicht mehr benötigte Textdatei löschen und beenden.

    rm chapter.txt
    fi
    done
    
Hmm ... Ich erhalte die Fehlermeldung "mkdir: /output: Permission denied mkdir: /output: No such file or directory". (Ich werde versuchen, meinen Bruder - der die Befehlszeile gut kennt - zu benutzen, um diesen Teil zu überwinden.)
Da es sich anscheinend um ein Berechtigungsproblem handelt, versuchen Sie, es unter Sudo auszuführen