『漫游』酷论坛>『影音数码技术学习交流』>[求助]写AVS压RMVB产生 ..

ralphgu@2004-12-25 17:01

引用
最初由 wolfsoft 发布
changefps是自动添加或删除null帧,但能否处理干净未知

selectevery只是单纯地提取帧,整齐划一地对帧率进行缩小.


:eek: 但是120的祯率分布有那么均匀么……万一都是NULL怎么办……
用SELECTEVERY的话……
引用

ralphgu@2004-12-25 17:04

引用
最初由 wolfsoft 发布
接口错误?是不是没装相应的编码解码器啊.光是ffdshow未必管用.
突然想起还有一种可能...也许那根本就不是AVI格式的(只有我这么不厚道的人才能想到啊,嘿嘿)

字幕用写字板打不开就用记事本试试,实在不行还有UE一类的万能编辑器.


:confused: 我以前下了个GIG的DVDRIP的SP14集…… AVICODEC,GSPOT都不能看编码……

最近又下了个头文字D第一季的21集……rmvb……结果同上……:mad: 超级郁闷一记
引用

wolfsoft@2004-12-25 18:52

引用
最初由 ralphgu 发布


:eek: 但是120的祯率分布有那么均匀么……万一都是NULL怎么办……
用SELECTEVERY的话……


当然没那么均匀的,否则做120纯属RP有问题给人找麻烦(日本职人里确实有这样的).

也不可能都是null,一般来说都是1空4或1空3,分别对应24和30,个别情况会1空1,对应60.,不管怎么说吧,如果是selectevery(5,0),就会在30的地方每4帧少取1实际帧;而如果用selectevery(4,0),就会在24的地方每4帧多取1null帧.如果变化的部分比较少,那么由此产生的顿滞就几乎看不出来(很少有人能看出来吧,除非你一帧一帧地走).另一方面,由于动画本身是24帧的,30只存在于激烈动作(这样的部分即使在MPEG2流里也是帧帧有变化)或者CG,是少数派,所以推荐使用selectevery(5,0),否则把大部分24做成30就是毫无意义.
引用

tct66@2004-12-25 18:56

不需要用TmpgEnc+VFAPI,WMV/RMVB如果要用avs才需要
如果是VBR/ABR MP3的avi,試試

AviSource("wmv9-120fps.avi").ensurevbrmp3sync
changefps(23.976)

其實不加ensurevbrmp3sync,應該也是可以

selectevery(5,0)這個指令,如果一開使op是120fps的30P
那麼一定掉禎得比changefps(23.976)還嚴重
而且120FPS的24P畫面也可能出現掉禎的情形
所以最簡單的是使用changefps(23.976)

最完美的處理方法是用sswroom的aviread分析那裡是24P/30P/60P
再分段處裡
次等的處理方法是重製成VFR的mkv再壓制成rmvb
VDM+avs[changefps(29.970)]+decombvfr->avi->
mkvmerge(timecodes)->VFR MKV
引用

wolfsoft@2004-12-26 00:12

人家一开头就说了changefps会异步,怎么还在这推荐changefps啊

用selectevery也会让120中的24掉?怎么个掉法?请指教
而且我说了现在的动画,30的只占全篇很少一部分,就算是30的OP又如何?那么多30的OP的DVD被人弄成24的DVDRIP,大家不照样看的不亦乐乎?

这只是网友自己压RM玩啊大哥,有必要弄那么麻烦吗?又不是开到1000k以上做DVDRIP.你绕那一大圈我看跟用TMPG也差不多啊
引用

unranger@2004-12-26 01:09

感觉SelectEvery(5, 0)可以的话ChangeFPS(23.976)没理由不行的...

楼主来说一下用AviSource("***").EnsureVBRMP3Sync().ChangeFPS(23.976)到底行不行a...
引用

adamhj@2004-12-27 11:16

楼上正解,用EnsureVBRMP3Sync()才是正道。

小狼啊,我记得我和你说过changefps和selectevery几乎是一样的吧,不信你去试试吧,现视研04,用changefps出来的不同步,用selectevery出来的照样不同步。

对avs而言就没有什么null帧的概念,avs只是个frameserver,它只是对每帧的数据(图象)进行变换,但对于帧的类型根本不管,因为帧的类型是对编码而言的。changefps其实就是按比例取帧,只不过这个比例不一定是整数而已,因为用了浮点运算可能会有0~1帧的偏差,但不足以造音视不同步。
引用

wxl_man@2004-12-27 16:12

引用
最初由 yellowsaint 发布

另外,用MKVEGUI提取某些MKV的字幕,怎么会发生成功提取出来的字幕用写字板打不开?是不是因为MKV本身有问题?


用mkvgui取字幕会不会取不完整??
我在取c2得星界时就遇到取出得字幕压出得rmvb里有些地方没有字幕但是原来mkv里却一点不少,是不是要自己补上??
引用

weilai@2004-12-27 17:17

