Mã hóa lại thư viện video trong x265 (HEVC) mà không giảm chất lượng


43

Tôi đang cố gắng chuyển đổi thư viện video của mình sang định dạng HEVC để có được không gian. Tôi đã chạy lệnh sau trên tất cả các tệp video trong thư viện của mình:

#!/bin/bash
for i in *.mp4;
do 
    #Output new files by prepending "X265" to the names
    avconv -i "$i" -c:v libx265 -c:a copy X265_"$i"
done

Bây giờ, hầu hết các video chuyển đổi tốt và chất lượng vẫn như trước. Tuy nhiên, một vài video có chất lượng rất cao (ví dụ: một bản in phim có dung lượng 5 GB) sẽ mất chất lượng - tất cả video đều bị pixel.

Tôi không chắc phải làm gì trong trường hợp này. Tôi có cần sửa đổi crftham số trong dòng lệnh của mình không? Hay cái gì khác?

Vấn đề là, tôi đang thực hiện một chuyển đổi số lượng lớn. Vì vậy, tôi cần một phương pháp trong đó avconvtự động điều chỉnh bất kỳ tham số nào cần điều chỉnh, cho mỗi video.

CẬP NHẬT-1

Tôi thấy đó crflà núm tôi cần điều chỉnh. CRF mặc định là 28. Để có chất lượng tốt hơn, tôi có thể sử dụng thứ gì đó nhỏ hơn 28. Ví dụ:

avconv -i input.mp4 -c:v libx265 -x265-params crf=23 -c:a copy output.mp4

Tuy nhiên, vấn đề là đối với một số video, giá trị CRF là 28 là đủ tốt, trong khi đối với một số video, CRF thấp hơn là bắt buộc. Đây là điều mà tôi phải kiểm tra thủ công bằng cách chuyển đổi các phần nhỏ của video lớn. Nhưng trong chuyển đổi hàng loạt, làm cách nào để kiểm tra từng video theo cách thủ công? Là một số cách của họ avconvcó thể điều chỉnh CRF theo video đầu vào một cách thông minh?

CẬP NHẬT-2

Tôi thấy rằng có một --losslesstùy chọn trong x265: http://x265.readthedocs.org/en/default/lossless.html .

Tuy nhiên, tôi không biết cách sử dụng nó một cách chính xác. Tôi đã thử sử dụng nó theo cách sau nhưng nó mang lại kết quả ngược lại (video thậm chí còn nhiều pixel hơn):

avconv -i input.mp4 -c:v libx265 -x265-params lossless -c:a copy output.mp4

1
--losslesstrong thực tế có thể phóng to tập tin, nếu nó giải mã codec bị mất trước đó và sau đó mã hóa những gì nó đã giải mã một cách dễ dàng. Chất lượng sẽ giữ chính xác như đầu vào.
Gole Ramblar

2
Nếu các nguồn của bạn được mã hóa trong tổn thất (rất có thể), thì những gì bạn đang cố gắng đạt được là không thể. Bất kỳ chuyển mã nào không mất dữ liệu sẽ làm giảm chất lượng hơn nữa (ngay cả khi bạn không nhìn thấy ngay lập tức) và nếu bạn chuyển đổi từ lossy sang lossless, bạn sẽ nhận được kích thước tệp lớn hơn.
Sange Borsch

Câu trả lời:


58

Từ kinh nghiệm của riêng tôi, nếu bạn muốn hoàn toàn không bị giảm chất lượng, - không có gì là thứ bạn đang tìm kiếm.

Không chắc chắn về avconvnhưng lệnh bạn đã nhập trông giống hệt như những gì tôi làm với FFmpeg. Trong FFmpegbạn có thể truyền tham số như thế này:

ffmpeg -i INPUT.mkv -c:v libx265 -preset ultrafast -x265-params lossless=1 OUTPUT.mkv

Hầu hết các x265công tắc (tùy chọn không có giá trị) có thể được chỉ định như thế này (ngoại trừ những công tắc chỉ có CLI, những công tắc chỉ được sử dụng x265trực tiếp với nhị phân).

