953 Stimmen

Das Zuschneiden der Videos basierend auf der Start- und Endzeit unter Verwendung von ffmpeg

Ich habe versucht, das Video mit dem Start- und Endzeitpunkt des Videos mithilfe des folgenden Befehls zu schneiden

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

Mit dem obigen Befehl möchte ich das Video von 00:00:03 bis 00:00:08 schneiden. Aber es schneidet das Video nicht zwischen diesen Zeiten, sondern schneidet stattdessen das Video mit den ersten 11 Sekunden. Kann mir jemand helfen, wie ich das lösen kann?

Bearbeiten 1:

Ich habe versucht, den folgenden Befehl zu verwenden, der von mark4o vorgeschlagen wurde

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

Aber es wurde der folgende Fehler angezeigt.

Der Encoder 'aac' ist experimentell, aber experimentelle Codecs sind nicht aktiviert.

Daher habe ich das -strict -2 in den Befehl hinzugefügt, d.h.

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

Jetzt funktioniert es gut.

1271voto

George Chalhoub Punkte 12519

Versuchen Sie es mit folgendem. Es ist der schnellste und beste Weg mit ffmpeg, 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!

Erklärung des Befehls:

-i: Hier wird die Eingabedatei angegeben. In diesem Fall ist es (input.mp4).
-ss: Wird mit -i verwendet, dies navigiert in der Eingabedatei (input.mp4) zur Position.
00:01:00: Dies ist die Zeit, mit der Ihr zugeschnittenes Video beginnen wird.
-to: 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 enden wird.
-c copy: Dies ist eine Option zum Schneiden per Streamkopie. (Hinweis: Sehr schnell)

Das Zeitformat ist: hh:mm:ss

Bitte beachten Sie, dass die aktuell hoch bewertete Antwort veraltet ist und das Schneiden extrem langsam wäre. Für weitere Informationen schauen Sie sich diesen offiziellen ffmpeg Artikel an.

830voto

mark4o Punkte 55639

Sie haben wahrscheinlich kein Schlüsselbildmarkierungspunkt bei der 3-Sekunden-Marke. Da Nicht-Schlüsselbildmarkierungen Unterschiede zu anderen Frames codieren, benötigen sie alle Daten beginnend mit dem vorherigen Schlüsselbild.

Mit dem mp4-Container ist es möglich, an einer Nicht-Schlüsselbildmarkierungspunkt zu schneiden, ohne eine erneute Codierung mit einer Schnittliste zu verwenden. Anders ausgedrückt, wenn das nächstliegende Schlüsselbild vor 3s bei 0s liegt, wird es das Video ab 0s kopieren und eine Schnittliste verwenden, um dem Player mitzuteilen, dass er 3 Sekunden später abspielen soll.

Wenn Sie das neueste ffmpeg aus dem git-Master verwenden, wird dies mit einer Schnittliste ausgeführt, wenn der von Ihnen bereitgestellte Befehl aufgerufen wird. Wenn dies bei Ihnen nicht funktioniert, verwenden Sie wahrscheinlich eine ältere Version von ffmpeg oder Ihr Player unterstützt keine Schnittlisten. Einige Player ignorieren die Schnittliste und spielen immer alle Medien im File von Anfang bis Ende ab.

Wenn Sie genau an einer Nicht-Schlüsselbildmarke schneiden möchten und möchten, dass sie auf einem Player abgespielt wird, der keine Schnittlisten unterstützt, oder sicherstellen möchten, dass der geschnittene Teil nicht tatsächlich in der Ausgabedatei enthalten ist (z. B. wenn vertrauliche Informationen enthalten sind), dann können Sie dies durch eine erneute Kodierung tun, so dass genau zum gewünschten Startzeitpunkt ein Schlüsselbild vorhanden ist. Eine erneute Kodierung ist die Standardoption, wenn Sie nicht copy angeben. Zum Beispiel:

ffmpeg -i film.mp4 -ss 00:00:03 -t 00:00:08 -async 1 geschnitten.mp4

Bei einer erneuten Kodierung möchten Sie möglicherweise auch zusätzliche qualitätsbezogene Optionen oder einen bestimmten AAC-Encoder einschließen. Weitere Informationen finden Sie im x264-Enkodierungsleitfaden von ffmpeg für Video und im AAC-Enkodierungsleitfaden für Audio.

Außerdem gibt die Option -t eine Dauer an, keine Endzeit. Der obige Befehl wird 8 Sekunden Video ab 3 Sekunden kodieren. Um bei 3s zu beginnen und bei 8s aufzuhören, verwenden Sie -t 5. Wenn Sie eine aktuelle Version von ffmpeg verwenden, können Sie auch -t durch -to im obigen Befehl ersetzen, um zur angegebenen Zeit aufzuhören.

120voto

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

Verwenden Sie -c copy, um dies sofort zu tun. In diesem Fall wird ffmpeg das Video nicht neu kodieren, sondern nur auf die gewünschte Größe zuschneiden.

54voto

alper Punkte 2227

Hier ist, was ich benutze und nur ein paar Sekunden dauern wird, um zu laufen:

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

Referenz: Videodateien mit FFmpeg zuschneiden von Alexander Refsum Jensenius.


Generierte mp4 Dateien könnten auch in iMovie verwendet werden. Weitere Informationen zur Ermittlung der Gesamtdauer mit dem get_duration(input_video) Modell.

Wenn Sie mehrere geschnittene Szenen zusammenfügen möchten, können Sie folgendes 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 fusioniert Szenen zwischen 00:00:00 - 00:00:10 und 00:06:00 - 00:07:00.


Wenn Sie das komplette Video schneiden möchten (falls Sie das Format mkv in mp4 konvertieren möchten), kommentieren Sie einfach die folgende Zeile aus:

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

38voto

JFMD Punkte 397
    ffmpeg -i movie.mp4 -vf trim=3:8 cut.mp4

Alles außer von Sekunde 3 bis Sekunde 8 entfernen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X