Trao đổi với tôi

http://www.buidao.com

1/15/13

[Encoding] Giới thiệu setting x264 cho MEGUI

Bài này mình sẽ giới thiệu về ý nghĩa các settings x264. Trong MeGui khi ấn Config, ta thấy có 1 loạt tab như Frame-Type, Rate Control, Analysis xuất hiện cùng với 1 mớ thông số khó hiểu. Những thông số đó chính là setting của x264. Tùy vào cách chỉnh những thông số này mà chất lượng bản encode sẽ khác nhau.

1. Cơ bản về Frame

Trong tab Frame-Type, ta thấy có 1 vài thông số ghi B-Frames, I-Frames hay P-Frames. Để hiểu các loại Frames này, ta cần tìm hiểu sơ lược về Frames.

Frame là gì? Nói dễ hiểu thì Frame là khung hình. Chẳng hạn mọi người vẫn hay nghe 24 hình / giây, mỗi hình đó chính là 1 Frame.

Slices là gì? Để chi tiết hóa việc thiết lập quá trình suy diễn từ frame trước sang frame sau, x264 mã hóa từng vùng nhỏ trong một frame, những vùng này gọi là slice .Một slice là một khu vực không gian riêng biệt của một frame được mã hóa riêng từ bất kỳ khu vực khác trong cùng một frame. Tương tự  I-frame, P-frame, và B-frame, thì có I-slices, P-slices B-slices.

Macroblocks là gì? Thông thường, frame được tách ra thành các macroblocks, và loại suy diễn đặc trưng khi mã hóa có thể được lựa chọn trên cơ sở macroblock thay vì toàn bộ frame,
Hơn nữa, trong video codec H.264, frame có thể được tách ra thành các chuỗi macroblocks gọi là slice, thay vì lựa chọn loại I, B và P-frame để sử dụng, bộ mã hóa có thể chọn cách "suy diễn"  trên mỗi slice. 

Video được nén với công nghệ mới hiện nay thường bao gồm 3 loại Frames: I, P và B. Mỗi loại Frames được tạo ra bởi các giải thuật khác nhau và có các đặc điểm lợi hại khác nhau.


  • Intra (I) Frames (hay còn gọi là Key Frames) : Lưu trữ toàn bộ hình ảnh, do đó độ nén là thấp nhất ~ dung lượng lớn nhất. Do lưu trữ toàn bộ hình ảnh nên I Frames không đòi hỏi cần phải có Frames khác để Decode. Khi xem phim, ta muốn tua đến 1 đoạn nào đó của phim đòi hỏi ở đó phải có I Frames. Đôi khi tua phim ta thường gặp trường hợp bị lag, phim đứng 1 lúc rồi mới chạy, đó là do điểm ta tua tới không có I Frames, nó sẽ tìm cho đến khi nào gặp được I Frames mới chạy được.
  • Predictive (P) Frames: Chỉ lưu trữ những điểm khác biệt giữa nó với khung hình trước nó (ta gọi là tham khảo đến khung hình trước) ==> Dung lượng nhỏ hơn I Frames. Khung hình trước đó có thể là 1 I Frame hoặc 1 P Frame khác.

    Để dễ hiểu, hãy xem 1 ví dụ thực tế như thế này. Người A giới thiệu về bản thân, 1 loạt thông tin như họ tên, nghề nghiệp, quê quán, giới tính, cha mẹ .... Để lưu trữ thông tin về người A, ta cần viết đầy 1 trang giấy A4, không thể thiếu gì. Người B là anh em sinh đôi với người A, có tất cả thông tin giống hệt người A, chỉ khác tên. Do đó, để lưu trữ thông tin người B, ta chỉ cần viết lại 2 dòng, dòng thứ 1 viết tên, dòng thứ 2 viết "Các thông tin khác giống hệt người A". Trong ví dụ này, người A chính là I Frames, còn người B là P Frames.

    Trong encode phim, giả sử có 1 đoạn phim là 1 người đi ngang qua màn hình. P Frame chỉ cần lưu giữ lại thông tin chuyển động của người đó mà không cần lưu thông tin phong cảnh xung quanh vì phong cảnh hoàn toàn đứng yên không thay đổi.
    Như đã nói ở trên, bản thân P Frames cũng có thể được tham khảo bởi 1 Frame khác. Để làm được điều này thì P Frames đó phải chứa đủ lượng thông tin cần thiết (đương nhiên là không cần nhiều như I Frames).
  • Bidirectional (B) Frames: tương tự P Frames, B Frames cũng chỉ lưu thông tin khác nhau giữa nó và Frames khác. Nếu P Frames chỉ sử dụng các Frames trước nó để tham khảo thì B Frames tham khảo cả các Frames trước và sau nó, và B Frames không cho phép các Frames khác tham khảo (Ngoại trừ "B-frame pyramid"). Điều này giúp B Frames đạt độ nén tốt nhất ~ dung lượng nhỏ nhất trong các loại Frames và nếu được đặt đúng chỗ có thể cho ra chất lượng không hề giảm sút. x264 còn hỗ trợ "B-frame pyramids", loại B Frames này cho phép các B-Frames khác tham khảo tới nó.