Ngoài ra, tôi muốn chia sẻ kinh nghiệm của mình với x265mã hóa. Đối với hầu hết các video (có thể là WMV hoặc MPEG hoặc AVC / H.264) tôi sử dụng crf=23. x265quyết định phần còn lại của các tham số và thường nó làm một công việc đủ tốt.

Tuy nhiên thường trước khi tôi cam kết chuyển mã toàn bộ video, tôi đã kiểm tra cài đặt của mình bằng cách chuyển đổi một phần nhỏ của video được đề cập. Dưới đây là một ví dụ, giả sử tệp mkv có luồng 0 là video, luồng 1 là âm thanh DTS và luồng 2 là phụ đề:

ffmpeg -hide_banner \
-ss 0 \
-i "INPUT.mkv" \
-attach "COVER.jpg" \
-map_metadata 0 \
-map_chapters 0 \
-metadata title="TITLE" \
-map 0:0 -metadata:s:v:0 language=eng \
-map 0:1 -metadata:s:a:0 language=eng -metadata:s:a:0 title="Surround 5.1 (DTS)" \
-map 0:2 -metadata:s:s:0 language=eng -metadata:s:s:0 title="English" \
-metadata:s:t:0 filename="Cover.jpg" -metadata:s:t:0 mimetype="image/jpeg" \
-c:v libx265 -preset ultrafast -x265-params \
crf=22:qcomp=0.8:aq-mode=1:aq_strength=1.0:qg-size=16:psy-rd=0.7:psy-rdoq=5.0:rdoq-level=1:merange=44 \
-c:a copy \
-c:s copy \
-t 120 \
"OUTPUT.HEVC.DTS.Sample.mkv"

Lưu ý rằng đường tín hiệu dấu gạch chéo ngược bị phá vỡ trong một lệnh dài, tôi làm điều đó để giúp tôi theo dõi các bit khác nhau của đầu vào CLI phức tạp. Trước khi tôi giải thích từng dòng một, phần mà bạn chỉ chuyển đổi một phần nhỏ của video là dòng thứ hai và dòng cuối cùng thứ hai: -ss 0có nghĩa là tìm đến 0 giây trước khi bắt đầu giải mã đầu vào và -t 120có nghĩa là dừng ghi vào đầu ra sau 120 giây. Bạn cũng có thể sử dụng các định dạng thời gian hh: mm: ss hoặc hh: mm: ss.sss.

Bây giờ từng dòng một:

  1. -hide_bannerngăn chặn FFmpeghiển thị thông tin xây dựng khi bắt đầu. Tôi chỉ không muốn nhìn thấy nó khi tôi cuộn lên trong bảng điều khiển;
  2. -ss 0tìm đến 0 giây trước khi bắt đầu giải mã đầu vào. Lưu ý rằng nếu tham số này được đưa ra sau tệp đầu vào và trước tệp đầu ra, nó sẽ trở thành tùy chọn đầu ra và yêu ffmpegcầu giải mã và bỏ qua đầu vào cho đến x giây, sau đó bắt đầu ghi vào đầu ra. Là một tùy chọn đầu vào, nó ít chính xác hơn (vì tìm kiếm không chính xác trong hầu hết các định dạng chứa), nhưng hầu như không mất thời gian. Là một tùy chọn đầu ra, nó rất chính xác nhưng cần một lượng thời gian đáng kể để giải mã tất cả luồng trước thời gian đã chỉ định và cho mục đích thử nghiệm mà bạn không muốn lãng phí thời gian;
  3. -i "INPUT.mkv": Chỉ định tệp đầu vào;
  4. -attach "COVER.jpg": Đính kèm ảnh bìa (hình thu nhỏ, áp phích, bất cứ thứ gì) vào đầu ra. Ảnh bìa thường được thể hiện trong các nhà thám hiểm tập tin;
  5. -map_metadata 0: Sao chép bất kỳ và tất cả siêu dữ liệu từ đầu vào 0, trong ví dụ này chỉ là đầu vào;
  6. -map_chapters 0: Sao chép thông tin chương (nếu có) từ đầu vào 0;
  7. -metadata title="TITLE": Đặt tiêu đề của video;
  8. -map 0:0 ...: Luồng bản đồ 0 của đầu vào 0, có nghĩa là chúng tôi muốn luồng đầu tiên từ đầu vào được ghi vào đầu ra. Vì luồng này là luồng video, nó là luồng video đầu tiên trong đầu ra , do đó chỉ định luồng :s:v:0. Đặt thẻ ngôn ngữ của nó thành tiếng Anh;
  9. -map 0:1 ...: Tương tự như dòng 8, ánh xạ luồng thứ hai (âm thanh DTS) và đặt ngôn ngữ và tiêu đề của nó (để nhận dạng dễ dàng hơn khi chọn từ người chơi);
  10. -map 0:2 ...: Tương tự như dòng 9, ngoại trừ luồng này là phụ đề;
  11. -metadata:s:t:0 ...: Đặt siêu dữ liệu cho ảnh bìa. Điều này là cần thiết cho định dạng container mkv;
  12. -c:v libx265 ...: Tùy chọn codec video. Nó dài đến nỗi tôi đã chia nó thành hai dòng. Cài đặt này phù hợp với video làm mờ chất lượng cao (1080p) với độ dốc tối thiểu theo độ dốc (x265 hút vào). Nó rất có thể là một quá mức cần thiết cho DVD và chương trình TV và video điện thoại. Cài đặt này chủ yếu bị đánh cắp từ bài đăng Doom9 này ;
  13. crf=22:...: Tiếp tục các tham số codec video. Xem bài viết diễn đàn nêu trên;
  14. -c:a copy: Sao chép qua âm thanh;
  15. -c:s copy: Sao chép phụ đề;
  16. -t 120: Dừng ghi vào đầu ra sau 120 giây, cung cấp cho chúng tôi đoạn clip dài 2 phút để xem trước chất lượng trancoding;
  17. "OUTPUT.HEVC.DTS.Sample.mkv": Tên tệp xuất ra. Tôi gắn thẻ tên tệp của mình với codec video và codec âm thanh chính.

