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 cần mã hóa lại luồng video H264?


20

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

  1. 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 ?
  2. 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 ffmpegvà công -vcodec copytắc của nó .
  3. 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.97tù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 tbngiá 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 tbngiá 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 avconvlà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 60chuyể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.


Bạn có ý nghĩa gì bởi "chính xác"? Có thể loại bỏ nó khỏi tiêu đề. Tôi muốn giúp đỡ nhưng tôi chưa bao giờ sử dụng ffmpeg. Tôi chỉ sử dụng bộ mã hóa phương tiện truyền thông công cụ adobe.
eLouai

@eLouai Được rồi, tôi đã sửa tiêu đề.
kaorukobo

Câu trả lời:


8

Thấy rằng trong văn bản câu hỏi của bạn, bạn đã bắt đầu thảo luận về các tiện ích khác, tôi sẽ cho rằng bạn không quan tâm đến việc gắn bó với ffmpeg, mà là hoàn thành công việc.

Theo kinh nghiệm của tôi với libav và MTS, tôi không gặp vấn đề gì với tốc độ khung hình, các tệp được làm lại hoàn hảo.

Tôi vừa thử cách sau với một trong các tệp của mình:

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

Tệp MP4 kết quả đã phát đúng với VLC.

Tập tin của tôi là MTS lũy tiến, tôi không có bất kỳ xen kẽ nào được đặt xung quanh, nhưng nếu cần tôi có thể kiểm tra thêm với điều đó.

Báo cáo về kiểm tra tập tin

Trình khởi động chủ đề đã có thể cung cấp một tệp, được chuyển từ MTS sang MP4 và không phát trên máy của người đó với Trình phát nhạc (không rõ phiên bản). Tuy nhiên, nó đã chơi với trình phát VLC của cá nhân đó.

Tôi không có máy tính Mac OS, nhưng tôi đã thử nó với Ubuntu. Tôi đã phát nó trên Ubuntu trên VLC (2.0.8) và Video Gnome (từng được gọi là Totem) (3.8.2); Cả hai đều chơi hoàn hảo.

Sau đó tôi đã nhờ một người bạn của tôi, người đang chơi Mac. Anh ta đang ở trên Mavericks (10.9.4) và nó đã chơi tốt với QuickTime Player 10.3 (727.4).

Tại thời điểm này, nó có vẻ là một vấn đề với trình phát cụ thể hoặc sự cố với cài đặt cấu hình trên máy tính. Và có lẽ tốt nhất là cố gắng cập nhật lên phiên bản QTP mới nhất, có thể với lần đầu tiên gỡ bỏ phiên bản hiện tại và xóa hoàn toàn cấu hình cũ.

Khả năng khác

Khi tôi có một máy cũ, tôi đã có một số tệp bitrate cao phát không chính xác ở một số người chơi và nó là thùng chứa cụ thể. Ví dụ, VLC sẽ từ chối phát tệp MTS, nó sẽ hiển thị khung và sau đó hiển thị khung tiếp theo chỉ trong một giây rưỡi. Video Gnome đã chơi tốt. Nhưng khi làm lại nó cho MKV, cả hai người chơi đã chơi nó một cách hợp lý. Đây có thể là một câu hỏi của một cái gì đó tương tự. Một người chơi có thể đọc một thùng chứa cụ thể (MP4 trong trường hợp này) theo cách yêu cầu thời gian CPU vừa đủ, nó bắt đầu bị nghẹt thở. Hiệu ứng giật có thể được quy cho bất cứ quy trình con nào chiếm hết CPU và người chơi sẽ loại bỏ tất cả các khung bị tụt lại rất nhanh, sau đó quá trình con xấu lại tiếp tục và chu kỳ tiếp tục.

