Làm cách nào tôi có thể sử dụng FFmpeg để giảm chất lượng video H264 nhưng vẫn giữ định dạng H264?


8

Tôi hoàn toàn không thích chỉnh sửa video, vì vậy hãy tha thứ cho tôi nếu tôi yêu cầu điều gì đó vô lý.

Tôi đang nhận được các video clip từ một hộp ghi âm hàng đầu. Các clip là tập tin AVI:

Resolution: 1920 x 1080
Frames Per Second: 60
Video Format: ITU H.264
Audio Format: MPEG 1 Audio, Layer 3 (MP3)

Độ phân giải và FPS vượt xa những gì tôi yêu cầu, vì vậy tôi đang cố gắng chạy một lệnh để thu nhỏ mọi thứ:

ffmpeg -i highres.avi -r 30 -s 960x540 lowerres.avi

Điều này thành công trong việc mang lại cho tôi độ phân giải mong muốn, tốc độ khung hình và kích thước tệp thấp hơn, nhưng nó cũng làm giảm chất lượng theo cách tôi mong đợi.

Tôi đã xem tập tin mới và thấy rằng vì một số lý do, FFmpeg đã chuyển đổi định dạng được sử dụng:

Video Format: FFmpeg MPEG-4
Audio Format: MPEG 1 Audio, Layer 2

Tôi không rõ tại sao nó không sử dụng các định dạng đầu ra giống như các định dạng đầu vào. Tôi đã cố gắng sử dụng lệnh này để buộc nó sử dụng H.264:

ffmpeg -i highres.avi -r 30 -s 960x540 -f h264 lowerresforceh264.avi

Thật không may, nó đã thất bại với đầu ra sau:

ffmpeg version 0.7.3-4:0.7.3-0ubuntu0.11.10.1, Copyright (c) 2000-2011 the Libav developers
  built on Jan  4 2012 16:21:50 with gcc 4.6.1
  configuration: --extra-version='4:0.7.3-0ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --enable-shared --disable-static
  WARNING: library configuration mismatch
  avutil      configuration: --extra-version='4:0.7.3ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-libopenjpeg --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdirac --enable-libmp3lame --enable-librtmp --enable-libx264 --enable-libxvid --enable-libvo-aacenc --enable-version3 --enable-libvo-amrwbenc --enable-version3 --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay
  avcodec     configuration: --extra-version='4:0.7.3ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-libopenjpeg --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdirac --enable-libmp3lame --enable-librtmp --enable-libx264 --enable-libxvid --enable-libvo-aacenc --enable-version3 --enable-libvo-amrwbenc --enable-version3 --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay
  avformat    configuration: --extra-version='4:0.7.3-0ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay
  avdevice    configuration: --extra-version='4:0.7.3-0ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay
  avfilter    configuration: --extra-version='4:0.7.3-0ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay
  swscale     configuration: --extra-version='4:0.7.3-0ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay
  postproc    configuration: --extra-version='4:0.7.3-0ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay
  libavutil    51.  7. 0 / 51.  7. 0
  libavcodec   53.  6. 0 / 53.  6. 0
  libavformat  53.  3. 0 / 53.  3. 0
  libavdevice  53.  0. 0 / 53.  0. 0
  libavfilter   2.  4. 0 /  2.  4. 0
  libswscale    2.  0. 0 /  2.  0. 0
  libpostproc  52.  0. 0 / 52.  0. 0
Input #0, avi, from 'highres.avi':
  Metadata:
    comment         : Quality_GOOD
    encoder         : Lavf52.64.2
    encoded_by      : AverMedia_c281_1.7.2
  Duration: 00:01:59.28, start: 0.000000, bitrate: 10263 kb/s
    Stream #0.0: Video: h264 (High), yuv420p, 1920x1080, 59.94 fps, 59.94 tbr, 59.94 tbn, 119.88 tbc
    Stream #0.1: Audio: mp3, 48000 Hz, stereo, s16, 128 kb/s
[buffer @ 0x8f438a0] w:1920 h:1080 pixfmt:yuv420p
[scale @ 0x8f431e0] w:1920 h:1080 fmt:yuv420p -> w:960 h:540 fmt:yuv420p flags:0x4
[libx264 @ 0x8f0fb40] broken ffmpeg default settings detected
[libx264 @ 0x8f0fb40] use an encoding preset (e.g. -vpre medium)
[libx264 @ 0x8f0fb40] preset usage: -vpre <speed> -vpre <profile>
[libx264 @ 0x8f0fb40] speed presets are listed in x264 --help
[libx264 @ 0x8f0fb40] profile is optional; x264 defaults to high
Output #0, h264, to 'lowerresforceh264.avi':
    Stream #0.0: Video: libx264, yuv420p, 960x540, q=2-31, 200 kb/s, 90k tbn, 30 tbc