1 Ví dụ về 3 loại Frames (Hình lấy từ Wikipedia)

Ưu điểm của các loại Frames tham khảo các Frames khác quá rõ ràng là làm giảm dung lượng video được nén. Nhược điểm của việc này là nếu Frame Y tham khảo Frame X mà Frame X lại bị lỗi thì lỗi đó sẽ truyền sang Frame Y và cứ tiếp tục như vậy cho các Frame nào tham khảo Y.

Tóm lại, 1 file video sẽ là 1 tổ hợp các Frames I, P và B, 1 vài Frames tham khảo những Frames khác. Sự thành công của việc tổ hợp và tham khảo này sẽ quyết định chất lượng video.

2. Ý nghĩa các thông số liên quan đến Frame-Type

bframes: Lựa chọn số lượng B-Frames liên tục tối đa mà x264 có thể sử dụng. Nếu không sử dụng B-Frames, 1 chuỗi Frames có thể có dạng như sau: IPPPPP...PI. Nếu sử dụng B-Frames = 2, tối đa 2 P-Frames có thể thay thế bằng B-Frames: IBPBBPBPPPB...PI.
Encode với Command Line: --bframes n (n là số lượng B-Frames)
Encode với MeGui:: Number of B-frames.

Adaptive - b-adapt: Cho phép x264 quyết định mức độ sử dụng B-Frames nhiều hay ít.
  • 0. Luôn sử dụng B-Frames.
  • 1. Giải thuật nhanh ("Fast"). Thời gian encode nhanh hơn chút ít khi giá trị --b-frames càng cao. Nếu sử dụng giá trị này, không bao giờ nên để bframes thấp hơn 16.
  • 2. Giải thuật tối ưu ("Optimal"). Thời gian encode chậm đáng kể khi giá trị --b-frames càng cao.
Command Line: --no-b-adapt hoặc --b-adapt n
MeGui: Adaptive B-frames.

Bias - b-bias: Giá trị càng cao thì x264 sẽ sử dụng càng nhiều B-Frames để thay thế cho P-Frames. Nếu giá trị này được set bằng 100 tương đương việc b-adapt = 0.
Command Line: --b-bias n
MeGui: B-frame bias.

Pyramid - b-pyramid: Cho phép B Frames được tham khảo bởi các Frames khác. Nếu không có thông số này, chỉ I hoặc P Frames được tham khảo bởi các Frames khác. Để sử dụng thông số này, cần phải dùng ít nhất 2 B-frames. Chỉ khi encode Bluray mới sử dụng none hoặc strict, còn lại nên để default là normal.
Command Line: --b-pyramid n
MeGui: B-pyramid.

Weighted Prediction - weightb: Kích hoạt chức năng đánh giá trọng số cho B-Frames, từ đó cho ra kết quả chính xác và hiệu quả hơn trong quá trình encode.
Command Line: --weightb n
MeGui: Weighted Prediction for B-frames.

Reference Frames - ref: Số lượng Frames mà 1 Frame có thể tham khảo tới. Số này càng lớn chất lượng sẽ tăng tuy nhiên thời gian encode cũng sẽ tăng theo đáng kể. Tuy nhiên tham số này vẫn là tham số xứng đáng trong việc đổi thời gian lấy chất lượng. Thông thường giá trị này nên để trong khoảng từ 3-5. Với các nội dung có sự lặp lại, tương tự về mặt hình ảnh, giá trị này có thể để lên 8-10.
1 lưu ý là khi sử dụng Level 4.1(đã cấu hình ở bài trước), số lượng Reference Frames tối đa cho video 720p là 9 và 1080p là 4. Để quá cao sẽ dẫn đến dư thừa lãng phí, và yêu cầu phần cứng cao hơn để có thể decode. Tổng quát, ta có thể tính số lượng Reference Frames tối đa cho Level 4.1 theo công thức sau:
Code:
--ref = Truncate(8388608/(width * height))
Truncate là làm tròn đến số nguyên nhỏ hơn gần nó nhất. Chẳng hạn phép chia cho ra kết quả 4.165 -> 4 hay 9.856 -> 9
Command Line: --ref n
MeGui: Number of Reference Frames

