Tại sao chuyển đổi WMV sang MP4 lại chậm như vậy?


12

Tôi đang cố gắng chuyển đổi video từ WMV sang MP4 bằng FFmpeg nhưng phải mất vài giờ. Nếu tôi cố gắng chuyển đổi nó thành AVI thì chỉ mất khoảng 10-15 phút.

phiên bản ffmpeg

ffmpeg version N-43206-gf857465
built on Aug  4 2012 16:10:39 with gcc 4.7.1 (GCC)

Chuyển đổi sang MP4

ffmpeg -i input.wmv -vcodec libx264 output.mp4

libavutil      51. 66.100 / 51. 66.100
  libavcodec     54. 49.100 / 54. 49.100
  libavformat    54. 22.100 / 54. 22.100
  libavdevice    54.  2.100 / 54.  2.100
  libavfilter     3.  5.102 /  3.  5.102
  libswscale      2.  1.100 /  2.  1.100
  libswresample   0. 15.100 /  0. 15.100
  libpostproc    52.  0.100 / 52.  0.100
Input #0, asf, from 'input.wmv':
  Metadata:
    WMFSDKVersion   : 12.0.7601.17514
    WMFSDKNeeded    : 0.0.0.0000
    IsVBR           : 0
    encoder         : Lavf54.22.100
  Duration: 01:14:23.06, start: 0.000000, bitrate: 324 kb/s
    Stream #0:0: Video: msmpeg4 (MP43 / 0x3334504D), yuv420p, 1280x720, 15 tbr,
1k tbn, 1k tbc
[libx264 @ 03427620] using cpu capabilities: MMX2 SSE2Fast SSSE3 FastShuffle Cac
he64
[libx264 @ 03427620] profile High, level 3.1
[libx264 @ 03427620] 264 - core 125 r2208 d9d2288 - H.264/MPEG-4 AVC codec - Cop
yleft 2003-2012 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deb
lock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 m
e_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chro
ma_qp_offset=-2 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 i
nterlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1
b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=15 scenec
ut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=
0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'output.mp4':
  Metadata:
    WMFSDKVersion   : 12.0.7601.17514
    WMFSDKNeeded    : 0.0.0.0000
    IsVBR           : 0
    encoder         : Lavf54.22.100
    Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1280x720, q=-1--
1, 15 tbn, 15 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (msmpeg4 -> libx264)

Chuyển đổi sang MP4 với copy

ffmpeg -i input.wmv -c:v:1 copy output.mp4

  libavutil      51. 66.100 / 51. 66.100
  libavcodec     54. 49.100 / 54. 49.100
  libavformat    54. 22.100 / 54. 22.100
  libavdevice    54.  2.100 / 54.  2.100
  libavfilter     3.  5.102 /  3.  5.102
  libswscale      2.  1.100 /  2.  1.100
  libswresample   0. 15.100 /  0. 15.100
  libpostproc    52.  0.100 / 52.  0.100
Input #0, asf, from 'input.wmv':
  Metadata:
    WMFSDKVersion   : 12.0.7601.17514
    WMFSDKNeeded    : 0.0.0.0000
    IsVBR           : 0
    encoder         : Lavf54.22.100
  Duration: 01:14:23.06, start: 0.000000, bitrate: 324 kb/s
    Stream #0:0: Video: msmpeg4 (MP43 / 0x3334504D), yuv420p, 1280x720, 15 tbr,
1k tbn, 1k tbc
[libx264 @ 03437620] using cpu capabilities: MMX2 SSE2Fast SSSE3 FastShuffle Cac
he64
[libx264 @ 03437620] profile High, level 3.1
[libx264 @ 03437620] 264 - core 125 r2208 d9d2288 - H.264/MPEG-4 AVC codec - Cop
yleft 2003-2012 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deb
lock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 m
e_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chro
ma_qp_offset=-2 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 i
nterlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1
b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=15 scenec
ut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=
0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'output.mp4':
  Metadata:
    WMFSDKVersion   : 12.0.7601.17514
    WMFSDKNeeded    : 0.0.0.0000
    IsVBR           : 0
    encoder         : Lavf54.22.100
    Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1280x720, q=-1--
1, 15 tbn, 15 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (msmpeg4 -> libx264)

Chuyển đổi sang AVI với copy

ffmpeg -i input.wmv -c:v:1 copy output.avi

Input #0, asf, from 'input.wmv':
  Metadata:
    WMFSDKVersion   : 12.0.7601.17514
    WMFSDKNeeded    : 0.0.0.0000
    IsVBR           : 0
    encoder         : Lavf54.22.100
  Duration: 01:14:23.06, start: 0.000000, bitrate: 324 kb/s
    Stream #0:0: Video: msmpeg4 (MP43 / 0x3334504D), yuv420p, 1280x720, 15 tbr,
1k tbn, 1k tbc
Output #0, avi, to 'output.avi':
  Metadata:
    WMFSDKVersion   : 12.0.7601.17514
    WMFSDKNeeded    : 0.0.0.0000
    IsVBR           : 0
    ISFT            : Lavf54.22.100
    Stream #0:0: Video: mpeg4 (FMP4 / 0x34504D46), yuv420p, 1280x720, q=2-31, 20
0 kb/s, 15 tbn, 15 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (msmpeg4 -> mpeg4)

Có một số tham số bổ sung tôi cần phải vượt qua?


Tất nhiên sẽ nhanh hơn nếu bạn chỉ sao chép dòng bit - với copy, bạn không mã hóa lại bất cứ thứ gì. Bạn có phần cứng nào, ví dụ CPU? HĐH của bạn là gì và phiên bản FFmpeg đó là gì?
slhck

