Wie kann ich mit FFmpeg mehrere Segmente aus einem Video entfernen und dabei den Ton beibehalten?

1

Ich habe die in der Antwort auf "Wie kann ich mit FFmpeg mehrere Segmente aus einem Video entfernen?" Beschriebene Methode ausprobiert. Es funktioniert gut, außer dass das Audio fehlt. Kann jemand vorschlagen, wie man das Video und das Audio in die Ausgabe erhält?

Beispiel:
Ich habe im Urlaub ein 2-minütiges Video von einem Känguru aufgenommen. Es gibt 2 Abschnitte davon (beide ungefähr 6 Sekunden lang), die ich (einschließlich des Audios) mit nur diesen 2 süßen Teilen in ein einzelnes, kurzes Stück extrahieren möchte.
Ich weiß, dass ich zwei separate Bits extrahieren und sie verbinden kann, aber der oben erwähnte Artikel hat es mir ermöglicht, genau das zu tun, was ich wollte, aber ES GIBT KEIN AUDIO, wenn Sie dieser Methode folgen.
Ich möchte einen ähnlichen einzigen Aufruf von ffMpeg verwenden.

BruceR
quelle
NEIN, dies ist kein Duplikat. Es ist wirklich eine Erweiterung. So erhalten Sie sowohl Audio als auch Video.
BruceR
2
Bitte klären Sie: Möchten Sie einen Abschnitt aus einer längeren Datei erhalten, und dieser kleinere Abschnitt sollte sowohl Audio als auch Video enthalten? Oder ist es etwas anderes? Bitte bearbeiten Sie Ihre Frage und fügen Sie zur Veranschaulichung einen Beispielfall hinzu.
Rajib
Ich habe das Original wie gewünscht bearbeitet. Ich finde es seltsam, dass einige Leute auf meine Frage als Duplikat verweisen, als ich den Artikel in meiner Frage erwähnte und um Hilfe bei der Erweiterung der Funktionalität bat. Das zeigt einen Mangel an Forschung durch die Befragten, nicht ich.
BruceR
Die ursprüngliche Antwort von ptQa im referenzierten Thread enthielt keinen Audio-Stream. In der Antwort unten finden Sie den hinzugefügten Audiostream und die Pads. Der zweistufige Ablauf ist nur der Vollständigkeit halber angegeben.
Rajib

Antworten:

5

Hier gehe ich davon aus, dass sich Ihre Originaldatei im mp4Container befindet, aber die Methode sollte auch für andere Container funktionieren.

Ein-Schritt-Methode - (etwas komplizierter) Siehe auch die Antwort von ptQa im referenzierten Thread. Aber hier ist das gleiche mit Audio hinzugefügt:

ffmpeg -i inputfile.mp4 -filter_complex "[0:v]trim=start=10:end=16,setpts=PTS-STARTPTS[a];  [0:v]trim=start=20:end=26,setpts=PTS-STARTPTS[b]; [0:a]atrim=start=10:end=16,asetpts=PTS-STARTPTS[c]; [0:a]atrim=start=20:end=26,asetpts=PTS-STARTPTS[d]; [a][c][b][d]concat=n=2:v=1:a=1[e][f]" -map '[e]' -map '[f]' -strict -2 outputfile.mp4    

Dies fügt den Audiostream und die erforderlichen Pads hinzu, um Audio zu erhalten.

Der Vollständigkeit halber vorgesehen:

Der einfache Weg: Sie können den 2-Schritt-Prozess verwenden, den Sie bereits kennen:

Zuerst schneiden und extrahieren Sie die 2 Stücke , die Sie aus dem Video in voller Länge möchten.
2. Verbinden Sie diese 2 Teile miteinander.

Dies sollte der einfache Ausweg sein.

So schneiden Sie ein Stück von etwa der dritten Sekunde bis zur neunten Sekunde ab:

ffmpeg -i in.mp4 -ss 00:00:03 -to 00:00:09 -c:v copy -c:a copy part1.mp4    

Sie können den Vorgang für den zweiten Teil wiederholen. Wenn es von der 10. bis zur 16. Sekunde ist:

ffmpeg -i in.mp4 -ss 00:00:10 -to 00:00:16 -c:v copy -c:a copy part2.mp4

Weitere Informationen finden Sie in diesem Thread.

Jetzt haben Sie 2 Dateien, die Sie verbinden können. Sie können auf mindestens 3 verschiedene Arten "verketten". Die Möglichkeit, dies ohne Neucodierung zu tun, besteht darin, dies über die Option demuxer zu tun. Erstelle eine Textdatei namens (say) joinlist.txt mit folgendem Inhalt:

file 'part1.mp4'
file 'part2.mp4'

Um die beiden Dateien zu verbinden, platzieren Sie die beiden Filme und den Text (joinlist.txt) im selben Ordner und verwenden Sie diesen Befehl:

ffmpeg -f concat -i joinlist.txt -c copy joinedfile.mp4
Rajib
quelle
Danke, Rajib, genau das habe ich gesucht. Ich hatte eine Reihe von Möglichkeiten zur Auswahl von Audio ausprobiert, aber das Definieren der 2 Videobits und der 2 Audiobits als Ausgabe, die für den nächsten Schritt geeignet war, entging meinen verschiedenen Versuchen (Vermutungen!) An der Syntax. Nochmals
vielen
Wenn dies Ihr Problem löst, möchten Sie die Antwort möglicherweise mit dem Häkchen akzeptieren.
Rajib
Hervorragend! Vielen Dank, Rajib! Dies war der einfachste Code, den ich für Antworten im Zusammenhang mit ffmpeg gefunden habe. Es ist klar erklärt.
Mugen