Chuyển đổi AVI (Xvid) sang MP4 (H.264) giữ nguyên chất lượng


47

Tôi muốn nén một tập tin AVI thành MP4 bằng cách sử dụng codec h.264. Tôi không thể có được chất lượng như nhau. Làm thế nào tôi có thể nén nó?

Video gốc:

Màn hình video gốc:

Đầu ra giao diện điều khiển FFmpeg ( ffmpeg -i input.avi):

FFmpeg version SVN-r26402, Copyright (c) 2000-2011 the FFmpeg developers
  built on Dec 28 2012 10:03:40 with gcc 4.4.6 20120305 (Red Hat 4.4.6-4)
  configuration: --enable-shared --enable-gpl --enable-version3 --enable-nonfree                                                                                         --enable-pthreads --enable-x11grab --enable-libopencore-amrnb --enable-libopenc                                                                                        ore-amrwb --enable-libdc1394 --enable-libfaac --enable-libmp3lame --enable-libop                                                                                        enjpeg --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libx264                                                                                         --enable-libxvid --enable-zlib --enable-filter=drawtext
  libavutil     50.36. 0 / 50.36. 0
  libavcore      0.16. 1 /  0.16. 1
  libavcodec    52.108. 0 / 52.108. 0
  libavformat   52.93. 0 / 52.93. 0
  libavdevice   52. 2. 3 / 52. 2. 3
  libavfilter    1.74. 0 /  1.74. 0
  libswscale     0.12. 0 /  0.12. 0
[mpeg4 @ 0x626b50] Invalid and inefficient vfw-avi packed B frames detected
Input #0, avi, from 'input.avi':
  Metadata:
    encoder         : VirtualDubMod 1.5.10.2 (build 2542/release)
  Duration: 01:32:38.13, start: 0.000000, bitrate: 2094 kb/s
    Stream #0.0: Video: mpeg4, yuv420p, 720x304 [PAR 1:1 DAR 45:19], 23.98 tbr,                                                                                         23.98 tbn, 23.98 tbc
    Stream #0.1: Audio: ac3, 44100 Hz, 5.1, s16, 384 kb/s
At least one output file must be specified

Kiểm tra 1

Lệnh FFmpeg:

ffmpeg -i input.avi -vcodec libx264 -vpre lossless_slow -crf 25 -acodec libfaac -threads 0 -t 60 1.mp4

Màn hình kiểm tra 1:

Đầu ra giao diện điều khiển FFmpeg ( ffmpeg -i 1.mp4)

    FFmpeg version SVN-r26402, Copyright (c) 2000-2011 the FFmpeg developers
  built on Dec 28 2012 10:03:40 with gcc 4.4.6 20120305 (Red Hat 4.4.6-4)
  configuration: --enable-shared --enable-gpl --enable-version3 --enable-nonfree --enable-pthreads --enable-x11grab --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libdc1394 --enable-libfaac --enable-libmp3lame --enable-libopenjpeg --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-zlib --enable-filter=drawtext
  libavutil     50.36. 0 / 50.36. 0
  libavcore      0.16. 1 /  0.16. 1
  libavcodec    52.108. 0 / 52.108. 0
  libavformat   52.93. 0 / 52.93. 0
  libavdevice   52. 2. 3 / 52. 2. 3
  libavfilter    1.74. 0 /  1.74. 0
  libswscale     0.12. 0 /  0.12. 0
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 1970-01-01 00:00:00
    encoder         : Lavf52.93.0
  Duration: 00:01:00.01, start: 0.000000, bitrate: 618 kb/s
    Stream #0.0(und): Video: h264, yuv420p, 720x304 [PAR 1:1 DAR 45:19], 437 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
    Stream #0.1(und): Audio: aac, 44100 Hz, 5.1, s16, 176 kb/s
    Metadata:
      creation_time   : 1970-01-01 00:00:00
At least one output file must be specified

Kiểm tra 2

Lệnh FFmpeg:

ffmpeg -y -i input.avi -pass 1 -vcodec libx264 -vpre slow -b 2000k -threads 0 -t 60 -f mp4 -an -y /dev/null
ffmpeg -y -i input.avi -pass 2 -vcodec libx264 -vpre slow -b 2000k -threads 0 -t 60 -acodec libfaac -ab 128k -ac 2 2.mp4

Màn hình thử nghiệm 2:

Đầu ra giao diện điều khiển FFmpeg ( ffmpeg -i 2.mp4)

FFmpeg version SVN-r26402, Copyright (c) 2000-2011 the FFmpeg developers
  built on Dec 28 2012 10:03:40 with gcc 4.4.6 20120305 (Red Hat 4.4.6-4)
  configuration: --enable-shared --enable-gpl --enable-version3 --enable-nonfree --enable-pthreads --enable-x11grab --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libdc1394 --enable-libfaac --enable-libmp3lame --enable-libopenjpeg --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-zlib --enable-filter=drawtext
  libavutil     50.36. 0 / 50.36. 0
  libavcore      0.16. 1 /  0.16. 1
  libavcodec    52.108. 0 / 52.108. 0
  libavformat   52.93. 0 / 52.93. 0
  libavdevice   52. 2. 3 / 52. 2. 3
  libavfilter    1.74. 0 /  1.74. 0
  libswscale     0.12. 0 /  0.12. 0
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '2.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 1970-01-01 00:00:00
    encoder         : Lavf52.93.0
  Duration: 00:01:00.01, start: 0.000000, bitrate: 1097 kb/s
    Stream #0.0(und): Video: h264, yuv420p, 720x304 [PAR 1:1 DAR 45:19], 1028 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
    Stream #0.1(und): Audio: aac, 44100 Hz, stereo, s16, 63 kb/s
    Metadata:
      creation_time   : 1970-01-01 00:00:00