Phù Đây là câu trả lời đầu tiên của tôi vì vậy nếu có bất cứ điều gì tôi bỏ lỡ xin vui lòng để lại nhận xét. Tôi không phải là chuyên gia sản xuất video, tôi chỉ là một chàng trai quá lười xem phim bằng cách đưa đĩa vào máy nghe nhạc.

Tái bút Có lẽ câu hỏi này thuộc về một nơi khác vì nó không liên quan nhiều đến Unix & Linux.


2
Chính xác những gì tôi đang tìm kiếm! Bảo hiểm tốt đẹp của các tùy chọn. Bạn có biết nếu ffmpeg sẽ chùn bước c:s copynếu không có nội dung phụ đề?
Anh Cả Geek

1
@ElderGeek Không, ffmpeg sẽ chỉ nói điều gì đó nếu tùy chọn đó có bất kỳ ảnh hưởng nào.
Yifeng Mu

Liệu tùy chọn này có tạo kích thước tệp nhỏ nhất có thể để mã hóa h265 thực sự không mất? Nếu không, có cách nào tôi có thể làm điều này?
Bộ đệm đã đọc

1
@TheBitByte Tôi không nghĩ có mức nén không mất trong h265. Đối với tùy chọn không nén, nó chỉ là --lossless. Tôi đã tìm kiếm một cách vô ích để chuyển đổi không mất mát từ h264 sang h265, và những gì tôi học được cho tôi biết đó là điều không thể về mặt toán học.
Yifeng Mu

1
Bạn thực sự nên chỉnh sửa lệnh chứa công --losslesstắc ra khỏi câu trả lời này, bởi vì đặt câu trả lời cho câu hỏi này nghe có vẻ như bạn đang nói rằng đó là nén không mất dữ liệu, gây hiểu lầm.
Hashim

8

Gần đây tôi đã trải qua sự cố chuyển mã toàn bộ danh mục video của mình sang HEVC. Tôi sử dụng https://github.com/FallingSnow/h265ize với các cài đặt sau.

h265ize -v -m vừa -q 20 -x --no-sao --aq-mode 3 --delete --stats

