Wie kann ich eine .MTS-Datei (AVCHD) mit ffmpeg in eine .mp4-Datei konvertieren, ohne den H264-Videostream neu zu codieren?


20

Hinweis: Ich habe die gleiche Frage an stackoverflow kurz zuvor gestellt, als ich diese Community noch nicht gefunden habe. Ich reposte dies, da die Frage eher für diese Community geeignet ist.

1. Was ich versucht habe

Ich habe einige .MTS-Dateien (AVCHD-Format), die mit meiner AVCHD-Kamera aufgenommen wurden . Seine Spezifikation ist wie folgt:

$ ffprobe 140612_Canon-00000.MTS 
ffprobe version 2.2.1 Copyright (c) 2007-2014 the FFmpeg developers
(snip)
Input #0, mpegts, from '140612_Canon-00000.MTS':
  Duration: 00:48:58.40, start: 0.800300, bitrate: 5563 kb/s
  Program 1 
    Stream #0:0[0x1011]: Video: h264 (High) (HDMV / 0x564D4448), 
      yuv420p, 1440x1080 [SAR 4:3 DAR 16:9], 
      29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
    Stream #0:1[0x1100]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, 
      stereo, fltp, 256 kb/s

Achten Sie auf den Teil der Bildrate / Zeitbasis: 29,97 fps, 29,97 tbr, 90.000 tbn, 59,94 tbc

Nun möchte Ich mag auf diese Datei in .mp4 - Datei konvertieren, ohne Re-Encoding H264 Video - Stream , auf der anderen Seite, mit Umcodieren seinen Audio - Stream AAC . Also habe ich den folgenden Befehl ausprobiert:

ffmpeg -i 140612_Canon-00000.MTS -t 60 -y -vcodec copy -acodec libfaac -ab 128k 140612_Canon-00001.MTS.mp4

2. Ergebnis

und die Spezifikation der Ausgabedatei ist wie folgt:

$ ffprobe 140612_Canon-00000.MTS.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '140612_Canon-00000.MTS.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf55.33.100

  Duration: 00:01:00.04, start: 0.021333, bitrate: 4590 kb/s

    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 
        1440x1080 [SAR 4:3 DAR 16:9], 4448 kb/s, 
        59.94 fps, 59.94 tbr, 90k tbn, 59.94 tbc (default)
    Metadata:
      handler_name    : VideoHandler

    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 
        48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

Betrachten Sie den Teil der Bildrate / Zeitbasis: 59,94 fps, 59,94 tbr, 90.000 tbn, 59,94 tbc . Obwohl ffmpeg gerade den Videostream kopiert hat, wurden die Framerate und die Zeitbasis auf den doppelten Wert geändert .

Wenn ich also die Ausgabedatei mit QuickTime Player oder VLC Player öffne und wiedergebe, ist die Audiowiedergabe problemlos, der Videostream wird jedoch nicht korrekt wiedergegeben. Das Video wird so wiedergegeben, dass sein Bild wiederholt vorwärts und rückwärts zittert.

3. Frage

  1. Wie kann ich eine .MTS-Datei (AVCHD) mit ffmpeg in eine .mp4-Datei konvertieren, ohne den H264-Videostream korrekt neu zu codieren ?
  2. Wie kann ich die ursprünglichen Werte für Framerate / Zeitbasis (fps / tbr / tbn / tbc) beibehalten, wenn ich den Container mit ffmpegund dessen -vcodec copySchalter konvertiere ?
  3. Wie kann ich Framerate / Timebase-Werte (fps / tbr / tbn / tbc) über die Befehlszeilenoptionen von ffmpeg einstellen, ohne einen Videostream neu zu codieren ?

Irgendwelche Ideen?


4. -r 29.97Option hinzufügen

Professor Sparkles gab mir einen Ratschlag zum Hinzufügen -r 29.97. Ich habe das versucht:

ffmpeg -i 140612_Canon-00001.MTS -t 60 -r 29.97 -y -vcodec copy -acodec libfaac -ab 128k 140612_Canon-00001.MTS.mp4

Die Ausgabedatei hat jedoch immer noch eine falsche Bildrate / Zeitbasis:

Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 
1440x1080 [SAR 4:3 DAR 16:9], 4448 kb/s, 
59.94 fps, 59.94 tbr, 11988 tbn, 59.94 tbc (default)

5. Remux mit MP4Box

Ich habe versucht, mit MP4Box Demux und Remux, nach Professor Sparkles 'Rat.

brew install mp4box