At least one output file must be specified

Câu trả lời:


60

Trước hết, cài đặt phiên bản FFmpeg mới hơn - lấy bản dựng tĩnh từ trang tải xuống .

Việc sử dụng các vprecài đặt trước (là cách để đặt giá trị mặc định cho cài đặt ffmpeg , không phải cài đặt bộ mã hóa) là không thực sự cần thiết; bạn thường muốn sử dụng các -presettùy chọn được xác định bởi các bộ mã hóa.

Những lý do bạn nhận được chất lượng đầu ra thấp là như sau, cho hai trường hợp của bạn tương ứng:

  1. Trong trường hợp đầu tiên bạn sử dụng crf 25, Hệ số tỷ lệ không đổi sẽ mang lại cho bạn chất lượng kém hơn so với mặc định cho bộ mã hóa x264 (là 23). CRF kiểm soát chất lượng. Hãy thử đặt CRF thấp hơn, có thể là 20, 18, v.v. Ở đây, thấp hơn có nghĩa là chất lượng tốt hơn, nhưng nó sẽ tăng kích thước tệp. Thay đổi 6 trong CRF cung cấp cho bạn hai lần / một nửa tốc độ bit trung bình ban đầu, đại khái là.

    Bạn sẽ phải đặt CRF thấp hơn vì mất thế hệ . Bạn đang mã hóa thứ gì đó đã được mã hóa, vì vậy bạn lại vứt bỏ thông tin hình ảnh. Điều đó không bao giờ tốt, nhưng nếu bạn phải, bạn sẽ phải đặt chất lượng cao hơn để không xóa quá nhiều thông tin khỏi video đầu vào.

  2. Trong trường hợp thứ hai, bạn đang cố gắng đặt tốc độ bit không đổi là 2 MBit / s. Video đầu vào của bạn đại khái có cùng tốc độ bit. Bây giờ, x264 cung cấp chất lượng hình ảnh tốt hơn nhiều so với bộ mã hóa hình ảnh MPEG-4 cho cùng một tốc độ bit, nhưng do mất thế hệ, một lần nữa, bạn có thể muốn sử dụng tốc độ bit cao hơn so với ban đầu - nếu không bạn sẽ bị nén quá nhiều thông tin.

    Hơn nữa, mã hóa bitrate liên tục có thể dẫn đến một số đoạn có vẻ tốt, nhưng các phần khác của video trông tệ hơn. Nếu bạn không để bộ mã hóa tự do chọn số lượng bit mà nó muốn chi cho một thứ gì đó, bạn sẽ hy sinh chất lượng với chi phí để biết kích thước tệp mục tiêu.

    x264 không có chế độ tốc độ bit không đổi, nhưng nó được coi là kém hơn các phương thức mã hóa khác. Trên thực tế, mã hóa hai chiều không nhằm mục đích chất lượng tối ưu, vì vậy hãy tìm hiểu kỹ.

Đó là tất cả những gì được nói, hãy thử một cái gì đó sau đây:

ffmpeg -i input.avi -c:v libx264 -crf 19 -preset slow -c:a libfdk_aac -b:a 192k -ac 2 out.mp4

Nếu libfdk_aackhông có sẵn, sử dụng cái này thay thế:

ffmpeg -i input.avi -c:v libx264 -crf 19 -preset slow -c:a aac -b:a 192k -ac 2 out.mp4

Núm điều khiển chất lượng chính sẽ là cài đặt CRF của bạn. Thử nghiệm với điều đó và sử dụng giá trị thấp hơn nếu bạn cần chất lượng tốt hơn.

Bạn cũng có thể chọn veryslowcài đặt trước, điều này sẽ giúp bạn nén tốt hơn, nhưng việc mã hóa rõ ràng sẽ mất nhiều thời gian hơn.

Nếu bạn không thể quản lý để có được một tệp chất lượng tốt ở kích thước tệp hợp lý, thì bạn đã hết may mắn. Tốt hơn là giữ nguyên bản gốc, không mã hóa lại. Không có công cụ "giữ nguyên chất lượng" kỳ diệu khi bạn nén thứ gì đó đã được nén.


Nếu video của bạn có kích thước nhỏ hơn sau khi chuyển đổi với hai lần vượt qua, bạn cần chỉ định tốc độ bit cao hơn. Hãy thử -b:v 3Mhoặc nhiều hơn nữa; nhưng tôi khuyên bạn nên sử dụng phương pháp CRF thay vì biến thể hai lượt.
slhck

10
@AhmetKa Một tùy chọn khác là chỉ cần chuyển lại luồng từ bộ chứa AVI sang bộ chứa MP4 : ffmpeg -i input.avi -c copy -map 0 output.mp4. Không có mã hóa lại nên không giảm chất lượng.
llogan

1
@AhmetKa Tôi nên đề cập rằng muxing sẽ không luôn hoạt động nếu định dạng bộ chứa đầu ra không hỗ trợ các định dạng phương tiện của đầu vào. Xem So sánh các định dạng chứa để có ý tưởng chung về những gì hoạt động.
llogan

Xin chào lần nữa @slhck Crf không đúng. Tốc độ bit, chiều rộng, chiều cao, vv Tôi có thể tính toán không?
Ahmet KAPIKIRAN

3
@hyde Bạn nên thích -c:a aac -strict experimentalthay vì libvo_aacenc, vì nó mang lại chất lượng tốt hơn.
slhck
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.