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
- Wie kann ich eine .MTS-Datei (AVCHD) mit ffmpeg in eine .mp4-Datei konvertieren, ohne den H264-Videostream korrekt neu zu codieren ?
- Wie kann ich die ursprünglichen Werte für Framerate / Zeitbasis (fps / tbr / tbn / tbc) beibehalten, wenn ich den Container mit
ffmpeg
und dessen-vcodec copy
Schalter konvertiere ? - 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.97
Option 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 tbn
nur 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 tbn
Wert 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, avconv
hat 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 60
Schalter 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.