GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Schneiden der Videos basierend auf Start- und Endzeit mit ffmpeg

Versuchen Sie, dies zu verwenden. Es ist der schnellste und beste ffmpeg-Weg, den ich herausgefunden habe:

 ffmpeg -ss 00:01:00 -to 00:02:00  -i input.mp4 -c copy output.mp4

Dieser Befehl schneidet Ihr Video in Sekunden!

Erläuterung des Befehls:

-i: Dies gibt die Eingabedatei an. In diesem Fall ist es (input.mp4).
-ss: Wird mit -i verwendet, sucht dies in der Eingabedatei (input.mp4) nach Position.
00:01:00: Dies ist die Zeit, mit der Ihr zugeschnittenes Video beginnt.
-an: Dies gibt die Dauer vom Start (00:01:40) bis zum Ende (00:02:12) an.
00:02:00: Dies ist die Zeit, mit der Ihr zugeschnittenes Video endet.
-c kopieren: Dies ist eine Option zum Trimmen per Stream Copy. (Achtung:sehr schnell)

Das Zeitformat ist:hh:mm:ss

Bitte beachten Sie, dass die aktuelle hoch bewertete Antwort veraltet ist und das Trimmen extrem langsam wäre. Weitere Informationen finden Sie in diesem offiziellen ffmpeg-Artikel.


Folgendes verwende ich und dauert nur einige Sekunden ausführen:

ffmpeg -i input.mp4 -ss 01:19:27 -to 02:18:51 -c:v copy -c:a copy output.mp4

Referenz:Videodateien mit FFmpeg trimmen von Alexander Refsum Jensenius .

Generiert mp4 Dateien könnten auch in iMovie verwendet werden . Weitere Informationen zum Abrufen der vollen Dauer mithilfe des get_duration(input_video)-Modells.

Wenn Sie mehrere Zwischensequenzen verketten möchten, können Sie das folgende Python-Skript verwenden:

#!/usr/bin/env python3

import subprocess

def get_duration(input_video):
    cmd = ["ffprobe", "-i", input_video, "-show_entries", "format=duration",
           "-v", "quiet", "-sexagesimal", "-of", "csv=p=0"]
    return subprocess.check_output(cmd).decode("utf-8").strip()


def main():
    name = "input.mkv"
    times = []
    times.append(["00:00:00", "00:00:10"])
    times.append(["00:06:00", "00:07:00"])
    # times = [["00:00:00", get_duration(name)]]
    if len(times) == 1:
        time = times[0]
        cmd = ["ffmpeg", "-i", name, "-ss", time[0], "-to", time[1], "-c:v", "copy", "-c:a", "copy", "output.mp4"]
        subprocess.check_output(cmd)
    else:
        open('concatenate.txt', 'w').close()
        for idx, time in enumerate(times):
            output_filename = f"output{idx}.mp4"
            cmd = ["ffmpeg", "-i", name, "-ss", time[0], "-to", time[1], "-c:v", "copy", "-c:a", "copy", output_filename]
            subprocess.check_output(cmd)

            with open("concatenate.txt", "a") as myfile:
                myfile.write(f"file {output_filename}\n")

        cmd = ["ffmpeg", "-f", "concat", "-i", "concatenate.txt", "-c", "copy", "output.mp4"]
        output = subprocess.check_output(cmd).decode("utf-8").strip()
        print(output)


if __name__ == "__main__":
    main()

Das Beispielskript schneidet und fügt Szenen zwischen 00:00:00 - 00:00:10 zusammen und 00:06:00 - 00:07:00 .

Wenn Sie das komplette Video schneiden möchten (falls Sie mkv in mp4 formatieren ) Kommentieren Sie einfach die folgende Zeile aus:

# times = [["00:00:00", get_duration(name)]]

ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 -c copy cut.mp4 

Verwenden Sie -c kopieren für sofort machen. In diesem Fall wird ffmpeg das Video nicht neu kodieren, sondern nur auf die entsprechende Größe zuschneiden.


Sie haben wahrscheinlich keinen Keyframe an der 3-Sekunden-Marke. Da Nicht-Keyframes Unterschiede zu anderen Frames codieren, benötigen sie alle Daten beginnend mit dem vorherigen Keyframe.

Mit dem mp4-Container ist es möglich, an einem Nicht-Keyframe ohne Neucodierung mithilfe einer Bearbeitungsliste zu schneiden. Mit anderen Worten, wenn der nächste Keyframe vor 3s bei 0s liegt, wird das Video ab 0s kopiert und eine Bearbeitungsliste verwendet, um dem Player mitzuteilen, dass er nach 3 Sekunden mit der Wiedergabe beginnen soll.

Wenn Sie das neueste ffmpeg von Git Master verwenden, wird dies mithilfe einer Bearbeitungsliste durchgeführt, wenn es mit dem von Ihnen bereitgestellten Befehl aufgerufen wird. Wenn dies bei Ihnen nicht funktioniert, verwenden Sie wahrscheinlich entweder eine ältere Version von ffmpeg oder Ihr Player unterstützt keine Bearbeitungslisten. Einige Player ignorieren die Bearbeitungsliste und spielen immer alle Medien in der Datei von Anfang bis Ende ab.

Wenn Sie genau beginnend an einem Nicht-Keyframe schneiden möchten und möchten, dass es beginnend an der gewünschten Stelle auf einem Player abgespielt wird, der keine Bearbeitungslisten unterstützt, oder sicherstellen möchten, dass sich der geschnittene Teil nicht tatsächlich in der Ausgabedatei befindet (z wenn es vertrauliche Informationen enthält), können Sie dies durch erneutes Codieren tun, sodass genau zur gewünschten Startzeit ein Schlüsselbild vorhanden ist. Die Neucodierung ist die Standardeinstellung, wenn Sie copy nicht angeben . Zum Beispiel:

ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 cut.mp4

Bei der Neucodierung möchten Sie möglicherweise auch zusätzliche qualitätsbezogene Optionen oder einen bestimmten AAC-Codierer einbeziehen. Einzelheiten finden Sie im x264 Encoding Guide von ffmpeg für Video und im AAC Encoding Guide für Audio.

Auch die -t Option gibt eine Dauer an, keine Endzeit. Der obige Befehl codiert 8 Sekunden Video, beginnend bei 3 Sekunden. Um bei 3s zu beginnen und bei 8s zu enden, verwenden Sie -t 5 . Wenn Sie eine aktuelle Version von ffmpeg verwenden, können Sie auch -t ersetzen mit -to im obigen Befehl, um zur angegebenen Zeit zu enden.


Linux
  1. Verwenden des Apache2Buddy-Skripts für Leistung und Stabilität

  2. Was ist der Unterschied beim Umleiten einer Ausgabe mit >, &>, >&und 2&>?

  3. Systemd:Sowohl After als auch Requires verwenden

  4. Ping und tcpdump gleichzeitig

  5. Verwenden von awk zum Summieren der Werte einer Spalte basierend auf den Werten einer anderen Spalte

So erhalten Sie das aktuelle Datum und die aktuelle Uhrzeit in Python

So vergrößern und verkleinern Sie Videos mit FFmpeg

Das vollständige Handbuch zur Verwendung von ffmpeg unter Linux

Ausgabe nach Stdout und gleichzeitig Grep in eine Datei?

Firefox erreicht die großen 100 und es ist an der Zeit, diesen Open-Source-Browser zu verwenden

Wie sind CPU-Zeit und CPU-Auslastung gleich?