Lưu ý: Tôi đã đăng cùng một câu hỏi lên stackoverflow một thời gian ngắn trước đây, khi tôi chưa tìm thấy danh hiệu này. Tôi đăng lại câu hỏi này vì câu hỏi phù hợp hơn với cộng đồng này.
1. Những gì tôi đã cố gắng
Tôi có một số tệp .MTS (định dạng AVCHD) được phục hồi bằng máy ảnh AVCHD của tôi . Đặc điểm kỹ thuật của nó là như dưới đây:
$ 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
Hãy chú ý đến phần khung hình / timebase: 29,97 khung hình / giây, 29,97 tbr, 90k tbn, 59,94 tbc
Bây giờ tôi muốn chuyển đổi tệp này thành tệp .mp4, mặt khác, không mã hóa lại luồng video H264 , với việc chuyển mã luồng âm thanh của nó thành AAC . Vì vậy, tôi đã thử lệnh sau:
ffmpeg -i 140612_Canon-00000.MTS -t 60 -y -vcodec copy -acodec libfaac -ab 128k 140612_Canon-00001.MTS.mp4
2. Kết quả
và đặc tả của tập tin đầu ra là như dưới đây:
$ 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
Nhìn vào phần của khung hình / timebase: 59,94 khung hình / giây, 59,94 tbr, 90k tbn, 59,94 tbc . Mặc dù ffmpeg chỉ sao chép luồng video, tốc độ khung hình và cơ sở thời gian đã được thay đổi thành hai lần giá trị .
Vì vậy, khi tôi mở và phát lại tệp đầu ra bằng Trình phát hình ảnh hoặc Trình phát VLC, âm thanh không có vấn đề gì, tuy nhiên, luồng video không được phát chính xác. Video được phát lại với khung hình của nó tiến và lùi liên tục run rẩy.
3. Câu hỏi
- Làm cách nào tôi có thể chuyển đổi tệp .MTS (AVCHD) thành .mp4 bằng ffmpeg mà không mã hóa lại luồng video H264 chính xác ?
- Làm cách nào tôi có thể giữ các giá trị tốc độ khung hình / thời gian gốc (fps / tbr / tbn / tbc) khi tôi chuyển đổi vùng chứa với
ffmpeg
và công-vcodec copy
tắc của nó . - Làm cách nào tôi có thể đặt giá trị tốc độ khung hình / thời gian (fps / tbr / tbn / tbc) bằng các tùy chọn dòng lệnh của ffmpeg mà không cần mã hóa lại luồng video.
Có ý kiến gì không?
4. Thêm -r 29.97
tùy chọn
Giáo sư Sparkles đã cho tôi một lời khuyên để thêm -r 29.97
. Tôi đã thử rằng:
ffmpeg -i 140612_Canon-00001.MTS -t 60 -r 29.97 -y -vcodec copy -acodec libfaac -ab 128k 140612_Canon-00001.MTS.mp4
Tuy nhiên, tệp đầu ra vẫn sai khung hình / 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. Lưu lại bằng MP4Box
Tôi đã thử demux và remux bằng MP4Box, theo lời khuyên của Giáo sư 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
và đầu ra là:
$ 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)
Có vẻ một chút về phía trước. Nhìn vào phần của khung hình / timebase: 29,97 khung hình / giây, 29,97 tbr, 30k tbn, 59,94 tbc . Các kết quả khớp với luồng ban đầu, ngoại trừtbn
(giá trị cơ sở thời gian từ vùng chứa).
Tuy nhiên, khi tôi phát lại tệp đầu ra bằng Quicktime Player hoặc VLC, video sẽ phát lại ở tốc độ một nửa .
Mặc dù tệp gốc có 90k tbn
(90000 tick mỗi giây) và tệp đầu ra mới từ MP4Box có 30k tbn
giá trị chỉ bằng một phần ba so với tệp gốc, tệp đầu ra được phát lại ở tốc độ một nửa.
Tôi không biết lý do tại sao. Nhưng tôi nghĩ vấn đề còn lại là làm thế nào tôi có thể điều chỉnh tbn
giá trị.
5-b. Báo cáo của MediaInfo về tệp đầu ra
Tôi cũng đã thử công cụ MediaInfo trên tệp đầu ra được tạo bởi 5. Remux bằng MP4Box . Đầu ra ở đây: https://gist.github.com/kaorukobo/c5ab9eaa413dff6cd26a
6. Đang thử avconv
Volodya báo cáo avconv
làm việc tốt. Ngoài ra, tôi đã chuẩn bị một tệp phim mẫu ngắn (Canon-00006.MTS) được ghi bằng cùng một máy ảnh. Được rồi, chúng ta hãy thử:
brew install avconv
avconv -i Canon-00006.MTS -c:a copy -c:v copy -y Canon-00006.MTS.mp4
ffprobe Canon-00006.MTS.mp4
Thông tin ffprobe của tệp đầu ra có tại đây: https://gist.github.com/kaorukobo/5b53244ade2632ff1211 và thông tin tốc độ khung hình / thời gian của nó như sau: 59,94 fps, 59,94 tbr, 90k tbn, 59,94 tbc
Tệp đầu ra đã được phát lại tốt với VLC Player như Volodya đã báo cáo. Tuy nhiên, mở nó bằng Quicktime Player X, video được phát lại ở tốc độ bình thường nhưng có khung hình bị giật lùi liên tục.
7. Tại sao ứng dụng "AVCHD to MOV" miễn phí hoạt động?
Như tôi đã đề cập trong bình luận trước đây , tính năng "tua lại thành MOV" miễn phí của ứng dụng AVCHD sang MOV hoạt động tốt, mặc dù nó không làm cho MP4 mà là MOV.
Phần mềm gọi chương trình ffmpeg (hoặc avconv) của chính nó trong nội bộ và tôi đã thấy các tùy chọn nào được truyền cho nó. Nó như hình dưới đây:
/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
Tôi đã thử chuyển các tùy chọn tương tự (Trích xuất giống nhau. Tôi đặt loại thùng chứa đầu ra thành MOV và loại bỏ ngay cả -t 60
chuyển đổi.) Để chương trình ffmpeg và chuyển đổi. Nhưng kết quả vẫn giống như báo cáo cho đến nay .
Dù sao, ứng dụng tuyệt vời đó đã giải quyết vấn đề của tôi về "Làm cách nào tôi có thể chuyển đổi tệp .MTS (AVCHD) thành .mp4 mà không cần mã hóa lại luồng video H264?", Ngoại trừ tại "sang .mp4" và "bởi ffmpeg". Nhưng tôi vẫn quan tâm tại sao ứng dụng đó hoạt động tốt nhưng ffmpeg thì không.