ffmpeg -i 140612_Canon-00000.MTS -t 60 -y \
  -vcodec copy -an 140612_Canon-00000.MTS.h264

ffmpeg -i 140612_Canon-00000.MTS -t 60 -y \
  -vn -acodec libfaac -ab 128k 140612_Canon-00000.MTS.aac

mp4box -add 140612_Canon-00000.MTS.h264:fps=29.97 \
  -add 140612_Canon-00000.MTS.aac \
  -new 140612_Canon-00000.MTS.mp4

und die Ausgabe war:

$ ffprobe 140612_Canon-00000.MTS.mp4

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '140612_Canon-00000.MTS.mp4':
(snip)
  Duration: 00:02:00.22, start: 0.000000, bitrate: 2293 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), 
          yuv420p, 1440x1080 [SAR 4:3 DAR 16:9], 2228 kb/s, 
          29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
    Metadata:
      creation_time   : 2014-07-14 00:38:23
      handler_name    : 140612_Canon-00000.MTS.h264:fps=29.97
       - Imported with GPAC 0.5.0-rev4065

    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 48000 Hz, 
          stereo, fltp, 125 kb/s (default)

Es sieht ein bisschen vorwärts. Betrachten Sie den Teil der Framerate / Zeitbasis: 29,97 fps, 29,97 tbr, 30k tbn, 59,94 tbc . Diese stimmen mit Ausnahme vontbn (Zeitbasiswert aus Container) mit dem ursprünglichen Stream überein .

Wenn ich die Ausgabedatei jedoch mit Quicktime Player oder VLC wiedergebe, wird das Video mit der halben Geschwindigkeit wiedergegeben .

Obwohl die Originaldatei 90k tbn(90000 Ticks pro Sekunde) und die neue Ausgabedatei von MP4Box 30k tbnnur ein Drittel des ursprünglichen Werts hat , wird die Ausgabedatei mit der halben Geschwindigkeit wiedergegeben.

Ich weiß nicht warum. Aber ich denke, der Rest ist, wie ich den tbnWert anpassen kann.


5-b. MediaInfo's Bericht über die Ausgabedatei

Ich habe auch das MediaInfo-Tool für die Ausgabedatei ausprobiert, die von 5. Remux mit MP4Box erstellt wurde . Die Ausgabe ist hier: https://gist.github.com/kaorukobo/c5ab9eaa413dff6cd26a


6. Versuchen Sie avconv

Wolodja berichtete, avconvhat gut funktioniert. Außerdem habe ich eine kurze Beispielfilmdatei (Canon-00006.MTS) vorbereitet, die mit derselben Kamera aufgenommen wurde. Okay, lass es uns versuchen:

brew install avconv
avconv -i Canon-00006.MTS -c:a copy -c:v copy -y Canon-00006.MTS.mp4
ffprobe Canon-00006.MTS.mp4

Die ffprobe-Informationen der Ausgabedatei befinden sich hier: https://gist.github.com/kaorukobo/5b53244ade2632ff1211 und die Framerate / Zeitbasis-Informationen lauten wie folgt: 59,94 fps, 59,94 tbr, 90 k tbn, 59,94 tbc

Die Ausgabedatei wurde mit VLC Player gut wiedergegeben, wie Volodya berichtete. Beim Öffnen mit Quicktime Player X wurde das Video jedoch mit der normalen Geschwindigkeit wiedergegeben, wobei der Frame jedoch wiederholt zitterte.


7. Warum funktioniert die App "Free AVCHD to MOV"?

Wie ich in meinem vorherigen Kommentar erwähnt habe , hat die Funktion "In MOV umwandeln" der Free AVCHD to MOV- App gut funktioniert, obwohl sie nicht MP4, sondern MOV macht.

Die Software ruft intern ein eigenes ffmpeg- (oder avconv-) Programm auf, und ich habe gesehen, welche Optionen an sie übergeben werden. Es ist wie folgt:

/Applications/Free AVCHD to Mov.app/Contents/Resources/bin/com.geranium-soft.convert \
  -i /path/to/140710_Canon-00003.MTS \
  -map 0:0 -map 0:1 -c:a libfaac -vol 256 -b:a 128k -c:v copy \
  -sn -movflags faststart -threads 0 -pix_fmt yuv420p -y \
  /path/to/140710_Canon-00003.mov

