『漫游』酷论坛>『影音数码技术学习交流』>[聊天]如何壓製在大動 ..
[聊天]如何壓製在大動作畫面下高品質而檔案控管小的 RMVB(or RM)
weilai@2003-12-15 16:08
因為常有網友這麼想
高速畫面的影音RAW下
做成 rm/rmvb 一定不及 avi 的畫質
那就想到要如何改善呢?
並且保有 rm/rmvb 的優勢設定
首先使用 EHQ 是一定的
再來是bitrate : 500~1900 應該夠了
而 FPS : 30 預設值
這裡
使用HPP9壓制: EHQ_50/450-900_kbps/FPS_30
來源檔: [640*480/742_kbps/120_fps].avi
方法: 將 [FPS]-ptr 改成 30 (速度變慢 4x)
再用 AVS 加快速度 4x,由於 AviSynth 是無損 Frame 所以理論上壓制時不會 dropping frame
如此就達到 120FPS 的HPP9壓制
[待續~] PS.看反應情形 ^^(研究很久)
weilai@2003-12-15 17:59
這裡再提出一個話題
120FPS_avi 姑且不論上面將用到的理論
而被限制在 HPP9 只能接受 60 fps 以下的 avi
欲得到高品質的 rm/rmvb 所以使用最高的 FPS :60
那有兩種 avs 腳本
(A)
[120FPS_avi].ChangeFPS(60)
(B)
[120FPS_avi].SelectEvery(2,0)
結果: (A)行不通 (B)可以
也就是(B)只犧牲一半的 Raw total Frames,效果肯定比 FPS :30 好
PS. 注意 HPP9 只能設定到 30 fps,上面指的 FPS 是指來源檔的 fps
那問題是一般情形下
[120FPS_avi].ChangeFPS(60) == [120FPS_avi].SelectEvery(2,0)
但為何在 HPP9 的使用下 (A) 不被認可呢?
skywalker@2003-12-15 22:14
因为hpp只吃29.97x2=59.94而不是60..............
其实如果RV9能吃120FPS的就什么都解决了........
到时候用dup-drop就可以丢掉相同的帧了.............
rx-79@2003-12-16 02:12
weilai 能帮我们这帮菜鸟写出完整可行的在60fps和120fps下转rmvb的avs脚本吗?以供我们参考(他人语:是想抄吧! 无言以对-_-b)
weilai@2003-12-16 10:19
首先謝謝 skywalker 的解答
對於 rx-79 提出的問題
其中 120fps 正是我想討論的話題,(於一樓已經提出方法只差AVS腳本)
至於 如何 60 + 120 通吃
這點也不是問題只要幾行clip.properties判斷(Framerate)就可以了
在還沒寫出腳本前(其實已試驗出)
想對一樓的方法提問
Q1:先對[源]減速再用 avs 加速進而規避 HPP9 的限制可行嗎?
Q2:AviSynth 號稱是 Frame Server 那就表示可辦到無損 frame 的情形下(當然需Filter Scripting 的認可配合下),
提供給 Encoder 一份完整的 raw frame Source?
Q3:"not changing the frame count" 是否相當於 "not dropping or inserting frames"?
以上如果都是肯定的,就可開始avs腳本的寫作
希望能者可以給個回應
[待續~]
13579nana@2003-12-16 17:59
真的是一点也看不懂啊…………
虽然我也想压制…………
cjmcat@2003-12-16 18:38
给个脚本吧?
tct66@2003-12-16 19:33
weilai,
根據我用ffdshow截圖120fps的avi(361~480幅)
及用avs截圖不更改BRP的設定壓制以下的腳本的avi成rm
AviSource("C:\120fps.avi")
trim(361,480)
ChangeFPS(30)
截出來的都是30幅
所以,壓制以下的腳本,是沒有掉幅的,有興趣你試試看
AviSource("C:\120fps.avi")
ChangeFPS(30)
補充:rm用avs截出第29,30幅是相同的,是因為採樣的原因
若是壓制整個avi,就不會有這個問題
tct66@2003-12-16 22:20
剛剛到avs的網站看SelectEvery的解釋
SelectEvery(clip,2,0)=SelectEven(clip)
也就是截取偶數幅2,4,6,...
SelectEvery(clip,2,1)=SelectOdd(clip)
也就是截取奇數幅1,3,5,...
用以上的濾鏡作為壓制120fps的腳本是會掉幅的
因為120fps的avi是由24fps及30fps以avi60製成120fps後混合的
只選取Even(偶數)或Odd(奇數)幅來壓制,很多非null frames都被捨棄了
所以用xvid解碼去壓制120fps的方法是最好
若是120fps的wmv9,則才需用到avs腳本
ChangeFPS(30)
ps.另外SelectEvery(clip,4,0(,int a,int b,...))也是一樣不好
意思是截取被4除,餘數為0,a,b的幅
tct66@2003-12-16 23:00
再補充一點:
用avi60將24fps製成120fps,根據ffdshow的連續截圖,可知是
NNNNFNNNNF...,1秒共120幅
其中N代表null frame,F為原本的幅
用avi60將30fps製成120fps,根據ffdshow的連續截圖,可知是
NNNFNNNF...,1秒共120幅
其中N代表null frame,F為原本的幅
大家有興趣,自己去做個實際的操作
理論歸理論,實際的操作才是最重要的
skywalker@2003-12-17 03:11
对于非xvid的avi.......
现在只有把24fps和30fps的分离出来.........
全部转成24FPS........
然后再使用matroska的vfr工具来放...........
具体方法这里已经说明了.........
http://forum.doom9.org/showthread.php?s=&threadid=64314
weilai@2003-12-17 14:00
謝謝大家的回復 ^^
回歸正題 如何壓製在大動作畫面下高品質而檔案控管小的 RMVB(or RM)
要求:
首先要提供給 Encoder 一份無損的raw-frame
再來是綿密的連續frame
最後就是 Encoder 的高品質設定
方法:
(1)使用 AviSynth 充當前端 frame-sever,提供可靠的 raw 資料流
(2)使用高框架率(frame/second)這裡用 120fps
(3)使用HPP9之 EHQ / FPS:30 / VBR bitrate
實現:(這裡採用視訊音訊分離作業方式)
V=AVISource("120fps.avi",False,"YUY2")
LoadPlugin("mpasource.dll")
A=MPASOURCE("120fps.mp3")
Audiodub(V,A)
結果:不被 RV9-Encoder 接受
[改1]
V=AVISource("120fps.avi",False,"YUY2").ChangeFPS(59.94)
或
V=AVISource("120fps.avi",False,"YUY2").SelectEvery(2,0)
結果:[FPS]-ptr指標降為 60,RawTotalFrame 被刷掉一半
[改2]
將 120fps.avi 之[FPS]-ptr指標 改成 30 (因為RV9-Encoder只接受59.94以下,為方便運算取30)
V=AVISource("120fps.avi",False,"YUY2")
結果:通過壓製,但壓製成的 rmvb 播放速度只有原 120fps.avi 的 1/4
[改3]
同樣將 120fps.avi 之[FPS]-ptr指標 改成 30
V=AVISource("120fps.avi",False,"YUY2").[加速播放function]
結果:通過壓製且壓製成的 rmvb 播放速度同原 120fps.avi
討論:
有無達到Encoder得到的源是完整的: 是的(沒用到changing the frame count的Scripts)
其過程就像是 用DV拍攝一高速顯示的影像,不同於[改1]用DV拍攝一低速顯示的影像(會因此頓頓或不連續)
那有人會問難道快速播放不會使 Encoder 來不及壓制嗎?
答案是不會
壓制(Encoder)不同於播放(Decoder)
Decoder會因當時播放環境有可能 dropping 掉frame
Encoder是針對MEM([FPS]-ptr)容器重新編碼
其流程如下:
Encoder拍攝 <--- [MEM()]+[FPS]-ptr+改[Speed]-ptr成4 <===不改變frame_count+改[FPS]-ptr成30=== [Rawframe....]+source_FPS(120)
播放器下的換算是:
RealTime = Time(frame長度,單位秒) / [Speed]-ptr = RawTotalFrame / [FPS]-ptr
講了這麼多還是來看實際方法
~~~~~AVS 範本如下~~~~~
V=AVISource("[[30FPS]-ptr之120fps.AVI].avi",False,"YUY2")
V=V.ConvertFPS(7.5,zone=80,vbi=45).AssumeFPS(30)
LoadPlugin("mpasource.dll")
A=MPASOURCE("120fps.mp3")
Audiodub(V,A)
重點就是第二行根據AviSynth所言ConvertFPS及AssumeFPS都是只針對[FPS]-ptr
而不改變RawTotalFrame count所以是無損frame
又透過改120fps.avi的檔頭使HPP9認可120fps.avi進行壓制(將原 120fps.avi+[120FPS]-ptr 改成 120fps.avi+[30FPS]-ptr)
及透過組合ConvertFPS.AssumeFPS達到加速播放
所以要求
後續:
首先是證實AVS範本播放時無dropping frame之情形:很簡單這裡用 MPC 並顯示統計欄方式播放證實沒有掉frame(只是Sync Offset及Jitter會提升)
再來是證實壓制出來的rmvb真的有達到不同於它法的高品質嗎?
當然敢說就是經過證實
做了四種方法的截圖(比較圖是動態畫面下的其中一個frame編號)
證實了理論
PS. 這裡不貼出來了,因為圖是 640x480 又如果用有損壓縮格式會難以比較
所使用的截圖是 .bmp 並針對線條模糊地帶、輪廓及線條完整度等
同120fps.avi之截圖放在一起做"放大"肉眼比對
而在壓制成的 file size 方面幾乎一樣(7秒控制在6K以內)
120fpsRAW_SelectEvery(2,0).rmvb 大於
120fpsRAW_SelectEvery(4,0).rmvb 大於
120fpsRAW_ChangeFPS(30).rmvb 大於
120fpsRAW_ChangeFPS(59.94).rmvb 等於
120fpsRAW_[30FPS]-ptr_4x快進播放.rmvb
最後就是如何 120fps.avi+[120FPS]-ptr 改成 120fps.avi+[30FPS]-ptr
很簡單使用AVI Frame Rate Changer 這個小工具(類似 AVI FourCC Code Changer 不用一秒就 OK)
最後要講的就是要這麼做的話最好是備份120fps.avi再做
因為發現AVI Frame Rate Changer只可變小不可放大(也就是可 120fps->30fps 不可 30fps->120fps)
如果你120fps.avi還不想這麼早delete的話
END
tct66@2003-12-17 14:42
不要用到Converttoyuy2()
這是有損的
用VDM看以下腳本,除了原來是24fps的畫面
每一幅都會變換,證明是沒有掉幅的
AviSource("120fps.avi")
ChangeFps(30)
weilai@2003-12-17 15:37
[補充]
用DV拍攝一高速顯示的影像
這裡形容的不是很完美
修正補充一下
用DV拍攝一高速顯像電影
(膠捲捲動的速度比一般電影還快且解析度高,當然上面的方法無法達到提高解析度)
其實這個 avs 範本最好是用在真正的 120 FPS 視訊下
當然據實驗得到的結論(用的是夾雜NULL frame)
非正真 120fps.avi 也有一定效果(壓制 avi 也行)
原因就在
前後兩 raw 差異(變動量)越小
運算出的 decoder-frame 就不會越模糊
(效果有點雷同前面提到的 高速顯像電影,眼睛就好比decoder)
引用
最初由 tct66 发布
不要用到Converttoyuy2()
這是有損的
用VDM看以下腳本,除了原來是24fps的畫面
每一幅都會變換,證明是沒有掉幅的
AviSource("120fps.avi")
ChangeFps(30)
謝謝提醒
那是否 AVISource("120fps.avi",False,"YUY2")
該換成 AVISource("120fps.avi",False,"RGB32") 會比較好?
Q: 試了一下 ConvertFPS 要求要使用 YUY2 所以維持原 Scripts
其實這一篇主要是 理論加實驗 並 比較結果 來支持自己發表的
特別是指在 rmvb encoder 上
tct66@2003-12-17 18:11
weilai很喜歡研究
我幫你把這篇頂上去
«12»共2页
| TOP