GOP Size (Min/Max) - min-keyint, keyint : Số lượng Frames tối thiểu và tối đa trước đi 1 Key Frame được chèn vào bởi x264.
Ví dụ giá trị min-keyint hay Min GOP Size thường được chọn bằng với giá trị fps. Fps là số lượng Frame có trong 1 giây. Thông thường Fps=24 ==> Ít nhất sau 24 Frames mới có 1 Key Frame được chèn vào. Việc chọn giá trị này sẽ đảm bảo không bao giờ có 2 Key Frames cùng xuất hiện trong vòng 1 giây (việc đó sẽ chỉ làm cho dung lượng bản encode tăng cao mà chất lượng hầu như không khác biệt).
Tương tự, Max GOP Size = X sẽ đảm bảo phải có 1 Key Frame xuất hiện cứ sau X Frame. 1 Video có quá ít Key Frame sẽ dẫn đến việc chất lượng giảm sút, và dễ gây hiện tượng lag khi nhảy đến 1 thời điểm nhất định của video (do điểm đó không có Key Frame, video sẽ phải tìm kiếm Key Frame tiếp theo xuất hiện).
Như đã nói, giá trị Min GOP Size(min-keyint) thường được chọn bằng với giá trị fps. Còn Max GOP Size(keyint) được khuyến cáo bằng 10 lần giá trị fps (đảm bảo rằng nếu hiện tượng lag xuất hiện cũng sẽ chỉ kéo dài trong tối đa 10 giây). Giá trị lớn nhất mà min-keyint có thể nhận là keyint/2+1
Command Line: --keyint m / --min-keyint n (m, n là số lượng max và min)
MeGui: Maximum & Minimum GOP Size.

Scene Cut - scenecut: Cho x264 quyết định mức độ nhạy khi chuyển cảnh. x264 sẽ tính toán giá trị cho mỗi frame để xem độ khác biệt giữa nó với các frame trước. Từ giá trị này, nó sẽ quyết định khi nào video xuất hiện việc chuyển cảnh và do đó sẽ cần phải chèn vào Key Frame. Giá trị này càng lớn, x264 sẽ càng nhạy hơn với các phần chuyển cảnh. Ví dụ 1 video với các camera chuyển động ít sẽ đòi hỏi giá trị này cao hơn.
Command Line: --scenecut n hoặc --no-scenecut
MeGui: Bỏ chọn Adative I-Frames Decision tuơng đuơng --no-scenecut. Number of Extra I-Frames tuơng đương giá trị n trong --scenecut n.

CABAC: Tăng hiện quả trong việc nén video. Khuyến cáo luôn chọn trừ khi video được encode để xem trên các phuơng tiện bị giới hạn khả năng decode (như các phương tiện di động iPod, PSP...)
Command Line: --no-cabac (không sử dụng CABAC)
MeGui: Chọn hoặc bỏ chọn CABAC.

Deblock aka Loop filter : Đây là 1 thông số rất quan trọng trong việc encode để khử những khối vuông - blocks. Blocks sẽ gây ra 1 hiệu ứng gọi là artifact (từ điển gọi là giả tạo, mình cũng chả biết dịch thế nào) - cần phải loại bỏ.

x264 có 2 tham số liên quan đến việc deblock gọi là Deblocking strength(Alpha Deblocking) và Deblocking threshold(Beta Deblocking). Deblock setting thường được viết dưới dạng X:Y, số đầu là Alpha Deblocking và số sau là Beta Deblocking.
Alpha Deblocking quyết định độ mạnh yếu của việc deblock trên toàn bộ hình ảnh, giá trị càng cao tức là việc deblock sẽ càng hiệu quả, nhưng đồng thời cũng phá hủy đi nhiều chi tiết hình ảnh và khiến hình ảnh có cảm giác dịu hay nhòe đi.
Beta Deblocking quyết định độ mạnh yếu của việc phát hiện ra block của x264. Nếu giá trị này càng cao, x264 sẽ xem video càng có nhiều block hơn so với giá trị thấp.
Ví dụ, nếu giá trị Beta Deblocking và Alpha Deblocking đều được đặt quá cao, x264 sẽ phát hiện ra quá nhiều block (mặc dù đôi khi nó không gây ra artifacts) và áp dụng quá nhiều filter vào để khử chúng đi, khiến hình ảnh mất chi tiết.
Cả 2 thông số này đều có thể nhận giá trị từ -6 đến 6. Lời khuyên là đừng bao giờ xuống quá -3 và lên quá 3.
Command Line: --no-deblock hoặc --deblock X:Y
MeGui: Deblocking strength, Deblocking threshold

Trên đây mình đã giới thiệu 1 vài setting x264 thuộc loại Frame-Type. Setting vẫn còn nhiều thông số quan trọng trong các phần như Rate Control, Analysis... nhưng do mình không có nhiều thời gian nên tách ra viết sau vậy. Việc lựa chọn các thông số sao cho phù hợp thì còn phải trải qua quá trình encode lâu dài và thử nghiệm nhiều setting, tùy vào từng phim và tùy bản thân mỗi người encode. Không có setting nào được coi là tối ưu hay tốt nhất.