Stream mapping:
  Stream #0.0 -> #0.0
Error while opening encoder for output stream #0.0 - maybe incorrect parameters such as bit_rate, rate, width or height

Tôi không chắc tại sao tôi không thể làm điều này. Chạy "ffmpeg -formats" được liệt kê h264 như một cách nó có thể sử dụng cho cả đầu vào và đầu ra.

Nếu bất cứ ai có thể chỉ cho tôi đi đúng hướng, tôi sẽ đánh giá cao nó. Cảm ơn.

PS: Tôi đang sử dụng phiên bản FFmpeg 0.7.3-4: 0.7.3-0 trên Ubuntu 11.10.

BIÊN TẬP

Tôi đã tìm thấy một giải pháp xem xét việc sử dụng các cài đặt trước. Sau khi tìm kiếm thông tin về các cài đặt trước, tôi tìm thấy hướng dẫn sau đây thảo luận về chúng:

http://juliensimon.blogspot.com/2009/01/howto-ffmpeg-x264-presets.html

Tôi chỉ cần xác định codec và cài đặt đặt sẵn thích hợp như vậy:

ffmpeg -i highres.avi -r 30 -s 960x540 -vcodec libx264 -vpre medium lowerresforceh264vpremedium.avi

Tôi vẫn có một số điều chỉnh để làm, nhưng về cơ bản đây là những gì tôi muốn. Cảm ơn.


Chắc chắn một số người đơn giản chỉ muốn biết làm thế nào để chuyển đổi file AVerMedia .avi .mp4 để họ chơi trên Mountain Lion / Mavericks <pre> ffmpeg -i 140203-1229.avi -vcodec sao chép bản sao -acodec fromavermedia_cog.mp4 </ pre>

Câu trả lời:


3

Tôi đang cố gắng giúp đỡ. Đầu tiên, tôi không hiểu tại sao bạn nói FFMPEG H.264 không phải là định dạng đầu vào?

Tôi không biết dòng lệnh FFMPEG đủ tốt (có ai làm không ?;)). Phải có một công tắc để mã hóa nhiều lần. Tôi biết có một số cài đặt sẵn có thể bạn có thể sử dụng và thực hiện gần như chắc chắn những gì bạn đang hướng tới. Chúng thường được gọi là cài đặt trước x264 hoặc giai điệu x264. Bạn có thể tìm thấy bất cứ điều gì như vậy?


Cảm ơn. Cuộc nói chuyện của bạn về các cài đặt trước đã giúp tôi tìm ra một giải pháp khả thi. Tôi sẽ chỉnh sửa bài viết để hiển thị những gì tôi đã làm.
BigBeagle

Giải pháp tốt đẹp. Đã thêm vào bộ sưu tập đoạn trích của tôi. Cảm ơn.
Zettt

2
@BigBeagle: Khi bạn tìm thấy câu trả lời cho câu hỏi của mình, bạn có thể đăng nó dưới dạng câu trả lời. Chỉnh sửa câu hỏi của bạn được thực hiện để cung cấp rõ ràng hơn cho câu hỏi. Theo tôi hiểu, câu trả lời đi trong phần câu trả lời.
Nav

8

ffmpeg đã loại bỏ các cài đặt trước x264 của họ để cài đặt -vpre không hoạt động nữa.

Bây giờ, tôi có một tập lệnh để chuyển đổi tập tin video sang định dạng mà Điện thoại di động của tôi có thể xử lý.

ffmpeg -i input.avi -sws_flags lanczos+accurate_rnd -vf "scale=320:240" -c:v libx264 -crf 20 -preset veryslow -profile:v main -tune fastdecode -c:a copy output.mkv

Tôi sẽ giải thích từng lựa chọn

-sws_flags lanczos+accurate_rnd tùy chọn này là thuật toán thu nhỏ, lanczos được khuyến nghị vì nó tạo ra ít tạo tác nhất mà không làm mờ nhưng nó chậm.

-vf "scale=..." là tự giải thích xác định độ phân giải đầu ra

-crf 20Đây là chất lượng, 20 là cài đặt đầu ra tốt (không sử dụng trước khi chỉnh sửa), đây là chất lượng không đổi và là tùy chọn tốt nhất khi kích thước tệp không chặt chẽ và sẽ tạo ra chất lượng tốt hơn ở kích thước tệp thấp hơn bất kỳ thứ gì khác , nếu không, hãy sử dụng hai lượt để có chất lượng tối đa ở một kích thước tệp cụ thể (như cần phải khớp với CD hoặc DVD), -b 2000kchỉ nên sử dụng tốc độ bit cố định (ví dụ ) khi phát trực tuyến, trường hợp đặc biệt là '0' không mất dữ liệu và phạm vi của tùy chọn này là từ 1 (chất lượng cao nhất) đến 50 (chất lượng thấp nhất).

