Mar 06

MP_Pipeline 0.14 – 多进程并行运行avs脚本 [2012-05-24]

(之前一直没有在Blog上发布,补发一下。。。

功能如题(拖),主要是用来解决部分EP滤镜组合使用时爆内存的情况。具体用法请参考压缩包内的示例脚本。

更新日志:

0.14
* 修复另一个导致偶然崩溃的bug

0.13
* 修复某bug导致的偶发崩溃

0.12
* 修复在某些情况下无法启动的错误

0.11
* 大大改善性能,某些情况下开销可下降80%
* 可锁定子进程内的工作线程到单一核心

0.9
* 新功能:帧预读
* 新功能:同时输出多个clip变量
* 新功能:可在多个进程间共享部分代码

0.3
* 修正x86文件夹内的子程序版本
* 内置TCPDeliver,不再依赖外部滤镜
* 修正退出时的随机崩溃
* 分块Branch

0.2
* 新增x64支持(请将压缩包内各平台的TCPDeliver.dll复制到对应的插件目录内)
* 可混合使用x86/x64子进程,详情请参考示例脚本(需要同时安装x86/x64的AviSynth)
* BRANCH进程新增一个变量,使脚本内可以区分不同的进程

源代码 下载

使用实例:

1. 基础用法

MP_Pipeline("""
FFVideoSource("SomeVideo")
QTGMC()
### prefetch: 16, 0
### ###
""")
MCTD()

# MCTD及QTGMC会在两个不同的进程内并行运行

2. 以大量内存为代价提速MCTD

# 要运行这个脚本,系统必须为64位并且至少有8GB内存
MP_Pipeline("""

# 此处数值可能有下降余地,不过我只测试过这个数
SetMemoryMax(3072)

FFVideoSource("SomeVideo")
MCTD(settings="high")
### prefetch: 16, 0
### ###
""")

# 之前用类似的脚本编码时比单纯MCTD有20%~30%速度提升

3. 分支

MP_Pipeline("""
FFVideoSource("SomeVideo")
TNLMeans()
### prefetch: 16, 0
### branch: 4
### ###
""")

# TNLMeans会在4个进程内分支执行
May 05

flash3kyuu_deband 1.5.1 [2012-04-07]

Github: https://github.com/SAPikachu/flash3kyuu_deband
1.5.1源代码: https://github.com/SAPikachu/flash3kyuu_deband/tree/1.5.1

效果图: https://picasaweb.google.com/SAPikachu/Flash3kyuu_deband110SampleRev2?feat=directlink

文档:https://raw.github.com/SAPikachu/flash3kyuu_deband/1.5.1/flash3kyuu_deband.zh.txt

更新记录:

1.5.1 (2012-04-07)
可设置高斯随机数生成器的标准差

1.5.0
(此版本无新功能,只修改了部分参数以减少混淆)
ditherY/ditherC改名为grainY/grainC
dynamic_dither_noise改名为dynamic_grain
precision_mode改名为dither_algo,并移除模式4及5
random_algo_dither改名为random_algo_grain
移除enable_fast_skip_plane,此优化会在符合条件时自动启用(滤镜处理结果不会受此影响)

1.4.2 (2011-11-10)
修复某些非mod16视频的崩溃问题

1.4.1 (2011-11-05)
修复YUY2支持
改进位深相关参数的默认值处理
precision_mode 4 / 5已过时,并可能会在新的版本中移除,请改用output_mode 1 / 2以得到同样效果

1.4.0 (2011-10-30)
9 ~ 16位深输入/输出
相关参数:input_mode/input_depth/output_mode/output_depth
新的随机数生成器,参考像素位置及噪声可以为均匀分布或高斯分布
相关参数:random_algo_ref / random_algo_dither
diff_seed已被dynamic_dither_noise取代,启用时每帧的噪声模式会变化
另一个新参数:enable_fast_skip_plane
新增滤镜短名:f3kdb
新的ICC编译版理论上可在SSE2前的CPU上运行(未测试)
少量Bug修复

1.3.0 (2011-09-07)
新增x64版本
新增降色深滤镜:f3kdb_dither
内部处理精度提升至16bit
新增参数:keep_tv_range,具体说明请参考readme.zh.txt
修改sample_mode的默认值到2
Bug修复:Floyd-Steinberg dither用于full-range视频时,结果可能会有错误
Bug修复:错误的YUY2 debanding
少量优化

1.2.0 (2011-08-01)
新增支持YUY2(未优化)
新增支持AviSynth 2.6中新的平面YUV格式
滤镜现在同时支持AviSynth 2.5及2.6
16bit输出(precision_mode = 4/5)
(目前内部处理精度仍然为14bit,未来的版本会改进)
1.1.0 (2011-06-18)
修复在高精度模式下高阈值造成的错误
更改阈值效果以增加可调节性,同一个阈值在新版中的效果会变弱
SSE优化高精度模式
对某些无效参数组合直接提示错误
1.0.2 (2011-06-06)
高精度处理模式(目前未进行优化,将会下一个版本添加)
正确处理帧边缘
修正某些情况下的崩溃
其它bug修复
1.0.1 (2011-05-27)
多线程处理
不处理阈值为0的平面

1.0.0 (2011-05-21)
修复大量Bug
新增SSE优化,速度大幅提升,i5-520m默认参数可以达到24fps以上
0.9.1 (2011-05-05)
修正:当blur_first=false时,处理结果会出错
0.9 (2011-05-04)
原始发布版

下载:http://www.nmm-hd.org/newbbs/viewtopic.php?f=7&t=239

Feb 12

第一个实用(?)的.Net AVS插件 – EPTextSub(EP特效内嵌插件。。。)

最近受人所托,压一个非常ep的特效,足有200MB+。。。估计是VSFilter内存泄漏的缘故,其中某几个部分压的时候内存占用会飙升,导致内存不足而crash。。。(据说某个part没人压成功过。。。

后来经过试验,发现一个非常EP的解决方法,就是分段压制。。。压最BT的part的时候,要分成每6帧一段。。。因为觉得分段和合并非常麻烦,于是这个插件就出现了。。。

使用方法:

 

#请预先加载VSFilter.dll
SetMemoryMax(16) #非必要,但推荐这么做 
LoadPlugin("AvsFilterNet.dll")
#…
EPTextSub(字幕文件[,内存限制]) #内存限制单位为MB,默认1024
# 或
EPEval("""TextSub(xxx)"""[,内存限制]) 

 

然后当压制程序的内存占用达到内存限制值时,就会自动重新加载字幕以释放VSFilter占用的内存。。。(顺便提一下,如果字幕文件非常巨大的话。。。压制进程可能会停顿N分钟。。。

 

下载:

 

 

 

 

(2.13小更新,主要是引入更简便的AVSValue释放机制。。。其它部分无改动。。。

2011-12-06:增加EPEval,其实也是很久以前写好的,忘记更新这里了orz

 

使用时的截图:

image

心电图

某人语。。。

 

系统需求:

.Net Framework 2.0+

如果安装.Net后还是不能运行的话,就要装这个:

Visual C++ 2008 SP1 Redistributable

 

最后,让我们期待下roozhou大对VSFilter的优化吧。。。orz

Aug 04

宠物小精灵M10 HDTVRIP制作手记

折腾了一个多星期终于基本完成了。。。接下来就是发布了。。。这次的处理异常复杂,在这里记录一下。。。

1、搞到片源之后发现和去年的m9HD一样还是有水印。。。抱着一线希望拿出某消logo插件(AVSInpaint,之前在m9上面实验失败。。。),结果发现还是消不干净。。。

2、正准备放弃的时候发现原来有些帧是没有水印的(恶心的片源。。。不对。。。是恶心的电视台。。。),估计就是因为这样导致logo分析有误差。遂把找到的无logo的帧切掉,之后logo就可以消到基本看不见了。

before after

3、中间还有几处大的电视台logo,估计是放广告之后出现的。。。其中几个前后都有重复的帧,所以可以直接砍掉。。。最后还剩下两个要手动处理的。

4、手动处理Part1:这个还是比较容易。。。logo跨越了两个场景,第一个场景完全是静态图,直接用前面的一帧完好帧覆盖掉。第二个场景大部分也是静态的,只有中间有移动。要命的是logo有小部分在移动的地方。。。还好那个位置的颜色比较单一,可以用完好帧覆盖然后强力柔化蒙混过关。。。

71976_1 –>71976_2 –>71976_3

5、手动处理Part2:这部分是最麻烦的。。。logo覆盖部分完全动态,logo有一部分也是动态,没有重复帧。。。本来已经是想忽略这部分了,在压片前越看越不顺眼,于是开始尝试。。。在试过多种方法未果后,逼于无奈使出了最EP的办法。。。

1)先把有logo的片段导出为bmp序列(一百多帧。。。

2)祭出PS为每一帧在有logo的地方做mask(还好有一半是非动态的。。。不然一定做得吐血身亡。。。orz

3)翻出去年的m10 dvdrip(没错,就是dvdrip),调整好大小(这片源还有黑边。。。于是还要慢慢测试。。。)

4)imagesource读入mask,把dvdrip的同一部分切出来,然后overlay上原片

就这个场景弄了我大半天。。。orz

结果:

96262_1 –>96262_2

有一点小瑕疵。。。不过还算可以接受吧。。。

大致就是这样了。。。剩下的还有几帧要ps的就忽略不计了。。。orz

Feb 03

TFM处理后仍残余拉丝的偷懒解决方法

话说TIVTC真是个好东西,全自动VFR太方便了,效果还非常好。最近处理某混合DVD片源时发现残余大量拉丝,因为实在不想手动处理(太麻烦了。。。),想出了这个办法。

以下脚本内容大部分A自Dgwxx大神的主页

function CombingInfo(clip c, int "thresh")
{
file = "ovr.txt"
global clip = c
global sep=" +"

global combedthreshold=default(thresh,70)
c=SeparateFields(c)
c=c.Blur(0.0,1.58).Blur(0.0,1.58).Blur(0.0,1.58).Blur(0.0,1.58)
c=c.Blur(0.0,1.58).Blur(0.0,1.58).Blur(0.0,1.58)
c=c.Blur(0.0,1.58).Blur(0.0,1.58)
c=c.Blur(0.0,1.58)
c=weave(c)
c = FrameEvaluate(c, "global a = IsCombed(clip, combedthreshold)")
c = WriteFileIf(c, file, "a==true", "current_frame", "sep")
return c
}

dgdecode_mpeg2source("d2v.d2v")
tfm(slow=2,d2v="d2v.d2v")
combinginfo
crop(0,0,32,32)

(后面的crop是为了加快处理速度)

然后把脚本从头到尾播一次(推荐avs2avi,速度很快),生成ovr.txt,最后直接在tfm的参数里指定ovr="ovr.txt"就可以了。