Ich habe .mp4
Dateien, die mit einer Sony A7s-Kamera erstellt wurden. Sie verwenden den XAVC S-Codec. Ich konvertiere sie .mov
mit dem folgenden Befehl. Die Originaldateien haben einen Timecode, der jedoch nicht in der Ausgabedatei vorhanden ist. Die Timecodes der Ausgabedateien sind auf Null gesetzt. Gibt es eine Möglichkeit, den Timecode beizubehalten?
ffmpeg -i [filenmae] -vcodec copy -acodec copy [outputDirectory]
Verwenden Sie diese Option:
-map_metadata 0:s:2
Timecode liegt oft in einem für das Dateiformat spezifischen Format vor, sodass von ffmpeg nicht erwartet werden kann, dass es ihn einfach „kopiert“, ohne explizite Anweisungen zu erhalten.
In der Sony a7siii 4k 10-Bit-MP4-Datei gibt es einen separaten „Datenstrom“, dem sie als Metadaten hinzugefügt werden. Es ist normalerweise Stream-Index 2 (der dritte Stream), aber Sie können diesen Befehl verwenden, um es selbst zu bestimmen:
ffmpeg -i inputfile.mp4
Dadurch werden Informationen zu allen Eingabestreams einschließlich der Metadaten angezeigt.
Beispielausgabe (Auszüge):
ffmpeg version...
...
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'inputfile.mp4':
Metadata:
...
Stream #0:0(und): Video: h264...
...
Stream #0:2(und): Data: none (rtmd / 0x646D7472), 2252 kb/s (default)
Metadata:
creation_time : 2021-06-19T16:39:17.000000Z
handler_name : Timed Metadata Media Handler
timecode : 07:15:07:17
Beachten Sie nun, dass der Timecode als Metadaten an einen separaten „Datenstrom“ angehängt wird, der in der Ausgabe vorhanden sein muss, damit er einfach -map_metadata 0
funktioniert. Da sie nicht kopiert werden kann, müssen wir diese Metadaten den globalen Metadaten der Datei selbst zuordnen.
Notieren Sie sich die Stream-Nummer, die den Timecode enthält, in diesem Beispiel Stream 2 von Eingang 0, und ordnen Sie sie mithilfe von globalen Metadaten zu -map_metadata 0:s:2
.
ffmpeg -i inputfile.mp4 -map_metadata 0:s:2 -c copy outputfile.mov
Dies sollte Metadaten des Streams mit Index 2 (s:2) von der ersten Eingabe (0:) auf die globalen (Standard-)Metadaten der Ausgabedatei abbilden und Audio-Video-Streams unverändert kopieren.
Beachten Sie, dass die Nummerierung und die Bedeutung von 's' anders ist als bei anderen gebräuchlicheren Optionen. Weitere Informationen finden Sie im Abschnitt „Erweiterte Optionen“ der ffmpeg-Dokumentation .
ffmpeg liest dann alles, was es aus den Metadaten dieses Streams versteht (einschließlich Timecode), konvertiert es in das ideale Metadatenformat des Zieldateiformats und fügt es in die Ausgabe ein.
Die resultierende Datei hat einen Timecode, der in Bearbeitungssoftware wie DaVinci Resolve und Premiere Pro erkennbar ist.
Ich habe andere Optionen wie -write_tmcd
und mehrere Formen von -map 0
mit und ohne ausprobiert, -copy_unknown
aber sie haben nicht funktioniert, wahrscheinlich weil ffmpeg derzeit verstehen muss, was es kopiert.
Beachten Sie, dass dabei nicht der gesamte Datenstrom kopiert wird, sondern nur seine Metadaten. Für unseren aktuellen Bedarf ist das in Ordnung.
Da ich zu prores422hq konvertierte, war mein genauer Befehl (der funktionierte) dieser:
ffmpeg -i inputfile.mp4 -map_metadata 0:s:2 -c:v prores_ks -profile hq -c:a pcm_s16le outputfile.mov
Falls jemand anderes danach sucht, Timecode in mp4- und mov-Dateien ist oft eine "Daten" -Spur, und ffmpeg löscht normalerweise Datenspuren. Um alle Tracks zu behalten, verwende ich normalerweise diese Schalter, um Tracks von der Quelle auf Tracks im Ziel abzubilden
-map 0:v (video switches)
-map 0:a (audio switches)
-map 0:d (this keeps the data track)
Dies hat auch den Vorteil, dass alle Quellaudiospuren beibehalten werden und nicht standardmäßig nur die erste. So könnte Ihr Befehl aussehen
ffmpeg -i [filename] -map 0:v -codec:v copy -map 0:a -codec:a copy -map 0:d [outputDirectory]
BEARBEITEN: In modernem ffmpeg können Sie auch ein Fragezeichen (wie -0:a?) hinzufügen, was bedeutet, dass ffmpeg weiterläuft, wenn es keinen Titel findet, wie Sie ihn zum Kopieren aufgefordert haben
Verwenden Sie einfach kopieren für alle Streams, dh
ffmpeg -i [filename] -c copy -map 0 [outputDirectory]
Bearbeiten : Lassen Sie uns die Byte-Reihenfolge ändern
ffmpeg -i [filename] -c copy -c:a pcm_s16le -map 0 [outputDirectory]
ffprobe C0371.mov
sagt?Timecode und viele andere Informationen gehören nicht zu Video- oder Audiostreams, sie sind Metadatenattribute.
FFmpeg verfügt über viele Befehle zum Bearbeiten von Metadatenattributen. Für die spezifische Frage können Sie sich meine vorherige Frage und die entsprechende Antwort ansehen: ffmpeg Schneidet ein Medium aus, das alle Streams, aber auch alle Metadaten, Timecodes und alles andere beibehält
Bitte beachten Sie, dass sich Metadaten von Format zu Format ändern, also müssen Sie wahrscheinlich das richtige Metadatenfeld auf der ursprünglichen Sony .mp4-Datei finden, es richtig parsen und es geändert oder umbenannt in die neue .mov-Datei schreiben, die der QuickTime .mov-Datei folgt Spezifikationen für die Timecode-Definition.
Michael Liebmann