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

加入日期: Oct 2002
您的住址: El's room
文章: 1,046
引用:
作者snic
咦!
那 XVID 的 B-frame 不也一樣不符合 MPEG-4 制訂的標準資料流嗎?

呃,這個要說明會有些複雜... ^^;
先從 DivX 開始說起好了....

我們知道 B-frame 必須參考他後面的 Frame 解碼,所以
0 1 2
I B P

當 Decoder 讀進 1B 的資料的時候,他還不能解碼這個 1B,因為 1B 會需要參考他後面的 2P 才能解碼,所以這個時候 Decoder 無法輸出畫面,必須等下一個 2P Frame 讀進來以後,才能完整的解碼輸出 1B。
這樣就會造成一個 Frame 的解碼輸出延遲,我們稱為 B-frame 的解碼 lag。

以上就是在 AVI 檔案中存放 B-frame 的情況,由於當初 AVI 規格制訂的時候,完全沒有考慮到將來會在 AVI 裡面會放這種雙向參考的 Frame 型態,所造成了這個限制。

而我們一般使用的 MPG 格式則沒有這個問題,它的資料流的存放順序是
0 2 1
I P B

所以沒有 AVI 面臨的頭痛的問題。

當初 DivX 要在 AVI 裡面放 B-frame 的時候,他們想出了一個方法,讓放在 AVI 裡面的 B-frame 不會有 lag,這個方法就叫做 "Packed Bitstream",打包好的 Bitstream。
他將 B-frame 以下面的方式儲存
0 21 x
I[PB] N

將 1B 和他要參考的 2P 打包在一起,中間用一個特殊的標記分隔這兩個黏在一起的 Frame,後面原本 2P 所在位置的 Frame 則補上一張 Null Frame,空的 Frame,Decoder 讀到這一張空的 Frame 會自動輸出應該在這個位置的 2P 畫面,利用這個 "hack" 的修改儲存方式,達到沒有 lag 的播放。

這個就是 Packed Bitstream。
DivX 之前只會使用一個 B-frame,而 XviD 則是很早就支援多個 B-frame,這個 lag 的問題更大,所以 XviD 也沿用了 DivX 的這個 Packed Bitstream 的設計,並且把它擴充,增加多個 B-frame 的 Packed 模式。
不過如前所述,這種特殊的 [PB] Frame 包在一起的形式,不是標準的 MPEG-4 資料流,所以要把 Packed 的 MPEG-4 AVI 轉成 .mp4 來裝載的時候,轉換軟體讀到 Packed Bitstream 會認為這是不合法的 Bitstream 而中斷輸出。

解決的方法:
1. XviD 不要勾選 Packed Bitstream。不過如果你有用 B-frame,載體又是 AVI,還是勾選 Packed Bitstream 比較好
2. AVI -> .mp4 的軟體要聰明一點,設計自動偵測、對應 Packed 的 AVI 的轉換模式
3. 用其他軟體來對 AVI 做 Un-Packed 的動作,目前已經有這種軟體,可以將 AVI 去除打包

最後再回到 DivX,DivX 5.2 版開始支援多個 B-frame,不過它的多個 B-frame 卻不使用 Packed Bitstream,而是用 AVI 原本的儲存方式,這樣就會造成 lag。不知道為什麼 DivX 故意不沿用 XviD 設計的擴充方法,這個問題也有人問,官方的回答好像是因為 DivX 有許多硬體播放機,這些播放機除非更新韌體否則無法支援多個 B-frame 的 Packed 模式,為了要達到最大的回溯相容性,所以 DivX 壓多個 B-frame 的時候將不會使用 Packed Bitstream。

關於硬體播放機,我沒有仔細研究過,據說有一些播放機播放 XviD 的多個 B-frame + Packed Bitstrem 會頓,所以如果要在這些機器上播放,必須取消 Packed Bitstream。
另外就是之前 ffdshow 播放 XviD + Packed Bitstream 的時候也有問題,也會頓,所以那時有人就鼓吹不要使用 Packed Bitstream,說不知道 PB 有什麼益處,又會增加麻煩,PB 真是 evil
這就是因為不知道 PB 的來龍去脈,不知道會什麼要有 PB 這個設計,所以產生了錯誤的見解。

sysKin 那時就有跑出來替 PB 說話,說他覺得 PB 很好呀,沒什麼問題,他自己壓 AVI + B-frame 是一定會用 PB,不然影音不同步的問題更大。
如果要在硬體播放機上面播,轉成 .mp4,或者利用其他小程式 Un-Packed 處理一下就解決了。
至於 ffdshow,後來就修正,支援 XviD 的多 B-frame Packed 模式了。

本來 PB 是一個用意很好的設計,但是因為沒有人解說背後的原理,再加上當時週邊軟、硬體播放機的不支援,造成一些人對 PB 敬而遠之。

現在的話,由於有 MPEG4Modifier 這個小工具可以很方便的修改 Aspect Ratio 資訊,和 Pack/Un-Pack AVI,所以可以很輕易的隨時轉來轉去,因此我建議如果要將 B-frame 存放到 AVI 裡面,最好是使用 Packed Bitstream,對方如果有需要,再自行 Un-Pack 即可。

當然,如果輸出的檔案格式是 mkv,那麼就不需要使用 PB,有時候會看到有人用 mkv 還使用 PB,真是....

以上
舊 2004-08-14, 08:41 AM #10
回應時引用此文章
Shade離線中