對於 changefps 的 去Null frame 之說
左看右看 AVS源碼
的確看不怎麼出來有"智慧型"除Null frame的模樣
不過其實不能就此定論changefps沒有去Null frame的作用
並且因為源碼有無最佳化也是個問題(有最佳化的話就不易看不出來的說)
P.S.此時只有實做及用工具來證實才可定调

不過就NULL Frame處理原則其 FRAME_SIZE = 0
AVS: GetFrame 式子為 int((n * a + (b>>1)) / b) = int((vi.num_frames * b + (a >> 1)) / a)

P.S. n 代表 #.n frame,a、b 代表 changefps 的 FPS參數,一個是分子一個是分母,通常大家寫的 .avs 只有一個參數,但透過SetFPS AVS sever 會自動修正其值
所以 如果 #.2 frame 是Null 的話
GetFrame 所取的 frame數據就不會是 #.2 frame (也就是去Null frame)
但如果是一個連續 Null 的情況就不是這樣了...

作者用小小的式子就達到去Null 的作用,是看穿了 Null frame 不大會有連續相連的情況(其實就算是連續相連以NULL常發生的情況而言還是有達到去 Null frame 的作用)
引用

unranger@2004-12-27 17:24

引用

用mkvgui取字幕会不会取不完整??

我在取c2得星界时就遇到取出得字幕压出得rmvb里有些地方没有字幕但是原来mkv里却一点不少,是不是要自己补上??


不会
丢失字符是因为demux字幕时用的字符集不对...星界好像应该用UTF-8吧..用GB2312的话遇到非简体中文字符时就会出问题
引用

蓝色橘右京@2004-12-27 19:14

changefps和selectevery还是有区别的,帧率会不一样,可以去试试,反正整个用changefps和selectevery都不会正确,但如果是分段用selectevery就比changefps要正确!
引用

adamhj@2004-12-27 19:58

引用
最初由 weilai 发布
對於 changefps 的 去Null frame 之說
左看右看 AVS源碼
的確看不怎麼出來有"智慧型"除Null frame的模樣
不過其實不能就此定論changefps沒有去Null frame的作用
並且因為源碼有無最佳化也是個問題(有最佳化的話就不易看不出來的說)
P.S.此時只有實做及用工具來證實才可定调

不過就NULL Frame處理原則其 FRAME_SIZE = 0
AVS: GetFrame 式子為 int((n * a + (b>>1)) / b) = int((vi.num_frames * b + (a >> 1)) / a)

P.S. n 代表 #.n frame,a、b 代表 changefps 的 FPS參數,一個是分子一個是分母,通常大家寫的 .avs 只有一個參數,但透過SetFPS AVS sever 會自動修正其值
所以 如果 #.2 frame 是Null 的話
GetFrame 所取的 frame數據就不會是 #.2 frame (也就是去Null frame)

但如果是一個連續 Null 的情況就不是這樣了...

作者用小小的式子就達到去Null 的作用,是看穿了 Null frame 不大會有連續相連的情況(其實就算是連續相連以NULL常發生的情況而言還是有達到去 Null frame 的作用)


我没看懂,不知道weilai为什么会认为null frame会被去掉
引用

adamhj@2004-12-27 20:07

引用
最初由 蓝色橘右京 发布
changefps和selectevery还是有区别的,帧率会不一样,可以去试试,反正整个用changefps和selectevery都不会正确,但如果是分段用selectevery就比changefps要正确!


只要参数没设错最后的帧率肯定是一样的,只是可能总帧数可能会有几帧的差别(而且我们平常遇到的情况应该不会超过1帧)
引用

weilai@2004-12-27 22:22

GetFrame 是得到 frame 資料的涵式
int((n * a + (b>>1)) / b) 是告知要得到 frame 編號的式子
a、b 是新的 FPS 參數
n 是frame 編號計數器(範圍限制在 args[1].AsFloat() 到 16777216)
P.S. 而其實內部還有一些運算轉換,所以確實的式子原理在此不多做詳解

就 MSDN 資料庫文
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/csalpha98/html/3.1_procedure_types.asp
可知 NULL Frame 是做不出frame 還原資料的(FRAME_SIZE = 0、ENTRY_LENGTH = 0)

所以(假設) [1][2][3][N][5] 還原就變成
[1 Frame][2 Frame][3 Frame][][5 Frame] 相當於 [1 Frame][2 Frame][3 Frame][5 Frame]
P.S. [] 實際上是沒有的"東西",因為根本沒有資料可運算出來"東西"
而就排列而言
還原後的編號4(#.4)frame 的內容是 [5 Frame]
如此不就是去Null frame

不過以上只是個人想法,因為對影視架構也不是全盤知悉
所以以上言論不敢100%下定論
引用

adamhj@2004-12-27 23:05

weilai你可以去看看avisource的源码,当读到null frame的时候会返回这个frame之前最近的一个可读帧,directshowsource的源码我没看,但我估计也是一样的,对avs来说,source一读进来以后就无所谓是否是null frame了,所以之后的处理都会作为普通帧(其实就是和前一帧重复的帧)来处理,而不会丢弃掉。
引用

«1234»共4页

| TOP