Một thử nghiệm tốt cho điều này là chạy qua mã hóa với -crf 20 lưu ý đến tốc độ bit, và sau đó sử dụng cài đặt -b cho phiên bản thứ 2 của tệp nên có cùng kích thước tệp, so sánh cả hai về chất lượng sự khác biệt

-preset veryslow Điều này chọn bao nhiêu CPU bạn muốn sử dụng, càng chậm thì kích thước tệp càng nhỏ và chất lượng tốt hơn.

-profile:v mainđây là cấu hình H.264 để sử dụng. Cao là kích thước tệp hiệu quả nhất, khôn ngoan nhưng sử dụng rất nhiều CPU để giải mã so với các định dạng khác, được cho là phổ biến nhất vì hầu hết các điện thoại di động đều có bộ giải mã phần cứng tích hợp và flash player hỗ trợ, tôi không phải vậy. dùng chính.

-tune fastdecode Điện thoại di động của tôi không thích phát các tệp mà không có tùy chọn này, nhưng thông thường, điều này có thể để trống hoặc được đặt thành 'phim' cho các trò chơi video, lý do chính khiến bạn sử dụng điều này là để có thêm một chút chất lượng.

Và điều cuối cùng tôi rất khuyên bạn nên sử dụng định dạng bộ chứa hiện đại .avi không được thiết kế để giữ H.264 và theo những gì tôi hiểu thì không có tiêu chuẩn nào để lưu trữ H.264 hoặc làm cho tệp lớn hơn 2GB, hầu hết các triển khai đều bị hack và dễ bị để có vấn đề, sử dụng mkv hoặc mp4.


Các cài đặt trước cho libx264 hiện được chỉ định bởi -presetnhư trong-preset slow
stib

-tune fastdecodevô hiệu hóa gỡ lỗi và các khung B và P có trọng số, cũng như CABAC. Có bộ giải mã nào có thể xử lý khung B, nhưng CABAC không? Tôi sẽ đề nghị -profile:v baseline, nếu bạn cần nhắm mục tiêu bộ giải mã phần cứng cũ. ( fastdecodecó thể hữu ích nếu nhắm mục tiêu bộ giải mã phần mềm vào CPU chậm, nhưng không phải là bộ giải mã phần cứng.) Chính với khung B nhưng không gỡ lỗi hoặc CABAC có thể hoặc có thể trông không tốt hơn đường cơ sở với gỡ lỗi. +1 để đề xuất không-AVI để lưu trữ h.264. IIRC, khung chính là khung B, nhưng vâng, h.264 trong avi không được chuẩn hóa tốt và nó rất khó.
Peter Cordes

Tôi sẽ gọi -crf 20một trận chung kết cao. Bạn có thể thay đổi thành 22 hoặc thậm chí 24 và có thể ổn, trừ khi nó chuyển động cao, như một sự kiện thể thao.
user24601

2

Có một số điều cần làm rõ:

  • Một định dạng không phải là một codec; bạn muốn có được một tập tin ở định dạng avi với video được mã hóa bằng codec h264 . Chỉ cần sử dụng -vcodec libx264 và tên tệp với .avi . Ffmpeg sẽ nhận ra một định dạng bằng cách xem phần mở rộng tệp, nhưng bạn cũng có thể thêm cụ thể -f avi . Bạn chắc chắn không muốn sử dụng mpeg1, vì nó cho chất lượng kém hơn mpeg2 hoặc thậm chí tệ hơn so với mpeg4, mà tôi khuyên dùng.
  • Vấn đề của bạn là ffmpeg chỉ sử dụng chất lượng thấp nhất có thể vì bạn không chỉ định bất kỳ. Tùy chọn -sameq dường như hiếm khi làm việc với tôi. Trong thực tế, rất thuận tiện để thiết lập bitrate thủ công. Thêm vào, ví dụ, -vb 3000k để có được một tệp có tốc độ bit video trung bình là 3Mb / s, cho chất lượng khá tốt. Tôi đoán nó sẽ đủ để bạn có 2Mb / s cho độ phân giải được đề cập.
  • Chìa khóa để hạ thấp kích thước tệp không phải là độ phân giải, mà là bitrate được đề cập ở trên. Tôi thà bám vào độ phân giải ban đầu và chỉ thao tác với bitrate.
  • Tôi đoán bạn cũng muốn giữ âm thanh mà không cần chuyển đổi (vì vậy không giảm chất lượng), vì vậy hãy sử dụng bản sao -acodec .

Hãy thử điều này: ffmpeg -i highres.avi -acodec copy -vcodec libx264 -vb 2000k lowres.avi


4
Tốc độ bit không đổi là kém nhất (về chất lượng so với kích thước) của tất cả các chế độ kiểm soát tốc độ trong x264 và nên tránh. Sử dụng -crfđể đặt chế độ chất lượng không đổi thay thế.
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.