Các bạn có thể thử theo code sau:

[code]


Tab đầu tiên (Main):
Tunings: Normal nhé.
AVC Profile chọn High nếu là HDMain nếu là SD
AVC Level chọn 4.1 nếu là HD3.1 nếu là SD.
Nếu lười thì cứ để High 4.1 cũng đc
Mode:
2-pass. Bitrate dành cho SD (480p) thì khoảng 800-1000 (thấp hơn 1 chút cũng ko sao, tùy phim). HD thì khoảng 1800-2500 (tùy phim)
Const. Quality: để trong khoảng 18-24. Càng cao sản phẩm càng nhẹ nhưng ko đc để quá 24 (quá 24 sản phẩm xấu lắm :thatvong
Chỉ cần quan tâm 2 cái mode này, các cái khác kệ nó

Tab thứ 2 (Frame-type):
Mục Deblocking:
Strength và Threshold để ở mức -2 : -2 hoặc -3 : -3
Tick vào CABAC (thường là đã đc tick sẵn)
Mục GOP sizeSlicing: Giữ nguyên ko thay đổi
Mục B-frames:
Tick vào Weighted Prediction for B-frame (thường là đc tick sẵn rồi)
Numbers of B-frames: 3 trở lên (recommended 5) (cao hơn thì càng tốt, nhưng encode càng lâu và max là 16)
B-frames Bias: Để nguyên.
Adaptive B-frames: 1-Fast hoặc 2-Optimal (recommended)
B-Pyramid: Normal
Mục Others:
Numbers of Reference Frames: 4-10 (quá 10 cũng như ko mà encode lâu hơn)
Còn lại giữ nguyên

Tab thứ 3 (Rate-Control)
Mục Quantizers, Quantizers Matrice: để nguyên
Mục Adaptive Quantizers
Mode: chọn Auto-Variance AQ
Strength: Tùy theo source, nếu source bị blocky nhiều thì để cao 1 chút (đừng quá 1.5)
Mục Rate Control:
Chỉ cần tick vào Use Mb-tree (thường là tick sẵn)
Các thứ còn lại giữ nguyên

Tab thứ 4 (Analysis) đây là tab quan trọng nhất:
Mục MotionsEstimation
Tick Chrome M.E (thường là tick sẵn)
M.E Range: default là 16, có thể giữ nguyên (nhưng mình toàn để 32 hoặc 64 :daica3
M.E Algorithm: multi hex (recommend)
Subpixel Refinement: từ 7 trở lên (recommended 9).
Mục Extra:
MV Prediction mode: Auto
Trellis: 2-Always
Psy-RD và Psy-strength: ko biết thì đừng đụng vào (mình cũng chả đụng vào vì còn tùy source) (Default là 1.00 và 0.00)
Tick vào No Dct DecimationNo Fast P-Skip
Untick No Mixed Reference framesNo Psychovisual Enhancements
Noise Reduction: để nguyên đi, cái này gần như vô dụng.
Mục Microblocks
Partition chọn là ALL
Mục Blu-Ray: Để nguyên

Tab thứ 5 (Misc):
Tab này đúng như tên gọi của nó, Toàn những thứ linh tinh, hầu hết đều ko cần. Có chăng thì chú ý những thứ sau đây đã tick chưa
Threads: 0 (Auto) Nó sẽ tính với công thức: Số luồng của máy bạn x1.5
Ví du bạn đang dùng CPU Quad-core và ko có công nghệ Hyper-thread của Intel thì nó sẽ nhận là 6 threads
Nhưng nếu bạn dùng Pen 4 có công nghệ Hyper-thread thì nó sẽ nhận là 3 threads
Slow first pass (chỉ có thể tick khi bạn dùng 2-pass)

Command line của những thứ trên:
Code:
--level 4.1 --crf 20 --deblock -3:-3 --open-gop normal --bframes 5 --b-adapt 2 --ref 4 --aq-mode 2 --merange 32 --me umh --direct auto --partitions all --trellis 2 --no-dct-decimate --no-fast-pskip
Command line mình hay sử dụng:
Code:
 --level 4.1 --pass 2 --bitrate XXXX --stats ".stats" --deblock -3:-3 --open-gop normal --bframes 8 --b-adapt 2 --ref 10 --rc-lookahead 60 --aq-mode 2 --merange 64 --me umh --direct auto --subme 9 --partitions all --trellis 2 --no-dct-decimate --no-fast-pskip --output "output" "input"
Đây là những kinh nghiệm của mình khi encode.

Vn-Sharing, i-max.vn
Link: http://www.vn-zoom.com/f386/gioi-thieu-setting-x264-cho-megui-1686569.html