Beschneiden und Zusammenfügen von Mediendateien mit ffmpeg

1740
Anmol Singh Jaggi

Ich versuche, ein Segment (00:26:00 - 00:32:30) aus einer Videodatei zu entfernen input.mp4.
Da es keine Möglichkeit gibt, dies direkt mit ffmpeg zu tun (soweit ich weiß), schneide ich stattdessen die Segmente, die ich in der Ausgabe haben möchte, und verketten sie dann.

Nach einer kurzen Suche habe ich herausgefunden, dass es zwei Möglichkeiten gibt, dies zu tun:

Leider scheitern beide Methoden für mich.

Ich werde die Schritte erklären, die ich in beiden Methoden ausgeführt habe:

1. Verwendung von trim:

BEARBEITEN: Diese Methode funktioniert jetzt; Springe stattdessen zur zweiten Methode.

Befehl verwendet:

ffmpeg -i input.mp4 -filter_complex \ "[0:v]trim=duration=00:26:00[a]; \ [0:v]trim=start=00:32:30,setpts=PTS-STARTPTS[b]; \ [a][b]concat[c]" -map [c] out.mp4 

Befehlsausgabe: Link

Die Ausgabedatei ist weniger als 1 Minute lang und hat nur 6,8 MB, während die Eingabedatei 900 MB betrug.

2. Verwenden von seek

Befehl verwendet:

# Cut first wanted segment ffmpeg -ss 00:00:00 -i input.mp4 -t 00:26:00 -c copy -avoid_negative_ts 1 first.mp4  # Cut second wanted segment ffmpeg -ss 00:32:30 -i input.mp4 -c copy -avoid_negative_ts 1 second.mp4  # Combine all the wanted segments ffmpeg -f concat -i input.txt -c copy output.mp4 

wo input.txtenthält:

file first.mp4 file second.mp4 

Befehlsausgabe: Ein Link (Der Fehler wird auf der Leitung erwähnt 90: input.txt: Invalid argument)

Die Ausgabedatei, die ich in diesem Fall bekomme, beträgt nur etwa 500 MB (Eingabedatei 900 MB) und enthält das erste Video + die ersten paar Minuten des zweiten Videos.

Meine Systemdetails:

  • Ubuntu 14.04

  • ffmpeg-Version: Link

BEARBEITEN:

Die Verwendung von Methode 1 trimfunktioniert nun dank des Kommentars von @ Mulvya, der das Schreiben von Sekunden als Zeiteinheit anstelle der HH: MM: SS-Notation angibt, da diese defekt ist .

Neuer Befehl:

ffmpeg -i input.mp4 -filter_complex \ "[0:v]trim=duration=1500[av]; \ [0:a]atrim=duration=1500[aa];\ [0:v]trim=start=1980,setpts=PTS-STARTPTS[bv]; \ [0:a]atrim=start=1980,asetpts=PTS-STARTPTS[ba];\ [av][bv]concat[outv]; [aa][ba]concat=v=0:a=1[outa]" \ -map [outv] -map [outa] out.mp4 

Aber ich möchte immer noch wissen, was mit der zweiten Methode nicht stimmt.

0
Warum bei der Suchmethode der Dauerindikator '-t' im 2. Befehl? Gyan vor 8 Jahren 0
@ Mulvya Gibt die Dauer des Ausschnitts an. Nun, da Sie es erwähnt haben, sehe ich, dass ich einen kleinen Fehler gemacht habe: Anstelle von -t 00: 53: 50 im zweiten Befehl hätte es -t 00: 21: 20 sein sollen. Anmol Singh Jaggi vor 8 Jahren 0
@ Mulvya Auch nachdem ich das korrigiert habe, erhalte ich den gleichen Fehler. Alos, ich habe das korrigiert, ist die Frage. Anmol Singh Jaggi vor 8 Jahren 0
`trim` funktioniert nicht mit HH: MM: SS [derzeit] (http://superuser.com/q/1061274/114058). Geben Sie in Sekunden an. Und was ich damit gemeint habe, war, da Sie die Datei bis auf das Ende bis auf einen Teil in der Mitte haben möchten, müssen Sie im zweiten Befehl kein "t" angeben. Wenn der Fehler weiterhin auftritt, kopieren Sie die gesamte Datei in einen neuen Container und versuchen Sie es erneut: `ffmpeg -i input -c copy new.mp4` Gyan vor 8 Jahren 0
Okay, ich habe was Sie sagen wollen. Ich habe die Frage entsprechend bearbeitet. Anmol Singh Jaggi vor 8 Jahren 0
@ Mulvya Ich habe dasselbe versucht, nachdem ich in einen neuen Container kopiert habe, aber ich bekomme den gleichen Fehler. Anmol Singh Jaggi vor 8 Jahren 0
Einige andere nützliche Informationen: Das Segment, das ich entfernen möchte, sieht beschädigt aus; Das Video scheint mit der Zeit im selben Frame zu stecken. Anmol Singh Jaggi vor 8 Jahren 0
@ Mulvya Überprüfen Sie die Änderungen an der Frage. Hast du eine Idee bezüglich der zweiten Methode? Anmol Singh Jaggi vor 8 Jahren 0
Ich habe noch eine andere Frage: Führt eine dieser Methoden zu einer Verringerung der Videoqualität des Ausgangs? Anmol Singh Jaggi vor 8 Jahren 0

1 Antwort auf die Frage

1
Gyan

The trim filter does not work with HH:MM:SS currently. Specify in seconds. This method re-encodes the video, so there is a reduction in quality. You can specify a CRF value e.g. -crf 20 to control quality. Lower values produce better quality but larger files. 18 to 28 is a decent range to try.

As for the second method, try by specifying the cutpoints in the text file i.e.

file 'input.mp4' duration 1560 file 'input.mp4' inpoint 1980 

and then run

ffmpeg -f concat -i input.txt -c copy -fflags +genpts -avoid_negative_ts make_zero output.mp4 
Danke für den Tipp zur Qualität. Die zweite Methode funktioniert immer noch nicht. Die Ausgabedatei enthält überhaupt kein zweites Video. Seine Größe entspricht fast dem ersten Video. [Here] (http://pastebin.com/ZMCEDPwj) ist das Protokoll. Anmol Singh Jaggi vor 8 Jahren 0
Die Concat-Liste muss sich auf die gesamte Eingabedatei beziehen. Gyan vor 8 Jahren 0
Okay, das habe ich auch ausprobiert, aber ich bekomme den gleichen "input.txt: Invalid argument" -Fehler, wobei die zweite Videodatei in der Ausgabedatei fehlt. Anmol Singh Jaggi vor 8 Jahren 0