-v - Đầu ra dài dòng
-m trung bình - Tốc độ mã hóa trung bình (chất lượng cao hơn nhỏ hơn, mọi thứ tôi thấy chậm hơn đều không xứng đáng với thời gian / chất lượng khác nhau)
-q 20 - CRF được sử dụng, 20 tương tự như 18 hoặc hơn trong x264 nhưng hey. Đây là nội dung 1080p (90% TV của tôi) Tôi có xu hướng sử dụng 22 cho phim 4K của mình
-x - Sử dụng các lệnh được xác định trung tâm x265 - no
-sao tắt Offset Thích ứng mẫu (cải thiện tốc độ mã hóa)
- chế độ mã hóa 3 - sử dụng thích ứng lượng tử với khả năng tự biến, giúp mã hóa 8 bit, đặc biệt là ở vùng tối, dừng hầu hết các dải có thể xảy ra (bằng chi phí của mã hóa thời gian mặc dù)
--delete - thay thế tập tin với tập tin được mã hóa (mã hóa kiểm tra trước khi sử dụng cái này )
- - Viết số liệu thống kê ra tệp csv trong thư mục gốc của đường dẫn bạn đã chạy.

Tốc độ mã hóa khoảng 30 khung hình / giây (đối với hầu hết các nội dung 1080p) trên giàn của tôi. Dual Xeon E5 2687W v2, nhưng tôi buộc quy trình FFMPEG không sử dụng phía đầu tiên của một trong các bộ xử lý (Đó là máy chủ Plex của tôi, do đó phải đảm bảo có phí chuyển đổi nếu cần khi phát lại, v.v.)

Vâng, phải mất một thời gian để chuyển đổi hầu hết trong số đó, và bây giờ tôi có một nhiệm vụ theo lịch trình chạy hai lần một ngày để mã hóa nội dung từ ngày đó sang x265.

Tiết kiệm không gian đã rất lớn. SAN ban đầu của tôi là ở mức 20Tb, bây giờ là khoảng 12 nhưng rõ ràng đã được thêm vào với nội dung nhiều hơn 6 tháng.

Tuy nhiên, tôi cũng đã bắt đầu chuyển mã tất cả các Phim của mình, đó là một quá trình đang diễn ra, vì tôi phải đạt mức chất lượng ID (may mắn là Radarr dán nhãn một cách độc đáo) và sử dụng một trong ba cài đặt chuyển mã:

-m slower -q 18 -x --no-sao --aq-mode 3cho chuyển mã 720p
-m medium -q 20 -x --no-sao --aq-mode 3cho 1080p
-m medium -q 22 -x --no-saocho 2160p

Hy vọng rằng sẽ giúp một số người. Hét lên nếu bất cứ ai cần một bàn tay thiết lập tất cả. Và trước khi bạn mã hóa mọi thứ thành x265, hãy nghĩ đến việc phát lại, nếu máy khách không hỗ trợ x265 bản địa, thì việc chuyển đổi có thể tốn kém về CPU và Chất lượng.


Với x265 2.4 trở lên (với các bảng lambda mới cho mã hóa sắc nét hơn), SAO thường là một điều tốt cho chất lượng trên mỗi bitrate. Nó vẫn hơi nhòe, nhưng làm giảm sự giả tạo khác đủ để có giá trị.
Peter Cordes

-q 20không phải là CRF 20, đó là kiểm soát chuột QP không đổi . Chế độ mặc định và được đề xuất, CRF, tăng một số QP trong các cảnh có độ phức tạp cao để nó không tiêu tốn quá nhiều bit cho các cảnh quá khó để mã hóa. (Nếu bạn muốn gần hơn với QP thống nhất, hãy tăng qcomptừ 0,6 mặc định lên 0,7 hoặc 0,8. Gần hơn với 1,0 gần với CQP.)
Peter Cordes

3

Cú pháp chính xác để bật chế độ lossless cho bộ mã hóa x265 trong ffmpeg là -x265-params lossless=1(bạn cần phải nối thêm =1).

Tuy nhiên, đối với mã hóa lossless, có các lựa chọn codec tốt hơn. Tôi đã tìm thấy bằng cách kiểm tra FFV1 nén tốt hơn rất nhiều (kích thước tệp = ~ 80% của x265) ít nhất trên một số loại video (nếu cài đặt tốt nhất được chọn cho cả hai codec). Và nó cũng hoạt động nhanh hơn và (AFAIK) không bị đóng gói bởi các bằng sáng chế. Đó là, nó vượt trội so với H.265 lossless về mọi mặt để lưu trữ video.

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.