Giới thiệu

Các bài viết sẽ nhằm vào bất cứ đề tài gì mà tôi có hứng thú muốn đề cập, không theo một chủ đề nhất định. Nguyên tắc viết không theo khuôn khổ và tự do thoải mái nhất có thể, nội dung bài viết cũng sẽ thay đổi liên tục theo thời gian nên sẽ rất khó theo dõi. Bên cạnh đó, độ dài của các bài viết rất bất định, nhiều khi dài lê thê và tràn lan.

Các quy tắc chung (Đọc kỹ trước khi quyết định đọc nội dung bài viết):
Điều 1. Nội dung bài viết có thể dựa hoàn toàn vào quan điểm cá nhân, do đó sẽ khác với quan điểm của bạn. Bạn luôn có quyền ngừng đọc hoặc không cần đọc. Tuy nhiên, một khi đã đọc, bạn không được phép tranh cãi với tác giả. (Bạn được quyền nói xấu tác giả, nếu thích). Tác giả không chịu bất cứ trách nhiệm nào nếu nội dung bài viết gây ảnh hưởng xấu đến sức khỏe hay tâm lý của bạn.
Điều 2. Nội dung bài viết có thể chứa rất nhiều "spoiler" nên khuyên bạn không nên đọc trước khi xem/chơi tựa phim/anime/video game... được nhắc đến trong bài viết. Tác giả không chịu trách nhiệm vì làm bạn mất hứng. Bên cạnh đó, vì sở thích mỗi người mỗi khác, những chi tiết mà tác giả chê khen có thể không giống cách đánh giá của bạn, nên đừng dùng nó làm cơ sở lựa chọn. Ngoài ra, xem lại điều 1.
Điều 3. Bài viết chỉ được phép tồn tại trên blog này. Bạn không được quyền sao chép toàn bộ hay một phần nội dung của bất cứ bài viết nào sang nơi khác (bạn được phép đăng link của bài viết đi nơi khác, nếu muốn). Tác giả phủ nhận hoàn toàn trách nhiệm liên quan đến nội dung bài viết nếu nó được phát tán nơi khác dưới hình thức không phải link, tuy nhiên vẫn giữ quyền đối với nó.

2011-10-15

Tránh sử dụng DirectShowSource khi không cần thiết

Tôi thấy rằng nhiều người, đặc biệt là người mới làm quen hoặc người thiếu kinh nghiệm trong lĩnh vực video encoding thường sử dụng DirectShowSource (DSS). Một phần vì nghĩ rằng nó "tiện", một phần khác cũng không thể trách là do có nhiều guide, tutorial toàn sử dụng nó. Trong khi đó hiện nay, nó chỉ nên là lựa chọn cuối cùng và ngay cả thế, người sử dụng nó nên có đủ kinh nghiệm để phần nào làm chủ được những rắc rối mà nó có thể mang đến.

Đối với source filter khác như FFMS, DGMPGDec, DGDecNV... đều cần phải qua thao tác tạo lại index cho source, riêng DSS (nói đúng hơn là DirectShow splitter/decoder mà DSS sử dụng) sẽ đọc trực tiếp index lưu trong tập tin media vì thế nó thường không frame accurate (phụ thuộc vào DS splitter và decoder; một vài trường hợp ngoại lệ là các DS filter của DV, MJPEG... lại frame accurate). Nếu dùng nhiều thao tác cắt nối hoặc các thao tác cấp độ frame như FreezeFrame, DeleteFrame, DuplicateFrame, ApplyRange và các function tương tự... trong Avisynth script thì nhiều khả năng kết quả sẽ lệch so với ý định. Ngoài ra, việc frame rate bị thay đổi cho dù source là CFR hoặc mất đi/dôi thêm vài frame cũng là chuyện thường gặp.