Trong khả năng này, tùy chọn tốt nhất vẫn là cố gắng nâng cấp phần mềm. Với các bộ xử lý đa lõi hiện tại, sẽ rất khó để kiểm tra nhu cầu nâng cấp phần cứng mà không thực sự có được nó, nhưng có lẽ có thể xem xét tải CPU trong quá trình sử dụng chương trình QuickTime Player và so sánh nó với VLC. Nếu bạn thấy 100% cho bất kỳ một lõi nào có QTP, điều đó có thể cho thấy điều này.


Nó không chắc là avconv sẽ làm một công việc khác cho anh ta. avconv là một nhánh của ffmpeg và ffmpeg đang hợp nhất rất nhiều cam kết từ dự án avconv vào ffmpeg, các lỗi lớn như vậy có thể sẽ xuất hiện trong ffmpeg.
PTS

@ProfigatorSparkles Tôi nghĩ rằng thực tế rằng nó hoạt động ở đây là đủ cơ sở để tin khác. Tôi sẽ chờ xem kaorukobo nói gì.
v010dya

@Volodya Cảm ơn thông tin của bạn. Tôi đã thêm báo cáo với việc thử avconv cho câu hỏi của tôi.
kaorukobo

@kaorukobo Chính xác thì bạn có ý gì khi nói "với khung hình của nó bị giật lùi liên tục"? Đầu ra có rung hay không theo một cách nào đó nhảy về phía trước và quay lại?
v010dya

@Volodya Tôi nghĩ biểu hiện của bạn là đúng. Nhìn thấy là tin tưởng. Tôi đã tải lên kết quả Canon-00006.MTS.mp4 lên tệp filerpper.com/canon-00006mts Nếu bạn không phiền, vui lòng thử chơi tệp đó với QuickTime Player (nếu bạn có Mac ...) chứ không phải VLC.
kaorukobo

5

Theo lỗi ffmpeg này

Các gói H.264 xen kẽ được phân tách gây ra MP4 STTS

khi kết nối lại một mpeg-ts chứa H.264 xen kẽ thành mp4, cả hai trường của mỗi khung hình video được chia thành các gói riêng biệt. Phần mềm như Mediainfo sử dụng STTS để xác định tốc độ khung hình. Nó sẽ hiển thị là 50 khung hình / giây thay vì 25 khung hình / giây

Sự không phù hợp về tốc độ khung hình được báo cáo ở đây dường như là kết quả của các luồng MP4 xen kẽ ffmpeg theo thông số kỹ thuật, theo đó, mỗi trường được tách thành một gói. Và như vậy

"phần mềm sử dụng số lượng mẫu trong tệp MP4 để xác định tốc độ khung hình đơn giản là sai." Nhận xét 7

Điều này sẽ không được vá vì các cặp trường hợp nhất thành một đơn vị truy cập vi phạm đặc tả MPEG-4 và do đó, bất kỳ bộ mã hóa nào cũng làm như vậy.

Lưu ý rằng đầu ra được trộn, chẳng hạn như đầu ra bên dưới, chơi tốt với tôi trong Potplayer và 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

Bạn có thể muốn thử thực thi tốc độ khung hình ban đầu bằng cách sử dụng -r 29.97. FFmpeg có lẽ đang cố gắng điều chỉnh tốc độ khung hình vì một số lý do. Cú pháp của bạn là chính xác và không nên tạo ra lỗi đó.

Về câu hỏi thứ ba của bạn. Đơn giản là không thể. Bạn có thể bỏ qua các khung khi sử dụng codec mã hóa các khung riêng lẻ nhưng đó không phải là trường hợp với h264 nhưng ngay cả với một codec như vậy, bạn vẫn sửa đổi luồng video theo một cách nào đó. Cũng vậy với việc tăng tốc độ khung hình, bạn phải thêm các khung được tính toán hoặc sao chép một số khung.

Chỉnh sửa: Về thông tin bổ sung từ các bình luận dưới đây. Nếu bạn cần thay đổi dữ liệu được ghi trong tiêu đề định dạng mà không cần viết một tệp hoàn toàn mới, bạn có thể muốn làm điều đó trong trình soạn thảo hex. FFmpeg chỉ có tùy chọn để thay đổi siêu dữ liệu không bao gồm dữ liệu luồng. Làm thế nào và ở đâu để thực hiện các thay đổi của bạn trong tệp phụ thuộc vào định dạng chứa.

