[求助]在播放某些AVI的时候有点问题
总是有这样的一个信息= =+回复:
如果你是正常的FTP下载的话可能是解码器的问题,装个新的FFDSHOW如果你这个文件是BT下载的,不排除是文件没完全下载完,文件出错的可能性
回复:
很正常~~记得是早期的压制码的关系~~~往往都是视频开始的第1贞~~不影响播放~~回复:
怎样压制才能避免这个情况= =回复:
packed bitstream 是 DivX 设计的,因为他们发现在 AVI 里面放 B-frame,会造成严重的影音不同步的问题,为了要解决这个问题,所以他们设计了 packed bitstream。AVI当初设计的时候并没有考虑会有 B-frame ,它的sequence order是循序的,也就是
1 2 3 4 5 6 7 8
I B P B P B P B ....
然而播放的时候,读入 2B 并不能立刻解码播放,要等下一个 3P 被读进来解码完毕以后,才能解码 2B,因为 B-Frame是双向参考的,2B需要参考它后面的 3P,在 3P 还没有解码完之前,我们也就无法解码 2B。
因此就会造成一个解码的 lag,解码的延迟,所以解码会变成这样
代码:------------------------------------------------------------------------
1 2 3 4 5 6 7 8
I B P B P B P B ....<-- 输入
I B P B P B P B ....<-- 输出
-----------------------------------------------------------------------------
往后 delay 一个 frame,在 3 的时间点,读入 3P,于是便可以输出 2B。
所以用 VFW Codec(xvidvfw.dll) 去解码这种 AVI,第一个画面会显示英文「警告,无法输出画面,因为 B-frame解码延迟」。
用 DirectShow Filter(xvid.ax) 播放时,XviD 的 DShow 有设计过,不会输出这个画面,所以我们看不到,而 VFW Codec 因为 VFW 限制的关系,一定会输出这个画面。但是不管有没有这个画面,都会延迟一个 frame,所以会造成影音不同步,由于只有差距一个 B-frame,所以不注意听的话可能不会察觉,但是仔细听的话就会发现。
DivX 的设计者为了解决这个问题,提出了packed bitstream,把 B-frame 和它要参考的 P-frame 包在一起,变成下面这个样子
--------------------------------------------------------------------------------
13 2 5 4 7 6
I ....
--------------------------------------------------------------------------------
是 null,空的 frame。
解码器遇到 packed bitstream,就知道 P 跟 B 是包在一起的,中间有一个特殊设计的 | 会区分开来,B-frame 可以实时解出来,而后面的 则显示先前解出来的 P-frame。
这样就破解了 AVI 之中无法处理 B-frame 的限制。
也许有人会想,就算不用 packed bitstream,我把声音也跟着往后 delay,不就可以解决了吗。确实,这样就不会有影音不同步的问题,但是还是有许多兼容性的问题,在不同 player 上,会发生各种奇怪的现象,例如画面显示的顺序错乱等等。
而且 XviD 的 B-frame 不只一个,它可以
I B B P B B ....
甚至还可以
I B P B B P B P P B B B ....
lag 更乱。
所以,出现这个画面的原因就是压制者在使用B-Frame的情况下没有开启packed bitstream,导致解码延时。
有兴趣的人可以看看Doom9的这个帖子
页:
[1]