หมายเหตุ: ฉันโพสต์คำถามเดียวกันเพื่อstackoverflowช่วงเวลาสั้น ๆ ก่อนหน้านี้เมื่อฉันยังไม่พบชุมชนนี้ ฉันโพสต์ใหม่เนื่องจากคำถามนี้เหมาะสมกับชุมชนนี้มากกว่า
1. สิ่งที่ฉันพยายาม
ฉันมีบางพิษ (รูปแบบ AVCHD) ไฟล์ recoreded กับกล้อง สเปคของมันดังแสดงด้านล่าง:
$ 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
ให้ความสนใจกับส่วนของอัตราเฟรม / เวลา: 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
ตอนนี้ผมอยากจะแปลงไฟล์นี้ไปยังแฟ้ม .mp4 โดยไม่ต้องสตรีมวิดีโอเข้ารหัส H264บนมืออื่น ๆ ที่มีการแปลงรหัสสตรีมเสียงเพื่อ AAC ดังนั้นฉันลองคำสั่งต่อไปนี้:
ffmpeg -i 140612_Canon-00000.MTS -t 60 -y -vcodec copy -acodec libfaac -ab 128k 140612_Canon-00001.MTS.mp4
2. ผลลัพธ์
และข้อกำหนดของไฟล์เอาต์พุตมีดังต่อไปนี้:
$ 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
ดูที่ส่วนหนึ่งของเฟรม / timebase นี้: 59.94 เฟรมต่อวินาที, 59.94 TBR, 90k TBN, 59.94 TBC แม้ว่า ffmpeg เพียงแค่คัดลอกสตรีมวิดีโอframerate และ timebase ได้รับการเปลี่ยนเป็นค่าสองครั้ง
ดังนั้นเมื่อฉันเปิดและเล่นไฟล์เอาต์พุตด้วย QuickTime Player หรือ VLC Player เสียงจะไม่มีปัญหาอย่างไรก็ตามสตรีมวิดีโอไม่เล่นอย่างถูกต้อง เล่นวิดีโอโดยให้เฟรมไปข้างหน้าและข้างหลังอย่างว่องไวซ้ำ ๆ
3. คำถาม
- ฉันจะแปลงไฟล์. MTS (AVCHD) เป็น. mp4 โดย ffmpeg โดยไม่ต้องเข้ารหัสสตรีมวิดีโอ H264 อีกครั้งอย่างถูกต้องได้อย่างไร
- ฉันจะเก็บค่า framerate / timebase ดั้งเดิม (fps / tbr / tbn / tbc) เดิมได้อย่างไรเมื่อฉันแปลงคอนเทนเนอร์ด้วย
ffmpeg
และ-vcodec copy
สวิตช์ - ฉันจะตั้งค่า framerate / timebase (fps / tbr / tbn / tbc) โดยตัวเลือกบรรทัดคำสั่งของ ffmpeg ได้อย่างไรโดยไม่ต้องเข้ารหัสสตรีมวิดีโออีกครั้ง
ความคิดใด ๆ
4. การเพิ่ม-r 29.97
ตัวเลือก
ศาสตราจารย์ Sparkles -r 29.97
ให้คำแนะนำในการเพิ่ม ฉันลองแล้ว:
ffmpeg -i 140612_Canon-00001.MTS -t 60 -r 29.97 -y -vcodec copy -acodec libfaac -ab 128k 140612_Canon-00001.MTS.mp4
อย่างไรก็ตามไฟล์ที่ส่งออกยังคงมีอัตราเฟรม / เวลาไม่ถูกต้อง:
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 ใช้ MP4Box
ฉันลอง demux และ remux โดยใช้ MP4Box ตามคำแนะนำของศาสตราจารย์ 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
และผลลัพธ์คือ:
$ 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)
มันดูค่อนข้างก้าวไปข้างหน้า ดูที่ส่วนหนึ่งของเฟรม / timebase นี้: 29.97 เฟรมต่อวินาที, 29.97 TBR, 30k TBN, 59.94 TBC สิ่งเหล่านั้นตรงกับกระแสดั้งเดิมยกเว้นtbn
(ค่าฐานเวลาจากคอนเทนเนอร์)
แต่เมื่อฉันเล่นไฟล์ที่ส่งออกที่มี Quicktime Player หรือ VLC ที่วิดีโอจะเล่นกลับมาที่ความเร็วครึ่ง
แม้ว่าไฟล์ดั้งเดิมจะมี90k tbn
(90000 เห็บต่อวินาที) และไฟล์เอาต์พุตใหม่จาก MP4Box มี30k tbn
เพียงหนึ่งในสามของค่าดั้งเดิม แต่ไฟล์เอาต์พุตจะเล่นที่ความเร็วครึ่งหนึ่ง
ฉันไม่รู้เหตุผลว่าทำไม แต่ฉันคิดว่าปัญหาที่เหลือคือวิธีที่ฉันสามารถปรับtbn
ค่าได้
5-B รายงานของ MediaInfo เกี่ยวกับไฟล์เอาต์พุต
ฉันยังพยายามเครื่องมือ MediaInfoบนไฟล์ที่ส่งออกที่สร้างขึ้นโดย5. remux ใช้ mp4box ผลลัพธ์อยู่ที่นี่: https://gist.github.com/kaorukobo/c5ab9eaa413dff6cd26a
6. พยายามใช้ avconv
Volodya รายงานว่าavconv
ทำงานได้ดี ฉันยังเตรียมไฟล์ภาพยนตร์ตัวอย่างสั้น ๆ (Canon-00006.MTS) ที่บันทึกด้วยกล้องเดียวกัน โอเคลองทำกัน:
brew install avconv
avconv -i Canon-00006.MTS -c:a copy -c:v copy -y Canon-00006.MTS.mp4
ffprobe Canon-00006.MTS.mp4
ข้อมูล ffprobe ของไฟล์เอาต์พุตอยู่ที่นี่: https://gist.github.com/kaorukobo/5b53244ade2632ff1211 และข้อมูล framerate / timebase เป็นดังนี้: 59.94 fps, 59.94 tbr, 90.9 tbn, 59.94 tbc
ไฟล์เอาต์พุตนั้นเล่นได้ดีกับ VLC Playerตามที่ Volodya รายงาน อย่างไรก็ตามเมื่อเปิดด้วย Quicktime Player X วิดีโอจะเล่นที่ความเร็วปกติ แต่เมื่อเฟรมกลับด้านซ้ำ ๆ
7. ทำไมแอป "Free AVCHD to MOV" ถึงใช้งานได้?
ในฐานะที่ผมกล่าวถึงในความคิดเห็นก่อนหน้าของฉัน , ฟรี AVCHD เพื่อ MOVแอป"rewrap ไปเพื่อ MOV"คุณลักษณะที่ทำงานได้ดีแม้ว่ามันจะทำให้ไม่ MP4 แต่ MOV
ซอฟต์แวร์เรียกใช้โปรแกรม ffmpeg (หรือ avconv) ของตัวเองภายในและฉันเห็นตัวเลือกที่ถูกส่งผ่านไป มันดังแสดงด้านล่าง:
/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
ฉันพยายามผ่านตัวเลือกเดียวกัน (แตกต่างกันเหมือนกันฉันตั้งประเภทคอนเทนเนอร์เอาท์พุทเป็น MOV และลบออกแม้กระทั่ง-t 60
สวิทช์) เป็นโปรแกรม ffmpeg และทำการแปลง แต่ผลลัพธ์ก็เหมือนกันตามที่รายงานมา
แอปที่ยอดเยี่ยมยังแก้ไขปัญหาของฉันใน "ฉันจะแปลงไฟล์. MTS (AVCHD) เป็น. mp4 โดยไม่เข้ารหัสสตรีมวิดีโอ H264 อีกครั้งได้อย่างไร" ยกเว้นที่ "เป็น. mp4" และ "โดย ffmpeg" แต่ฉันก็ยังสนใจว่าทำไมแอปนั้นถึงทำได้ดี แต่ ffmpeg ไม่ได้