Ich möchte Videos mit ffmpeg für maschinelles Lernen schneiden.
Wie kann ich sicherstellen, dass, wenn ich beispielsweise 1 Sekunde Video mit 25 Bildern pro Sekunde schneide, genau 25 Bilder synchronisiertes Audio und Video entstehen?
Ich habe gesehen, dass ffmpeg beim Schneiden nach Keyframes sucht und den nächsten auswählt. Ich hatte Probleme, da es negative Zeitstempel generierte und das Ende des geschnittenen Videos mit kopierten Frames füllte.
Ich verstehe, dass in den Metadaten keine tatsächlichen fps usw. angezeigt werden.
Wie sähe also die Pipeline aus, um präzise Schnitte mit der exakten Anzahl von Frames zu erhalten, die auf den Audiostream abgestimmt sind?
Danke
Antwort1
Abhängig vom Codec und Container des Videos sind hierfür möglicherweise einige kontraintuitive Schritte erforderlich: Viele Codecs erlauben einfach keine direkten zufälligen In- und Outpoints.
- Zuerst müssen Sie das Video schneiden (den Ton ignorieren wir für einen Moment). Dies geschieht am besten mit
-ss inpoint
einer-pix_fmt yuv420p -an -f yuv4mpegpipe -frames:v 25
oderx264
mehreren Instanzen von ffmpeg. Dies hat sich als zuverlässige Methode erwiesen, um den Videostream bildgenau zu schneiden. - Für Audio ist die Konvertierung in
-c:a pcm_s16le
„-f s16le“ am einfachsten. Anschließend bearbeitet man das Ergebnis auf Dateiebene, sodass es die richtige Anzahl Bytes ab dem richtigen Offset enthält. - In einem letzten
ffmpeg
Durchgang kann das Audio bei Bedarf komprimiert oder einfach in das Video gemultiplext werden. Da Roh-PCM keine Zeitstempel enthält, besteht kein Potenzial für Asynchronität.
Dies hat sich als zuverlässige Methode erwiesen, Videos aus zweifelhaften Quellen (z. B. Werbeclips von einem Werbetreibenden) in einen stark regulierten linearen Stream (z. B. einen Fernsehkanal) einzufügen, ohne dass dabei Artefakte auftreten.