Một tùy chọn khác sẽ là dịch chuyển bộ chứa và phát lại luồng video và âm thanh vào bộ chứa mới với các tùy chọn được chỉ định. Bao nhiêu bạn có thể chỉ định một lần nữa phụ thuộc vào định dạng container. Công cụ MP4Box có thể giúp ích cho điều đó trong trường hợp này, bạn có thể chỉ định tốc độ khung hình khi chuyển luồng video thô sang mp4 mới bằng cú pháp sau:

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

Cảm ơn. Về -t 60chuyển đổi, đây là một tùy chọn để chỉ định không phải là tốc độ khung hình mà là thời gian xử lý ( $ ffmpeg -h|grep -- -t-> -t duration record or transcode "duration" seconds of audio/video)
kaorukobo

Ồ đúng đó là một bộ mã hóa khác, xin lỗi vì lỗi đó.
PTS

Xem chỉnh sửa của tôi để trả lời.
PTS

Cảm ơn một lần nữa. Tôi đã chỉnh sửa câu hỏi của mình để thêm kết quả bằng cách thử lời khuyên của bạn. Thật không may, vấn đề vẫn còn đó ..
kaorukobo

Về câu trả lời của bạn cho câu hỏi thứ ba của tôi, trường hợp tôi muốn thay đổi tốc độ khung hình của luồng video, không chỉ là "giá trị". Tuy nhiên, trong trường hợp của tôi, "set framerate/timebase values"có nghĩa là chỉ viết lại các giá trị được đặt trên tiêu đề của container / codec-stream. Tại sao? Có một số trường hợp để giải quyết: trường hợp một số bộ mã hóa (ví dụ: bộ chuyển mã h264 của Apple Compressor) đưa giá trị cơ sở dữ liệu sai (tbc) vào luồng video và trường hợp như câu hỏi này mà ffmpeg tiêm sai giá trị khung hình / nhịp tim, đó là khác với những tập tin video gốc.
kaorukobo

2

Tôi biết đây là một câu hỏi cũ, nhưng nó lại xuất hiện một lần nữa trong nguồn cấp dữ liệu vì vậy nó mới đối với tôi. (-:

Một điều tôi không thấy đề cập đến là thứ tự trường. Đây là một tập tin xen kẽ, vì vậy đó là một sự cân nhắc. OP đề cập đến các khung "run rẩy qua lại" luôn là cờ cho thứ tự trường không chính xác. Nếu video không ổn, ngoại trừ 'rung', hãy thử thêm bất cứ thứ gì ffmpeg cần để buộc "trường trên cùng trước", sau đó ngược lại nếu điều đó vẫn sai. Tôi không đủ quen thuộc với các chi tiết ffmpeg để đưa ra các cờ chính xác cho điều đó.


Tôi muốn thử chạy một số lệnh ffmepg trên câu trả lời của bạn. Tuy nhiên, phiên bản ffmpeg 2.2.1 của tôi dường như không có tùy chọn xử lý thứ tự trường. Tôi đã cố gắng ffmpeg -h|egrep 'field|first'nhưng nó không cho thấy gì. Phiên bản trước (0.8.6) của ffmpeg có -toptùy chọn có thể xử lý nó.
kaorukobo

@kaorukobo Internet cung cấp điều này: -vf "fieldorder = bff" hoặc = tff trong đó tb tương ứng là trên cùng và dưới cùng. Các top = 1/0 lựa chọn rõ ràng được sử dụng để thay đổi thứ tự, trong đó lĩnh vực được đọc, không phải bằng văn bản. Một lần nữa, tôi chỉ sử dụng ffmpeg / avconv, nên không có gì đảm bảo.
Jim Mack
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.