Ich habe versucht, die gleichen Optionen zu übergeben (Extractly same. Ich habe den Ausgabecontainertyp auf MOV gesetzt und sogar den -t 60Schalter entfernt.), Um das Programm ffmpeg und die Konvertierung durchzuführen. Aber das Ergebnis war gleich wie bisher berichtet .

Wie auch immer, diese großartige App hat mein Problem behoben: "Wie kann ich eine .MTS-Datei (AVCHD) in eine .mp4-Datei konvertieren, ohne den H264-Videostream neu zu codieren?" Aber ich bin immer noch daran interessiert, warum diese App gut funktioniert, aber ffmpeg nicht.


Was meinst du mit "richtig"? Vielleicht entfernen Sie das aus dem Titel. Ich würde gerne helfen, aber ich habe ffmpeg noch nie benutzt. Ich benutze nur den Adobe Tools Media Encoder.
ELouai

@eLouai Also gut, ich habe den Titel festgelegt.
Kaorukobo

Antworten:


8

Angesichts der Tatsache, dass Sie im Text Ihrer Frage begonnen haben, andere Dienstprogramme zu diskutieren, gehe ich davon aus, dass Sie nicht daran interessiert sind, sich an ffmpeg zu halten, sondern die Aufgabe zu erledigen.

Nach meiner Erfahrung mit libav und MTS hatte ich keine Probleme mit der Framerate, die Dateien werden perfekt entfernt.

Ich habe gerade Folgendes mit einer meiner Dateien versucht:

avconv -i 00174.MTS -c:a copy -c:v copy 00174.mp4

Die resultierende MP4-Datei wurde korrekt mit VLC abgespielt.

Meine Datei ist progressive MTS, ich habe keine interlaced herumliegen, aber wenn es sein muss, kann ich mehr überprüfen.

Bericht über den Dateitest

Der Themenstarter konnte eine Datei bereitstellen, die von MTS zu MP4 entfernt wurde und mit QuickTime Player (Version unbekannt) nicht auf dem Computer dieser Person abgespielt wurde. Es spielte jedoch mit dem VLC-Player dieser Person.

Ich habe keinen Mac OS Computer, aber ich habe es mit Ubuntu ausprobiert. Ich habe es auf Ubuntu auf VLC (2.0.8) und GNOME Videos (früher Totem genannt) (3.8.2) gespielt; beide spielen perfekt.

Ich habe dann einen Freund von mir, der auf einem Mac sitzt, gebeten, es zu spielen. Er ist auf Mavericks (10.9.4) und es spielte gut mit QuickTime Player 10.3 (727.4).

Derzeit scheint es sich um ein Problem mit dem jeweiligen Player oder um ein Problem mit den Konfigurationseinstellungen auf dem Computer zu handeln. Und es ist wahrscheinlich am besten, zu versuchen, auf die neueste Version von QTP zu aktualisieren, möglicherweise indem zuerst die aktuelle Version entfernt und die alte Konfiguration vollständig gelöscht wird.

Andere Möglichkeit

Wenn ich eine alte Maschine hatte, wurden einige Dateien mit hoher Bitrate in einigen Playern falsch abgespielt, und es war container-spezifisch. Beispielsweise würde VLC die Wiedergabe von MTS-Dateien verweigern, einen Frame anzeigen und den nächsten erst in anderthalb Sekunden anzeigen. GNOME Videos haben es gut gespielt. Beim Remuxen auf MKV haben beide Spieler es jedoch recht gut gespielt. Das ist vielleicht eine Frage von etwas ähnlichem. Ein Spieler kann einen bestimmten Container (in diesem Fall MP4) so ​​lesen, dass er gerade genug CPU-Zeit benötigt, um sich selbst zu verschlucken. Der Ruckeleffekt kann dann auf den Teilprozess zurückgeführt werden, der die CPU-Endbearbeitung in Anspruch nimmt, und der Player gibt alle Frames aus, die sehr schnell zurückliegen. Danach setzt der fehlerhafte Teilprozess erneut ein und der Zyklus wird fortgesetzt.

In diesem Fall ist es am besten, die Software zu aktualisieren. Mit den aktuellen Multicore-Prozessoren ist es schwierig, die Notwendigkeit eines Upgrades der Hardware zu testen, ohne sie tatsächlich zu erhalten. Möglicherweise ist es jedoch möglich, die CPU-Auslastung während der Nutzung von QuickTime Player zu überprüfen und mit VLC zu vergleichen. Wenn Sie 100% für einen Kern mit QTP sehen, kann dies ein Hinweis darauf sein.


