瀏覽單個文章
Shade
Senior Member
 
Shade的大頭照
 

加入日期: Oct 2002
您的住址: El's room
文章: 1,046
我是小輩

測 MPEG 可以用 BitRate Viewer 這個軟體看 Q.level,也就是 Quantizer,數字越大,品質越差。不過這也只能當作參考,不見得 Q.level 越大,看起來就一定會比較差。例如說 B-Frame,一般 B-Frame 都會乘上一個倍數 ratio,提高 Quantizer 壓縮,以提高壓縮率。因為 B-Frame 不能再被其他 Frame 拿來當作參考畫面,所以 B-Frame 提高 Quantizer 壓縮造成的誤差不會影響、傳遞給下一個 Frame。而 B-Frame 提高壓縮所省下來的流量,就可以分配給它要參考的 I, P Frame,這樣參考的 I, P Frame Quantizer 低,畫質很好,沒有壓縮瑕疵,所以 B-Frame 參考它們壓縮,雖然 Quantizer 很高,(和原本畫面的)誤差很大,但是這個誤差不會造成明顯的壓縮瑕疵,我們人眼比較不會注意到 B-Frame 的劣化。(注意看的話還是可以看出來,會發現畫面有週期性的騷動感,但是看不出有明顯壓縮瑕疵)
所以有使用 B-Frame 的檔案平均 Quantizer 會提高,但是視覺品質卻會提升。
(另外 B-Frame 使用的雙向預測等於具有時間軸上內插的效果,所以也具有抵抗雜訊,柔化的作用)
另一個 Quantizer 的大小會和品質不一樣的情況,是因為 Encoder 有使用 Adaptive Quant(自適應性量化)。Quantizer 的大小可以以 Macroblock 為單位改變,畫面上每個 16x16 的區塊可以使用不同的量化倍數。每個 MB 改變這個 Quant 需要多幾個額外的 bit 紀錄,連續幾個 MB 都用同一個 Qunat 只需第一個 MB 記錄即可,用得好的話可以提高壓縮效率。例如畫面上極黑和極白的地方,人眼的分辨力會降低,看不出好壞,所以可以提高 Quantizer 壓縮,這個叫 Lumi masking 和 Darkness masking。或者是畫面上在很小的空間內有非常複雜的花紋樣式,例如纖細一絲一絲的頭髮,茂盛的草地等等,我們人眼也無法解析這麼複雜的細節資訊,所以可以提高 Quantizer,也就是根據材質的複雜程度(Texture complexity)來改變 Quantizer,叫做 Spatial complexity masking。或者是連續的畫面之間動態非常大,人眼對高動態的物體無法分辨其細節,所以可以提高 Quantizer,也就是根據 Motion Vector 動作向量的複雜程度來改變 Quantizer,叫做 Temporary complexity masking。
MPEG-4 的規格比較死,MB 和 MB 之間的 Quant 相差不可以差過 3(同 H.263),所以這方面的彈性不如 MPEG-2 來得大。
有使用 Adaptive Quant 的 Encoder,畫面的 Quantizer 不是固定的,而是每一個 MB 都可能不一樣,人眼比較容易注意到的地方壓好一點,不容易注意的地方壓差一點,最後整張畫面的平均 Quantizer 可能比原來高,但是視覺品質卻比原來好。這也是一個 Quantizer 和畫面品質不成反比的例子。
但是一般的情況下,固定品質 CQ 壓縮,壓出來的 Quantizer 越小,通常代表品質比較好。

想測 PSNR 的話,一樣可以用 Avisynth,如
orig=avisource("source_vfapi.avi").ConvertToYUY2()
LoadPlugin("MPEG2Dec3.dll")
encoded=MPEG2Source("target.d2v").YV12toYUY2(interlaced=false)
compare(encoded, orig, "Y", "PSNR.LOG", false)

目前 Avisynth 只支援 YUY2 的 MPEG2Source compare,所以第一行原始 VFAPI 要轉成 YUY2,第三行 MPEG2Dec3 轉出來的 YV12 要 upsampling 到 YUY2(YU12toYUY2),後面括弧中的 interlace=false 是指訊源是 progressive 的,用 progressive frame 的 chroma upsampling。(因為 progressive frame 和 interlaced frame 的 chroma upsampling 方法不一樣。詳細原理小弟以前曾經提過,此處便不再贅述)

因為經過 upsampling 手續,最好只比較 Y channel 的 PSNR,不要比較 UV(chroma,色彩資訊)的 PSNR。通常來說,如果沒有意外的話,Encoder 沒有做錯,則 UV 的 PSNR 通常都會比 Y 高,而且高很多。一般的 MPEG Encoder 不會做 Chroma 平面上的動作檢索,Chroma 的 MV 動作向量是直接拿 Lumi(Y) 的 MV 除以二來使用的,所以我們直接拿 Y 的 PSNR 來比較即可。而且 UV 的影響力比 Y 弱很多,UV 的好壞通常不容易看出來,除非相差非常多,而大部分 Encoder 壓出來 UV 的 PSNR 都差不多,所以我們可以只用 Y 的 PSNR 作為品質好壞的指標。
學界測試的時候,一般也只列 Y 的 PSNR。
舊 2003-02-07, 06:40 PM #4
回應時引用此文章
Shade離線中