分页: 1 / 2

为什么要索引?

发表于 : 2012-11-04 10:52
techneek
之前压DVD的时候,经常用到索引DVD2AVI,现在已经进化到DGindex了。当时对索引的认识,仅仅是把多个VOB文件连接起来,顺便还能IVTC,或者Demux音轨之类的。
到了BD时代,可能对于M2TS,索引也是必要的。

但是现在有些压制组似乎在压制一些单个文件的片源时,例如普通的TS,甚至是MKV的时候,也会用到索引。我不明白这种单个文件的片源为何需要索引呢?

索引究竟能带来什么好处呢?相比直接调用directshowsource()有什么优势呢?

Re: 为什么要索引?

发表于 : 2012-11-04 11:49
264768502
相比起DSS,那些做索引的frameserver更稳定

Re: 为什么要索引?

发表于 : 2012-11-04 18:46
mawen1250
ts、m2ts内部不包含index,所以如果读取前不做index就完全没法保证准确的解码,也就是必然会RP(例如DSS、DSS2)。但即便是做index,如果demuxer不当也是会RP的,例如eac3to和ffms2默认的haali demuxer就容易出问题,ffms2做index时指定demuxer="lavf"再配合解码时seekmode=-1和threads=1是能够保证progressive源解码的正确性,如果是要重封装为mkv则应该用ffmpeg之类基于lavf的demuxer做而不是eac3to。
而正常的mkv内部是有index所以不需要做index也是能够准确解码的(但方法不当也依然存在RP的可能性)。

Re: 为什么要索引?

发表于 : 2012-11-04 19:42
264768502
=.= 也没那么吓人吧 必然RP什么的...

Re: 为什么要索引?

发表于 : 2012-11-04 20:35
06_taro
這麼說吧,譬如我一個濾鏡要請求文件的第1000幀,我如何知道這個第1000幀的數據在這個文件的什麼位置?

如果格式頭部自帶index,要請求第1000幀,就可以從頭部讀取index,然後找到第1000幀的entry point,直接跳到那個位置,然後解碼取出第1000幀

如果格式沒有自帶index,我該怎麼辦?根據文件總幀數和體積猜測到底在哪兒?甚至有些格式連總幀數都沒有時怎麼辦?從頭開始解碼一直解碼到第1000幀麼?如果這樣的話我突然要非線性請求第100000幀又怎麼辦?

所以需要有一個index的過程,將整個文件分析一遍,之後就知道每一幀在文件中的位置,之後請求幀的時候可以順利進行。和有幾個文件沒有關係,只和格式本身有沒有內建index相關。

理論上像mkv、mp4這種文件是不需要預先index的,直接從頭部就可以讀取entry point,像DSS2讀取mkv或者LSMASHVideoSource讀取mp4那樣。ffms2能力有限不管啥東西都要index一遍是它自己的問題(DGNV讀mkv/mp4也是一樣)。就算是多個文件合併,只要知道每個文件的entry point list,跳到後面的文件只需要將需要的幀號計算出來就行了,同樣不會產生index的需要。

Re: 为什么要索引?

发表于 : 2012-11-16 16:14
techneek
不是吧,预览的时候是有可能出现楼上说的情况,但是压片的时候肯定是从头压到尾的,不存在seek啊,就按顺序一帧一帧的demux出来还能出错吗?

Re: 为什么要索引?

发表于 : 2012-11-16 16:22
msg7086
techneek 写了:压片的时候肯定是从头压到尾的
如果是「真·果压」的话,当然可以不用做索引直接压。

Re: 为什么要索引?

发表于 : 2012-11-16 16:41
techneek
msg7086 写了:
techneek 写了:压片的时候肯定是从头压到尾的
如果是「真·果压」的话,当然可以不用做索引直接压。
什么叫「真·果压」???作为80后的老年人,行话我听不懂啊~ {:cat_3}

Re: 为什么要索引?

发表于 : 2012-11-16 17:42
06_taro
从头到尾不代表一定是线性seek。很多时候滤镜本身会要求一个前后帧序列,但是它不一定内部cache好。更不用提使用了Trim、Splice等NL操作的情况。

即使你是真的从头至尾的线性seek,Haali或者dshow滤镜的工作机制仍然会导致frame accuracy受影响:

像DSS2之类的源滤镜为了可以让非线性seek的滤镜正常工作,自己使用了一个在任何情况下对于请求帧都在当前GOP(如果可以获取的话)内像前后做一次framecount correction的机制,即使你是完全裸压根本不需要它这么做的情况。因为DSS2不知道你后面想怎么做,它始终使用统一的处理方式。问题是这个基于Haali的correction,本身就经常是错误的。Haali RP最简单的一个例子,eac3to parsing文件的时候会报告总共有多少帧,这就是Haali demuxer计算出来的,然后你可以拿它与DGNV做index的结果比较,很多m2ts通过这样比较一下都能发现有几帧的差距,这就是Haali的RP…

DSS的话本身倒没有这种Haali引起的问题,但是不管是DSS还是DSS2,都有另外一个麻烦,就是走dshow滤镜。dshow机制是用来给实时播放设计的。实时播放不需要frame accurate,而更需要的是快速计算/推测出帧可能在的位置以实现快速跳转,所以dshow滤镜对于无index的格式使用这种推测出来的结果可能会相差几帧,对播放来说不算什么问题。但是压制需要frame accurate时这种机制就很不可靠了。和DSS2里Haali一样,滤镜本身不知道你压制的时候是不是完全线性的,所以即使之后是完全线性处理,它们还是使用自己的机制来获取帧,然后得到的结果就有可能会偏差。

Re: 为什么要索引?

发表于 : 2012-11-16 20:15
msg7086
techneek 写了:什么叫「真·果压」???作为80后的老年人,行话我听不懂啊~ {:cat_3}
正如taro巨巨所说,如果你不加任何滤镜(特别是spatial滤镜),直接压的话,一般不需要做indexing直接压没什么问题。

但是有很多滤镜都会向前向后预读一些帧,比如你在处理第1帧的时候,说不定会抓出第2、3帧来做计算,那么对于一些文件就很容易RP。

另外,如果你真的不需要加滤镜的话,连AVS都不用过,直接喂给x264就好了,何必再多此一举走directshowsource呢