Es ist eher unwahrscheinlich, dass avconv einen anderen Job für ihn macht. avconv ist eine Abzweigung von ffmpeg und ffmpeg führt eine Menge Commits aus dem avconv-Projekt in ffmpeg zusammen. Solche größeren Fehlerbehebungen wären wahrscheinlich in ffmpeg vorhanden.
PTS

@ProfessorSparkles Ich denke, dass die Tatsache, dass es hier funktioniert hat, Grund genug ist, etwas anderes zu glauben. Ich werde abwarten, was Kaorukobo sagt.
v010dya

@ Volodya Vielen Dank für Ihre Informationen. Ich habe den Bericht mit dem Versuch avconv zu meiner Frage hinzugefügt.
Kaorukobo

@kaorukobo Was genau meinst du mit "mit seinem Rahmen zitternd wiederholt rückwärts"? Verwackelt der Ausgang oder springt er in irgendeiner Weise vor und zurück?
v010dya

@Volodya Ich denke, dein Gesichtsausdruck ist richtig. Sehen heißt glauben. Ich habe die resultierende Canon-00006.MTS.mp4 auf filedropper.com/canon-00006mts hochgeladen .
Kaorukobo

5

Wie bei diesem ffmpeg-Fehler

Interlaced-H.264-Pakete werden aufgeteilt und verursachen MP4-STTS

Beim Remuxen von MPEG-Ts, die Interlaced-H.264 enthalten, in MP4 werden beide Felder jedes Videoframes in separate Pakete aufgeteilt. Software wie Mediainfo verwendet das STTS, um die Bildrate zu bestimmen. Es werden 50fps anstatt 25fps angezeigt

Die hier gemeldete Nichtübereinstimmung der Bildrate scheint ein Ergebnis des Muxens von MP4-Interlaced-Streams durch ffmpeg gemäß der Spezifikation zu sein, wonach jedes Feld in ein Paket aufgeteilt wird. Und somit

"Eine Software, bei der die Bildrate anhand der in der MP4-Datei enthaltenen Abtastwerte ermittelt wird, ist einfach falsch." Kommentar 7

Dies wird nicht gepatcht, da das Zusammenführen von Feldpaaren zu einer Zugriffseinheit die MPEG-4-Spezifikation verletzt, und daher auch alle Encoder, die dasselbe tun.

Beachten Sie, dass die muxed Ausgabe, wie die unten, spielt gut für mich in PotPlayer und VLC.

    ffmpeg version N-76741-g8eadabf Copyright (c) 2000-2015 the FFmpeg developers
  built with gcc 5.2.0 (GCC)

Input #0, mpegts, from '00007.MTS':
  Duration: 00:00:07.01, start: 1.033367, bitrate: 15935 kb/s
  Program 1 
    Stream #0:0[0x1011]: Video: h264 (High) (HDMV / 0x564D4448), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
    Stream #0:1[0x1100]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, 5.1(side), fltp, 448 kb/s
    Stream #0:2[0x1200]: Subtitle: hdmv_pgs_subtitle ([144][0][0][0] / 0x0090), 1920x1080
[mp4 @ 054cf020] Codec for stream 0 does not use global headers but container format requires global headers
Output #0, mp4, to '00007.MTS.mp4':
  Metadata:
    encoder         : Lavf57.16.100
    Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 29.97 fps, 29.97 tbr, 90k tbn, 90k tbc
    Stream #0:1: Audio: aac ([64][0][0][0] / 0x0040), 48000 Hz, 5.1(side), fltp, 128 kb/s
    Metadata:
      encoder         : Lavc57.15.100 aac
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (ac3 (native) -> aac (native))
Press [q] to stop, [?] for help
[mp4 @ 054cf020] Timestamps are unset in a packet for stream 0. This is deprecated and will stop working in the future. Fix your code to set the timestamps properly
[mp4 @ 054cf020] pts has no value
    Last message repeated 209 times
frame=  420 fps=0.0 q=-1.0 Lsize=   12478kB time=00:00:07.01 bitrate=14564.2kbits/s    
video:12458kB audio:6kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.111239%
[aac @ 052fd480] Qavg: 64863.176

4

Möglicherweise möchten Sie versuchen, die ursprüngliche Bildrate mithilfe von zu erzwingen -r 29.97. FFmpeg versucht wahrscheinlich aus irgendeinem Grund, die Framerate anzupassen. Ihre Syntax ist ansonsten korrekt und sollte diesen Fehler nicht verursachen.

