ffmpeg: behält den Timecode beim Konvertieren von mp4 in mov bei

Ich habe .mp4Dateien, die mit einer Sony A7s-Kamera erstellt wurden. Sie verwenden den XAVC S-Codec. Ich konvertiere sie .movmit 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]

Antworten (4)

Kurze Antwort speziell zu diesem Problem:

Verwenden Sie diese Option:

-map_metadata 0:s:2

Erläuterung:

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 0funktioniert. 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_tmcdund mehrere Formen von -map 0mit und ohne ausprobiert, -copy_unknownaber 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
Herzlich willkommen! Danke für die tolle, ausführliche erste Antwort!

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]
Danke für den Vorschlag. Ich habe es versucht und es hat den Timecode kopiert, aber das Audio wurde nicht kopiert. Ich habe es so versucht " -acodec copy -c copy -map 0", aber immer noch kein Audio. Es gab auch diese Nachricht sowohl bei Ihrer Version als auch bei der, die ich modifiziert habe: [NULL @ 0000000005795f00] Unknown hldr_type for rtmd / 0x646D7472, writing dummy
Fügen Sie die vollständige Konsolenausgabe des Befehls ein, auf den Sie bei der Frage gestoßen sind.
Laut dieser Anzeige wurde das Audio erfolgreich kopiert. Was ffprobe C0371.movsagt?
Sie haben Recht, es hat das Audio kopiert. Das Problem, das ich habe, ist, dass das Programm, das ich verwende, Davinci Resolve, das Audio liest, das mit dem ursprünglichen Befehl "-vcodec copy -acodec copy" erstellt wurde, aber das Audio, das mit der modifizierten Version erstellt wurde, nicht liest. Das ist ein Problem, denn der einzige Grund, warum ich die Konvertierung durchführe, ist, dass Davinci Resolve das Audio liest. Dies ist die ffprobe-Ausgabe für beide Dateien pastebin.com/Wbkn3nat
Versuchen Sie einen neuen Befehl als Antwort.
Als ich die neue Version zum ersten Mal ausprobierte, sagte sie mir, dass sie kein kompatibles Ausgabeformat finden konnte, also änderte ich die Ausgabedatei in die Erweiterung .mov. Die Ausgabedatei wurde erstellt, enthält jedoch weder Audio noch Timecode. Dies ist die Ausgabe: pastebin.com/vfcYd1uT Dies ist die Testdatei, die ich verwende: goo.gl/xilYd9
Dies scheint eher ein DaVinci-Problem als ffmpeg zu sein. Ich habe Ihre Quelldatei mit meinen Befehlen verwendet und das Ergebnis spielt mit Audio in Sony Vegas und Premiere Pro CC, aber nicht in Resolve 11 (die Version, die ich habe). Ich verwende Resolve nicht zum Bearbeiten. Wenn Sie also eine Anleitung finden, was Resolve in einem MP4/MOV benötigt, kann ich meinen Befehl optimieren.

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.