Catatan: Saya memposting pertanyaan yang sama ke stackoverflow beberapa saat sebelumnya, ketika saya belum menemukan komunitas ini. Saya memposting ulang ini karena pertanyaannya lebih cocok untuk komunitas ini.
1. Apa yang saya coba
Saya memiliki beberapa file .MTS (format AVCHD) yang direkam dengan kamera AVCHD saya . Spesifikasinya adalah seperti yang ditunjukkan di bawah ini:
$ 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
Perhatikan framerate / timebase: 29,97 fps, 29,97 tbr, 90k tbn, 59,94 tbc
Sekarang saya ingin mengonversi file ini ke file .mp4, tanpa menyandikan ulang aliran video H264 , di sisi lain, dengan transcoding stream audionya ke AAC . Jadi saya mencoba perintah berikut:
ffmpeg -i 140612_Canon-00000.MTS -t 60 -y -vcodec copy -acodec libfaac -ab 128k 140612_Canon-00001.MTS.mp4
2. Hasil
dan spesifikasi file output adalah seperti yang ditunjukkan di bawah ini:
$ 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
Lihatlah bagian framerate / timebase: 59,94 fps, 59,94 tbr, 90k tbn, 59,94 tbc . Meskipun ffmpeg baru saja menyalin aliran video, framerate dan timebase telah diubah menjadi dua kali lipat nilainya .
Jadi, ketika saya membuka dan memutar file output dengan QuickTime Player atau VLC Player, audio tidak memiliki masalah, namun, aliran video tidak diputar dengan benar. Video diputar ulang dengan memiliki frame maju dan mundur bergetar berulang kali.
3. Pertanyaan
- Bagaimana saya bisa mengonversi file .MTS (AVCHD) ke .mp4 oleh ffmpeg tanpa menyandikan ulang aliran video H264 dengan benar ?
- Bagaimana saya bisa menyimpan nilai framerate / timebase asli (fps / tbr / tbn / tbc) ketika saya mengonversi wadah dengan
ffmpeg
dan sakelarnya-vcodec copy
. - Bagaimana cara menetapkan nilai framerate / timebase (fps / tbr / tbn / tbc) dengan opsi baris perintah ffmpeg tanpa meng -encode ulang aliran video.
Ada ide?
4. Menambahkan -r 29.97
opsi
Profesor Sparkles memberi saya saran untuk ditambahkan -r 29.97
. Saya mencobanya:
ffmpeg -i 140612_Canon-00001.MTS -t 60 -r 29.97 -y -vcodec copy -acodec libfaac -ab 128k 140612_Canon-00001.MTS.mp4
Namun, file output masih salah framerate / timebase:
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 menggunakan MP4Box
Saya mencoba demux dan remux menggunakan MP4Box, menurut saran Profesor Sparkles.
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
dan outputnya adalah:
$ 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)
Itu terlihat sedikit maju. Lihatlah bagian framerate / timebase: 29,97 fps, 29,97 tbr, 30k tbn, 59,94 tbc . Itu cocok dengan aliran asli, kecuali untuktbn
(nilai timebase dari wadah).
Namun, ketika saya memutar file output dengan Quicktime Player atau VLC, video diputar ulang dengan kecepatan setengah .
Meskipun file asli memiliki 90k tbn
(90000 ticks per second) dan file output baru dari MP4Box memiliki nilai 30k tbn
hanya sepertiga dari yang asli, file output diputar ulang dengan kecepatan setengah.
Saya tidak tahu alasannya. Tapi saya pikir masalahnya adalah bagaimana saya bisa menyesuaikan tbn
nilainya.
5-b. Laporan MediaInfo tentang file output
Saya juga mencoba alat MediaInfo pada file output yang dihasilkan oleh 5. Remux menggunakan MP4Box . Outputnya ada di sini: https://gist.github.com/kaorukobo/c5ab9eaa413dff6cd26a
6. Mencoba avconv
Volodya dilaporkan avconv
bekerja dengan baik. Saya juga menyiapkan file film sampel pendek (Canon-00006.MTS) yang direkam dengan kamera yang sama. Oke, mari kita coba:
brew install avconv
avconv -i Canon-00006.MTS -c:a copy -c:v copy -y Canon-00006.MTS.mp4
ffprobe Canon-00006.MTS.mp4
Informasi ffprobe file output ada di sini: https://gist.github.com/kaorukobo/5b53244ade2632ff1211 dan informasi framerate / timebase adalah sebagai berikut: 59,94 fps, 59,94 tbr, 90k tbn, 59kb tbc
File keluaran diputar dengan baik dengan VLC Player seperti yang dilaporkan Volodya. Namun, membukanya dengan Quicktime Player X, video diputar ulang dengan kecepatan normal tetapi dengan memiliki frame mundur berulang kali bergetar.
7. Mengapa aplikasi "AVCHD to MOV" gratis berfungsi?
Seperti yang saya sebutkan di komentar saya sebelumnya , fitur "rewrap to MOV" AVCHD ke MOV aplikasi berfungsi dengan baik, meskipun itu bukan MP4 tapi MOV.
Perangkat lunak memanggil program ffmpeg (atau avconv) sendiri secara internal, dan saya melihat opsi apa yang diberikan padanya. Seperti yang ditunjukkan di bawah ini:
/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
Saya mencoba melewati opsi yang sama (Extractly sama. Saya mengatur tipe wadah keluaran ke MOV dan menghapus bahkan -t 60
beralih.) Ke program ffmpeg dan mengkonversi. Namun hasilnya sama dengan yang dilaporkan sejauh ini .
Pokoknya aplikasi hebat itu menyelesaikan masalah saya pada "Bagaimana saya bisa mengonversi file .MTS (AVCHD) ke .mp4 tanpa menyandikan ulang aliran video H264?", Kecuali pada "to .mp4" dan "by ffmpeg". Tapi saya masih tertarik pada mengapa aplikasi itu bekerja dengan baik tetapi ffmpeg tidak.
Jawaban:
Melihat bahwa dalam teks pertanyaan Anda, Anda sudah mulai membahas utilitas lain, saya akan berasumsi bahwa Anda tidak tertarik untuk tetap menggunakan ffmpeg, tetapi lebih pada menyelesaikan pekerjaan.
Dalam pengalaman saya dengan libav dan MTS saya tidak punya masalah dengan framerate, file-file tersebut dapat di-remux dengan sempurna.
Saya baru saja mencoba yang berikut ini dengan salah satu file saya:
File MP4 yang dihasilkan diputar dengan benar dengan VLC.
File saya adalah progresif MTS, saya tidak punya interlaced bertelur, tetapi jika perlu saya bisa melakukan lebih banyak memeriksa dengan itu.
Laporkan tentang pengujian file
Starter topik dapat menyediakan file, yang diremuxing dari MTS ke MP4 dan tidak diputar di komputer orang itu dengan QuickTime Player (versi tidak diketahui). Itu, bagaimanapun, bermain dengan pemain VLC individu itu.
Saya tidak memiliki komputer Mac OS, tetapi saya telah mencobanya dengan Ubuntu. Saya telah memutarnya di Ubuntu di VLC (2.0.8) dan Video GNOME (dulu disebut Totem) (3.8.2); keduanya bermain dengan sempurna.
Saya kemudian meminta seorang teman saya, yang menggunakan Mac untuk memainkannya. Dia ada di Mavericks (10.9.4), dan itu dimainkan dengan baik dengan QuickTime Player 10.3 (727.4).
Pada saat ini tampaknya ada masalah dengan pemain tertentu atau masalah dengan pengaturan konfigurasi di komputer. Dan mungkin yang terbaik adalah mencoba memperbarui ke versi terbaru dari QTP, mungkin dengan menghapus versi saat ini terlebih dahulu dan sepenuhnya menghapus konfigurasi lama.
Kemungkinan lain
Ketika saya memiliki mesin lama saya memiliki beberapa file bitrate tinggi yang diputar salah di beberapa pemain, dan itu adalah wadah khusus. Misalnya, VLC akan menolak untuk memutar file MTS, itu akan menampilkan bingkai, dan kemudian menunjukkan yang berikutnya hanya dalam satu setengah detik. Video GNOME memutarnya dengan baik. Tetapi ketika remuxing ke MKV, kedua pemain memainkannya dengan cukup baik. Ini mungkin pertanyaan yang serupa. Seorang pemain mungkin membaca wadah tertentu (MP4 dalam kasus ini) dengan cara yang hanya membutuhkan waktu CPU yang cukup, sehingga mulai tersedak sendiri. Efek tersentak dapat kemudian dikaitkan dengan apa pun subproses memakan waktu penyelesaian CPU, dan pemain membuang semua frame yang tertinggal sangat cepat, setelah itu subproses buruk lagi menendang, dan siklus terus berjalan.
Dalam kemungkinan ini, opsi terbaik adalah tetap mencoba memutakhirkan perangkat lunak. Dengan prosesor multicore saat ini, akan sulit untuk menguji kebutuhan untuk meningkatkan perangkat keras tanpa benar-benar mendapatkannya, tetapi mungkin dimungkinkan untuk melihat beban CPU selama penggunaan QuickTime Player dan membandingkannya dengan VLC. Jika Anda melihat 100% untuk satu inti dengan QTP, itu mungkin mengindikasikan hal ini.
sumber
Sesuai bug ffmpeg ini
Paket H.264 interlaced terpecah menyebabkan MP4 STTS
Ketidakcocokan frame rate yang dilaporkan di sini nampaknya merupakan hasil dari ffmpeg muxing aliran MP4 interlaced sesuai dengan spesifikasi, karena setiap bidang dipisahkan menjadi satu paket. Dan dengan demikian
Ini tidak akan ditambal karena menggabungkan pasangan bidang ke dalam satu unit akses melanggar spesifikasi MPEG-4, dan karenanya demikian juga enkode yang melakukan hal yang sama.
Perhatikan bahwa output muxed, seperti di bawah ini, memainkan baik bagi saya di Potplayer dan VLC.
sumber
Anda mungkin ingin mencoba memberlakukan frame rate asli dengan menggunakan
-r 29.97
. FFmpeg mungkin mencoba menyesuaikan framerate karena suatu alasan. Sintaks Anda dinyatakan benar dan tidak seharusnya menghasilkan kesalahan itu.Mengenai pertanyaan ketiga Anda. Tidak mungkin. Anda dapat menghilangkan frame ketika menggunakan codec yang mengkodekan frame secara individual tapi itu tidak terjadi dengan h264 tetapi bahkan dengan codec seperti itu Anda masih memodifikasi aliran video dengan beberapa cara. Hal yang sama berlaku untuk meningkatkan frame rate, Anda harus menambahkan frame terhitung atau menduplikasi beberapa frame.
Sunting: Mengenai info tambahan dari komentar di bawah ini. Jika Anda perlu mengubah data yang ditulis dalam format header tanpa menulis file yang sama sekali baru, Anda mungkin ingin melakukannya di hex editor. FFmpeg hanya memiliki opsi untuk mengubah metadata yang tidak termasuk aliran data. Bagaimana dan di mana membuat perubahan dalam file tergantung pada format wadah.
Pilihan lain adalah dengan mendemuxing wadah dan memundurkan video dan audio stream ke dalam wadah baru dengan opsi yang Anda tentukan. Seberapa banyak Anda dapat menentukan kembali tergantung pada format wadah. Alat MP4Box mungkin bisa membantu dengan itu dalam hal ini, Anda dapat menentukan framerate ketika memadukan stream video mentah ke mp4 baru menggunakan sintaks berikut:
sumber
-t 60
switch, itu adalah opsi untuk menentukan bukan framerate tetapi durasi pemrosesan ($ ffmpeg -h|grep -- -t
->-t duration record or transcode "duration" seconds of audio/video
)"set framerate/timebase values"
berarti hanya menulis ulang nilai yang diletakkan di header container / codec-stream. Mengapa? Ada beberapa kasus yang harus dihadapi: kasus bahwa beberapa encoder (mis. Transcoder h264 dari Apple Compressor) menyuntikkan nilai timebase yang salah (tbc) ke aliran video, dan kasus seperti pertanyaan ini bahwa ffmpeg menyuntikkan nilai framerate / timebase yang salah, yang merupakan berbeda dengan file video asli.Saya tahu ini adalah pertanyaan lama, tetapi baru saja muncul kembali di feed sehingga baru bagi saya. (-:
Satu hal yang saya tidak lihat disebutkan adalah pesanan lapangan. Ini adalah file interlaced, jadi itu pertimbangan. OP menyebutkan frame "bergetar bolak-balik" yang selalu merupakan bendera untuk urutan bidang yang salah. Jika video dinyatakan OK kecuali untuk 'quivering', coba tambahkan ffmpeg apa pun yang perlu memaksa "bidang pertama", maka kebalikannya jika itu masih salah. Saya tidak cukup akrab dengan detail ffmpeg untuk memberikan flag yang tepat untuk itu.
sumber
ffmpeg -h|egrep 'field|first'
tetapi tidak menunjukkan apa-apa. Versi sebelumnya (0.8.6) dari ffmpeg memiliki-top
opsi yang dapat menanganinya.