Zu Ihrer dritten Frage. Einfach nicht möglich. Sie können Frames weglassen, wenn Sie Codecs verwenden, die Frames einzeln codieren. Dies ist jedoch bei h264 nicht der Fall, aber selbst mit einem solchen Codec können Sie den Videostream in irgendeiner Weise ändern. Das gleiche gilt für die Erhöhung der Bildrate. Sie müssen entweder berechnete Bilder hinzufügen oder einige Bilder duplizieren.

Bearbeiten: Bezüglich der zusätzlichen Informationen aus dem Kommentar unten. Wenn Sie die im Formatkopf geschriebenen Daten ändern müssen, ohne eine vollständig neue Datei zu schreiben, möchten Sie dies wahrscheinlich in einem Hex-Editor tun. FFmpeg hat nur die Option, Metadaten zu ändern, die keine Stream-Daten enthalten. Wie und wo Sie Ihre Änderungen in der Datei vornehmen, hängt vom Containerformat ab.

Eine andere Option wäre, den Container zu demuxen und den Video- und Audiostream mit den angegebenen Optionen in einen neuen Container zu remuxen. Wie viel Sie erneut angeben können, hängt vom Containerformat ab. Das Tool MP4Box kann in diesem Fall hilfreich sein. Sie können eine Framerate angeben, wenn Sie RAW-Videostreams mit der folgenden Syntax in eine neue MP4-Datei muxen:

MP4Box -add input.h264:fps=29.97 -new output.mp4

Vielen Dank. In Bezug auf -t 60Schalter ist es eine Option, keine Bildrate, sondern Verarbeitungsdauer ( $ ffmpeg -h|grep -- -t-> -t duration record or transcode "duration" seconds of audio/video)
Kaorukobo

Ach ja, das war ein anderer Encoder, sorry für diesen Fehler.
PTS

Siehe meine Bearbeitung zur Antwort.
PTS

Danke noch einmal. Ich habe meine Frage bearbeitet, um das Ergebnis hinzuzufügen, indem ich Ihren Rat befolgt habe. Leider war das Problem immer noch da ..
Kaorukobo

In Bezug auf Ihre Antwort auf meine dritte Frage ist es in Ordnung für den Fall, dass ich die Bildrate des Videostreams ändern möchte, nicht nur "Wert". In meinem Fall "set framerate/timebase values"bedeutet dies jedoch nur das Umschreiben von Werten, die in den Header des Container- / Codec-Streams eingefügt wurden. Warum? Es gibt einige Fälle, mit denen man sich befassen muss: der Fall, dass ein Encoder (z. B. der h264-Transcoder von Apple Compressor) einen falschen Zeitbasiswert (tbc) in den Videostream einspeist, und der Fall wie diese Frage, dass ffmpeg falsche Framerate- / Zeitbasiswerte einspeist unterscheidet sich von denen der ursprünglichen Videodateien.
Kaorukobo

2

Ich weiß, dass dies eine alte Frage ist, aber sie tauchte im Feed erneut auf, sodass sie für mich neu ist. (-:

Eine Sache, die ich nicht erwähnt sehe, ist die Feldreihenfolge. Dies ist eine Interlaced-Datei, das ist also eine Überlegung. Das OP erwähnt die Frames "hin und her zittern", was immer ein Flag für eine falsche Halbbildreihenfolge ist. Wenn das Video mit Ausnahme des "Zitterns" ansonsten in Ordnung ist, fügen Sie das benötigte ffmpeg hinzu, um "top field first" zu erzwingen, und umgekehrt, wenn das immer noch nicht stimmt. Ich kenne die ffmpeg-Details nicht gut genug, um die genauen Flags dafür anzugeben.


Ich möchte versuchen, einige ffmepg-Befehle für Ihre Antwort auszuführen. Meine ffmpeg-Version 2.2.1 scheint jedoch keine Optionen zu haben, die die Feldreihenfolge handhaben. Ich habe es versucht, ffmpeg -h|egrep 'field|first'aber es zeigt nichts. Vorherige Version (0.8.6) von ffmpeg hatte eine -topOption, die damit umgehen kann.
Kaorukobo

@kaorukobo Das Internet bietet Folgendes : -vf "fieldorder = bff" oder = tff, wobei sich t und b jeweils auf oben und unten beziehen. Die Option top = 1/0 wird anscheinend verwendet, um die Reihenfolge zu ändern, in der Felder gelesen und nicht geschrieben werden. Auch hier benutze ich ffmpeg / avconv nur beiläufig, also keine Garantien.
Jim Mack
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.