@slhck: Máy tính không nhanh lắm E5400 2.7GHz nhưng tại sao nó lại chậm với mp4 trong khi nó lại nhanh cho avi?
Giorgi

Tôi không thấy bất kỳ đầu ra AVI trong câu hỏi của bạn. Bạn có thể cập nhật nó với đầu ra đầy đủ?
slhck

@slhck: đã thêm đầu ra avi
Giorgi

Câu trả lời:


17

Sao chép luồng

Khi bạn gọi -c:v:1 copy, FFmpeg sẽ lấy dòng bit video hiện có và sao chép luồng đó. Dòng bit video chỉ được gói gọn trong thùng chứa bên ngoài, ví dụ WMV, AVI hoặc MP4 - dòng bit video thực tế của bạn đang msmpeg4và sẽ giữ nguyên như thế này.

Nếu bạn muốn biết thêm về những gì tôi đang nói, hãy xem tại đây: Codec (ví dụ DivX là gì?) Và nó khác với Định dạng tệp như thế nào (ví dụ MPG)?

Khi sao chép dòng bit, FFmpeg không cần thực sự giải mã và mã hóa lại video thực tế. Nó chỉ cần hợp nhất dòng bit video thành một định dạng chứa mới, thường là một hoạt động khá đơn giản và do đó không mất nhiều thời gian.

Mã hóa

Ngược lại, nếu bạn gọi -vcodec libx264(hoặc -c:v libx264, cú pháp bạn nên sử dụng vì vcodeckhông dùng nữa), FFmpeg sẽ buộc phải giải mã dòng bit video từ msmpeg4định dạng thô, sau đó chuyển nó sang x264bộ mã hóa H.264.

x264 nhanh, nhưng vẫn, việc mã hóa video mất nhiều thời gian - đặc biệt là khi nội dung 720p. Và có thể mất hơn một giờ, đặc biệt nếu đầu vào của bạn đã dài hơn một giờ. Ngoài ra, CPU của bạn có thể không phải là nhanh nhất. Đây là lý do chính khiến các bộ mã hóa MPEG-4 Visual cũ hơn như XviD vẫn xuất hiện và rất phổ biến: Chúng mất ít thời gian để mã hóa hơn các codec H.264. Họ có thể không cung cấp cho bạn hiệu suất tốt nhất về chất lượng so với kích thước tệp, nhưng chúng rất nhanh.

Đó là tất cả những gì được nói: Bạn có thể tăng tốc độ mã hóa x264 bằng cách buộc cài đặt trước. Các cài đặt trước là các cài đặt tối ưu hóa bộ mã hóa và phạm vi từ: cực nhanh, cực nhanh, rất nhanh, nhanh, nhanh, trung bình, chậm, chậm, rất chậm. Lệnh của bạn sau đó có thể trông như thế này:

ffmpeg -i input.wmv -c:v libx264 -preset fast out.mp4

Nó sẽ chạy nhanh hơn mà không cần cài đặt trước. Hạn chế duy nhất là nó không đạt được chất lượng tốt cho cùng một tỷ lệ nén so với, ví dụ , -preset veryslow.

Ngoài ra, bạn không thể làm được gì nhiều ngoài việc đầu tư vào CPU tốc độ cao và đảm bảo rằng bạn đang chạy bản dựng FFmpeg gần đây với hỗ trợ x264.

Để biết thêm thông tin, xem FFmpeg Wiki: Hướng dẫn mã hóa H.264 .


Cảm ơn câu trả lời. Tôi không chắc là tôi có rõ ràng hay không nhưng nếu tôi sử dụng bản sao thì nó vẫn rất chậm. Tôi đã thử lệnh của bạn và nó đã xử lý chỉ 4 giây sau 5 phút. Video của tôi dài khoảng 75 phút và chuyển đổi sang avi chỉ mất 15 phút nhưng mp4 mất vài giờ.
Giorgi

Vì vậy, cái nào tốt nhất để mã hóa, libx264 hoặc h264?
Yohanes AI

@NPE Không có sự khác biệt vì ffmpeg theo mặc định sử dụng libx264khi bạn chỉ định ọh264` làm bộ mã hóa.
slhck

1
@PeterCordes Tôi đã đổi nó thành fast. Một số thống kê thú vị (nếu VMAF có thể được tin cậy ở đây): streaminglearningcenter.com/bloss/ trên
slhck

1
@PeterCordes Có một số tối ưu hóa RC mà VMAF không xử lý tốt như AQ: github.com/Netflix/vmaf/issues/21 . Tôi đồng ý với phần UHD chất lượng cao so với UHD. Tác giả của blog rất cởi mở với các đề xuất về cách cải thiện thử nghiệm của mình; Tôi đã nhận xét về một số cấu hình sai cho x265 trước đây.
slhck

3

NHƯ tôi đã chơi (vô tận) với chuyển đổi WMV-> MP4, tôi đã tìm thấy một cách cực nhanh để làm điều đó. Nhưng nó có một mức giá: một giá lưu trữ. Nếu bạn chuyển đổi WMV thành lossless, sau đó từ lossless sang MP4, nó sẽ chuyển đổi hoàn toàn ngay lập tức. Nhưng bạn cần 100 lần dung lượng ổ cứng để lưu trữ phiên bản lossless, điều này thật đau đớn.

Vì vậy, hóa ra bạn có thể chọn từ các phiên bản chuyển đổi WMV-> MP4 rất chậm hoặc rất ổ cứng và bạn không có lựa chọn nào khác.

Chuyển đổi WMV sang AVI lossless: ffmpeg.exe -i screen.wmv -vcodec ffv1 screen.avi Sau đó chuyển đổi AVI lossless sang MP4 (hoặc WebM, không thành vấn đề) ffmpeg.exe -i screen.avi screen.mp4

Siêu nhanh!

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.