Nguyên tắc hoạt động của DSS là sử dụng các DirectShow filter trên máy phục vụ cho việc demux và decode. DirectShowSource sẽ dựa trên merit của các DS filter trên máy và chọn ra splitter và decoder nào có độ ưu tiên cao nhất để sử dụng, và trong nhiều trường hợp đó không phải là những filter bạn muốn dùng (chẳng hạn bạn cài đặt Nokia/Ovi Suite, nó sẽ đặt merit của splitter và decoder của nó lên rất cao, hay Windows 7 mặc định sử dụng MS DTV-DVD Video Decoder trừ khi bạn thiết lập lại). Nhiều khi do đụng độ/xung đột giữa các filter này (filter-chain không được cấu hình đúng cách, decoder không ưa splitter hoặc stream mà splitter truyền cho decoder có thành phần kích hoạt bug của decoder chẳng hạn) dẫn đến crash hoặc lỗi không render được khi mở một script dùng DSS (hoặc đôi khi crash giữa chừng). DirectShow được thiết kế dành cho playback nên có một số "tính năng" không phù hợp làm source filter. Tiếp theo, phần lớn decoder mặc định cho phép drop frame khi cần thiết và nếu không thiết lập lại, sẽ dẫn đến những kết quả không mong muốn như đã nêu bên trên.

Một số decoder như ffdshow có kèm theo các post-proccesor. Các post-processor này phù hợp khi phát, nhưng không hiệu quả như các filter hay plugin dành cho Avisynth, chẳng hạn deband không có mask nên thêm rất nhiều noise thừa thải... Người encode có thể vô tình hoặc cố ý bật những post-proccessor này (để cải thiện chất lượng khi phát, chẳng hạn) và dẫn đến chúng được áp dụng lên video dù họ không có ý định đó.

Để giải quyết các vấn đề trên, có thể dùng GraphStudio(Next) để chọn lựa filter-chain và các settings phù hợp rồi lưu lại thành file .grf và mở nó bằng DSS. Tuy nhiên, điều này vẫn không giải quyết triệt để vấn đề, như frame accurate, frame rate không chính xác (có thể dùng AssumeFPS để sửa nếu source là CFR; hoặc remux timecodes sau khi encode đối với VFR, tuy nhiên vì DSS có thể drop/dup frame dẫn đến timecodes bị sai), lệch field nếu source là interlaced... Điều quan trọng là trong đa số trường hợp nó gây tốn công nhiều hơn là sử dụng source filter phù hợp khác, và trừ những trường hợp buộc phải dùng (do không còn lựa chọn), nó chẳng thể hiện ưu thế gì nổi bật.

Vì vậy, DirectShowSource chỉ nên dùng khi không thể tránh và đối với những ai có kinh nghiệm, hoặc nếu bạn biết mình đang làm gì. Còn số đông người dùng, hãy sử dụng Source Filter khác khi có thể (và không phải là DSS2, nó chẳng khác DSS cho mấy ngoại trừ việc không hỗ trợ graph và được cho rằng frame accurate nhưng trên thực tế thì không, mặc dù vẫn chính xác hơn DSS).

(Đọc bài viết sau để biết cách xử lý nguồn RAW VFR với FFMS2).

Tuy nhiên, quyết định có sử dụng hay không nằm ở người encode, tôi chỉ nêu ra những nhược điểm để người đọc làm căn cứ chọn lựa, bản thân tôi không thể bắt ép ai thực hiện theo được. Thậm chí những nhược điểm nêu trên có thể không quan trọng với nhiều người, trừ những quality freak như tôi thôi.

(Một ví dụ về trường hợp bất khả kháng: Source container là MPEG-TS nhưng không có điều kiện sử dụng DGDecNV. Nếu video format là MPEG-2, DGMPGDec có thể xử lý tốt trong đa số trường hợp. Nếu video format là progressive H.264 thì có thể remux sang MKV và dùng với FFMS2 [có thể cần thêm vài thủ thuật; đôi khi interlaced H.264 cũng có thể dùng cách này]; trường hợp source là từ Blu-ray thì dùng LWLibavVideoSource. Các trường hợp khác [interlaced H.264 hoặc bất cứ dạng VC-1 nào] thì thử bằng LWLibavVideoSource trước, nếu không được chỉ còn cách dùng DSS [khuyến khích sử dụng LAV Splitter + LAV Video]).

(Ghi chú cho bản thân: Có thể xem xét sửa đổi câu chữ cho dễ hiểu và mang tính thuyết phục hơn, bổ sung dẫn chứng nếu có thể).