搜索 社区服务 统计排行 帮助
  • 11768阅读
  • 37回复

[原创]在影片中加入图片logo的方法(2005.2.25更新)

楼层直达
级别: 新手上路
注册时间:
2005-02-19
在线时间:
0小时
发帖:
31
软件下载:
AviSynth
http://sourceforge.net/project/showfiles.php?group_id=57023
VirtualDubMod
http://sourceforge.net/project/showfiles.php?group_id=65889
GIF Movie Gear
http://www.moviegear.com/gmgdown.htm
GSpot
http://dl.163.com/downloadthis.php?id=18461&temp=/GSpot25b8.rar
Adobe PhotoshopACDsee等制图工具

一.静态logo

可以通过AviSynth或VirtualDubMod加载静态logo;先讨论AviSynth方法:

处理背景色:
1.用colorkeymask滤镜;
2.用mask滤镜;

1.colorkeymask滤镜:
(1)logo的选取
选择一定分辩率的图片,在图像编辑器里编辑好尺寸,尽量不要在脚本里用resize滤镜.

(2)编写脚本
<1>若图片背景为纯白色,比如




脚本:
引用

v1=AviSource("G:\Sample\AVI\s01.avi").converttorgb32
v2=ImageReader("G:\Sample\pics\p01.jpg").converttorgb24.flipvertical()
v3=v2.converttorgb32.colorkeymask($FFFFFF,20)
Layer(v1,v3,"add",255,0,0)


解说:
v1=AviSource("G:\Sample\AVI\s01.avi").converttorgb32
#以AviSource方式读取影片来源;改变成converttorgb32的颜色环境

v2=ImageReader("G:\Sample\pics\p01.jpg").converttorgb24.flipvertical()
#以ImageReader方式读取logo来源;改变成converttorgb24的颜色环境,也可以写为converttorgb32;flipvertical()为翻转滤镜

v3=v2.converttorgb32.colorkeymask($FFFFFF,20)
#将colorkeymask滤镜应用到logo

Layer(v1,v3,"add",255,0,0)
#合并v1(影片),v3(logo);Layer函数中覆盖强度为255,图片主体不透明;图片坐标值为0,0,在左上角

colorkeymask滤镜的说明:
colorkeymask(int color,int tolerance)
int color:色彩深度---16进制: $xxxxxx,x取值为0-f; 10进制:0-255
int tolerance:取值0-255,在int color固定时,随int tolerance值的增大,图片趋向透明.

colorkeymask($FFFFFF,40)中先固定int color为$FFFFFF,调节int tolerance使图像达到最佳效果,int tolerance值过小,背景色不能完全去掉;int tolerance值过大,导致主体颜色损失,此处为20.这里$FFFFFF若改为10进制数起不到去掉背景色的作用.



可见logo有一定的损失.


<2>若图片背景为其它纯色,比如

方法a.确定背景色的RGB数值,将int color用RGB的十六进制形式表示.(RGB三原色在WINDOWS有相应的值以16进制编译,定义了256种色彩深度即0-FF,但在SSA中是以BGR形式表示出来的.若R:46,G:139,B:87,则RGB:2E8B57,BGR:578B2E)
方法b.将背景色改为纯白色,修改办法在第2部分的mask滤镜方法中,修改后再按<1>加载.

下面讨论方法a

获得背景颜色代码的方法:
打开WINDOWS"附件"中的"画图",点击工具栏里的"取色",选择背景色;打开"颜色"菜单,编辑颜色,规定自定义颜色,得到R:152,G:115,B:211,即RGB: 9873D3,用BGR表示为BGR: D37398.

或打开Adobe Photoshop,点击工具栏里的"吸管工具",也可以得到RGB的十进制数值.



转换为16进制的方法:
直接计算或打开Sub Station Alpha v4.08在Style Override中的"colour"规定自定义颜色,即可显示BGR数值,再转换为RGB形式即可.



脚本:
引用

v1=AviSource("G:\Sample\AVI\s01.avi").converttorgb32
v2=ImageReader("G:\Sample\pics\p03.jpg").converttorgb24.flipvertical()
v3=v2.converttorgb32.colorkeymask($9873D3,40)
Layer(v1,v3,"add",255,0,0)


注:colorkeymask($9873D3,40)中先固定int color为$9873D3,调节int tolerance到40去掉背景色;在去掉背景色后,int tolerance的值要尽量的小.



主体颜色有少量损失.

将以上脚本中的colorkeymask($9873D3,40)改为colorkeymask(255,165),其它不变



主体颜色损失严重.

若将colorkeymask($9873D3,40)改为colorkeymask(60,165),其它不变



主体颜色损失严重.

若将colorkeymask($9873D3,40)改为colorkeymask(0,220),其它不变



主体颜色损失十分严重.

总结:
若int color采用16进制的某个颜色(一般选用背景色的RGB值),当int tolerance值的增大到一特定值时,该颜色消失.(当采用16进制不能去掉背景色时,可尝试采用10进制)
若int color采用10进制的某个颜色(一般先固定int color为255),变动int tolerance的值,选择去掉背景色的最佳数值,再固定int tolerance的值,回过头来调节int color的数值,使图像效果达到最佳.
无论采用16进制还是10进制,随int tolerance值增大,主体颜色都会减弱.


<3>若图片背景为杂色,比如



方法a.将背景色改为纯白色,修改办法在第2部分的mask滤镜方法中,修改后再按<1>加载.
方法b.用mask函数实现透明.

级别: 新手上路
注册时间:
2005-02-19
在线时间:
0小时
发帖:
31
只看该作者 1楼 发表于: 2005-02-25
2.mask滤镜
(1)使用Adobe Photoshop,先将图片背景色改为纯白色
对<3>中的图片,使用工具栏中的"魔棒工具",选取背景区域;右键选择"扩大选取",可减少边界误差



设置前景色为纯白色



打开"编辑"菜单,选"填充"



得到底色纯白的图片



若"魔棒工具"很难选定图形,在"导航器"中将画面放大到1000%,确定原图形的边缘颜色;使用工具栏中的"铅笔工具",选"画笔"为最细,用"铅笔工具"将其边缘线加强一遍即可.

(2)制做logo的遮罩图片,即底色纯黑,主体纯白,制作方法同上(切换底色和主体颜色时用右键"选则反取")



脚本:
引用

v1=AviSource("G:\Sample\AVI\s01.avi").converttorgb32
v2=ImageReader("G:\Sample\pics\p15.jpg").converttorgb32.flipvertical()
v3=ImageReader("G:\Sample\pics\p16.jpg").converttorgb32.flipvertical()
v2=v2.mask(v3).FadeIO(24)
v4=trim(v1,0,119)
v5=trim(v1,120,359).Layer(v2,"add",255,460,0)
v6=trim(v1,360,0)
return v4+v5+v6


解说:
v1=AviSource("G:\Sample\AVI\s01.avi").converttorgb32
#以AviSource方式读取影片来源;改变成converttorgb32的颜色环境

v2=ImageReader("G:\Sample\pics\p15.jpg").converttorgb32.flipvertical()
#以ImageReader方式读取logo来源;改变成converttorgb32的颜色环境,mask只支持rgb32

v3=ImageReader("G:\Sample\pics\p16.jpg").converttorgb32.flipvertical()
#以ImageReader方式读取logo遮罩图片来源;改变成converttorgb32的颜色环境

v2=v2.mask(v3).FadeIO(24)
#合并logo与遮罩图片;logo淡入,淡出为24幅,对于23.976frm/s的影片,为1秒(淡出效果不明显)

v4=trim(v1,0,119)
#前5秒logo不会出现,5*24=120frm

v5=trim(v1,120,359).Layer(v2,"add",255,460,0)
#logo从第5秒出现到第15秒结束,持续10秒; Layer函数中覆盖强度为255,图片主体不透明;影片的分辨率640*352,logo分辨率180*119, 图片坐标值为460=640-180,0,在右上角

v6=trim(v1,360,0)
#截取359以后的幅

return v4+v5+v6
#结合三部分



另外logo可以用png或bmp格式的图片

用png图片:
引用

v1=AviSource("G:\Sample\AVI\s01.avi").converttorgb32
v2=ImageReader("G:\Sample\pics\p18.png").converttorgb32.flipvertical()
v3=ImageReader("G:\Sample\pics\p19.png").converttorgb32.flipvertical()
v2=v2.mask(v3).FadeIO(24)
v4=trim(v1,0,119)
v5=trim(v1,120,359).Layer(v2,"add",255,460,0)
v6=trim(v1,360,0)
return v4+v5+v6




用bmp图片:
引用

v1=AviSource("G:\Sample\AVI\s01.avi").converttorgb32
v2=ImageReader("G:\Sample\pics\p21.bmp").converttorgb32
v3=ImageReader("G:\Sample\pics\p22.bmp").converttorgb32
v2=v2.mask(v3).FadeIO(24)
v4=trim(v1,0,119)
v5=trim(v1,120,359).Layer(v2,"add",255,460,0)
v6=trim(v1,360,0)
return v4+v5+v6


注:已去掉翻转滤镜flipvertical()

可见,用mask滤镜的实现背景透明效果明显好于用colorkeymask滤镜(也可用ACD FotoCanvas 2.0制做遮罩图片,但边缘误差较大);


下面讨论用VirtualDubMod加载静态logo

方法一:从"Open video file(s) via AVIsynth"打开avs脚本,即上面所讲

方法二:在VirtualDubMod中打开要压缩的视频,选择"Full processing mode",打开"Filters"



点击"add",在"Add Filter"中选则"logo"



只能选择24位BMP图或tga图片,若要载入如下24位BMP图(链接转为jpg图)



为去掉底色,需要再做出其黑底以及黑底白芯两张24位BMP图



将黑底图片作为"Logo image",将黑底白芯图片作为"Alpha image";"Opacity"滑块用来调节透明度;"Justification"确定图片的大置位置;"X offset"与"Y offset"为水平和垂直位移




点"ok"确定后即可压缩

级别: 新手上路
注册时间:
2005-02-19
在线时间:
0小时
发帖:
31
只看该作者 2楼 发表于: 2005-02-25
二.动态logo

为方便起见,下面讨论avi文件为mp3音频的情况

1.gif动画
若影片帧率为23.976frm/s(frm/s相当于fps),选择帧率为12.5frm/s的图片如下:


对于小于影片帧率的gif图片,打开Gif Movie Gear,从"属性设置"的"全局帧"看到"动画"方框中的8



8表示每0.08秒显示1幅,1幅/(8*0.01秒)=12.5幅/秒=12.5frm/s;Gif Movie Gear的默认值为10

运用前面的思想,我们需要制作遮罩视频源,因此首先制作遮罩图片;

先将图片保存为png,bmp,jpg等格式(为了后面做遮罩图片方便,先不要改变图片尺寸),保存后为6张单元图,将这6张图的底色改为纯白色,再做这6张图的遮罩图片(黑底白芯),仍然用前面方法;png格式的图片用"魔棒工具"进行"填充"较为方便,但如果填充有问题可以将其转换为bmp格式;等做好一对一的遮罩图片,再修改这12张图的尺寸.








选择与影片帧率相同或接近的帧率,影片帧率23.976frm/s,选择25frm/s;将8改为4,则1幅/(4*0.01秒)=25幅/秒=25frm/s,为了使动画频率不变,可以在原来的帧后面插入一次相同帧,这样保存后的avi文件帧率为25frm/s,但其运动其频率与gif(帧率为12.5frm/s)相同



对固有帧多次复制,使得从Gif Movie Gear转换出来的avi文件达到一定长度,使其大于在影片中的显示时间.(这里在每一帧后面插入一遍相同帧后,再对其复制19遍,共计20个循环,将10(默认值)改为4,转出来的avi有19秒)



从Gif Movie Gear转换出来的avi的动画还需要用VirtualDubMod再做一次压缩,否则

若用DirectShowSource方式读取从Gif Movie Gear转换出来的avi,会出现错误提示:"the filter graph manager won't talk to me"
若用AviSource方式读取,会出现错误提示:"the video decompressor couldn't produce YUY2 or RGB output"

在VirtualDubMod中打开要压缩的视频,选择"Full processing mode",打开"Compression"



可以选用XviD MPEG-4 Codec或DivX Pro 5.0.5 Codec,用XviD MPEG-4 Codec压出的颜色比用DivX Pro 5.0.5 Codec要好



在动画运动频率正常的情况下,最后压缩得到的avi文件其帧率应当与影片帧率相同或接近;当动画帧率小于影片帧率时,运动频率加快,当动画帧率大于影片帧率时,运动频率减慢;
帧率的转换既可在Gif Movie Gear中完成,又可在VDM中完成



对于大于影片帧率的gif图片,比如50frm/s,1幅/(2*0.01秒)=50幅/秒=50frm/s;将2改为4,动画频率变为原来的一半,运动变慢,如果要删除gif中固有的帧必然造成损失;因此制作或选择gif图片,应尽量使其帧率不大于影片帧率,当影片帧率/gif帧率=整数(或接近)时,可采用上述插入相同帧的方法保持动画频率不变.

脚本:
引用

v1=AviSource("G:\Sample\AVI\s01.avi").converttorgb32.trim(125,374)
v2=AviSource("G:\Sample\AVI\s04.avi").converttorgb32
v3=AviSource("G:\Sample\AVI\s05.avi").converttorgb32
v2=v2.mask(v3).FadeIO(25)
v4=Layer(v1,v2,"add",255,0,0)
v5=AviSource("G:\Sample\AVI\s01.avi").converttorgb32
v6=v5.trim(0,124)+v4+v5.trim(375,0)
return v6


解说:
v1=AviSource("G:\Sample\AVI\s01.avi").converttorgb32.trim(125,374)
#以AviSource方式读取影片来源;改变成converttorgb32的颜色环境;截取100到349幅

v2=AviSource("G:\Sample\AVI\s04.avi").converttorgb32
#以AviSource方式读取白底动画来源;改变成converttorgb32的颜色环境

v3=AviSource("G:\Sample\AVI\s05.avi").converttorgb32
#以AviSource方式读取遮罩视频源;改变成converttorgb32的颜色环境

v2=v2.mask(v3).FadeIO(25)
#合并白底动画与遮罩视频源;logo淡入,淡出为25幅,对于25frm/s的动画,为1秒(淡出效果不明显)

v4=Layer(v1,v2,"add",255,0,0)
#将动画加入到影片中,Layer函数中覆盖强度为255,动画主体不透明

v5=AviSource("G:\Sample\AVI\s01.avi").converttorgb32
#以AviSource方式读取影片来源;改变成converttorgb32的颜色环境

v6=v5.trim(0,124)+v4+v5.trim(375,0)
#动画在第5秒出现到第15秒结束,持续10秒,5*25=125frm,15*25=375frm

return v6
#返回表达式v6

注意:mask滤镜仅适用于rgb32色彩环境;
  用DirectShowSource读取影片来源速度较慢,最好不用;
  对于动画显示时间的设置应以最后压缩好的avi文件帧率来决定



如果不使用遮罩视频源,还可以使用以下脚本:
引用

v1=AviSource("G:\Sample\AVI\s01.avi").ConvertToYUY2.trim(125,374)
v2=AviSource("G:\Sample\AVI\s04.avi").ConvertToYUY2
v3=Layer(v1,v2,"add",255,0,0)
v4=AviSource("G:\Sample\AVI\s01.avi").ConvertToYUY2
v5=v4.trim(0,124)+v3+v4.trim(375,0)
return v5


最后以YUY2颜色环境模式输出



将上面第3行改为v3=Layer(v1,v2,"fast",0,0),Layer滤镜中的字段"add"改为"fast", 参数level值不起作用,透明度一半


级别: 新手上路
注册时间:
2005-02-19
在线时间:
0小时
发帖:
31
只看该作者 3楼 发表于: 2005-02-25
采用笨办法,10个循环,图片采用最初从Gif Movie Gear保存下来的原始尺寸的png图片,由于gif图片帧率为12.5frm/s,差不多是影片23.975frm/s的一半,故每2帧对应1幅动画
引用

v1=AviSource("G:\gif\jpg\s01.avi").converttorgb32
p1=ImageReader("G:\Sample\pics\png\01.png").converttorgb32.flipvertical()
p2=ImageReader("G:\Sample\pics\png\02.png").converttorgb32.flipvertical()
p3=ImageReader("G:\Sample\pics\png\03.png").converttorgb32.flipvertical()
p4=ImageReader("G:\Sample\pics\png\04.png").converttorgb32.flipvertical()
p5=ImageReader("G:\Sample\pics\png\05.png").converttorgb32.flipvertical()
p6=ImageReader("G:\Sample\pics\png\06.png").converttorgb32.flipvertical()
v2=trim(v1,0,124).converttorgb32
v11=trim(v1,125,126).Layer(p1,"add",255,0,0)
v12=trim(v1,127,128).Layer(p2,"add",255,0,0)
v13=trim(v1,129,130).Layer(p3,"add",255,0,0)
v14=trim(v1,131,132).Layer(p4,"add",255,0,0)
v15=trim(v1,133,134).Layer(p5,"add",255,0,0)
v16=trim(v1,135,136).Layer(p6,"add",255,0,0)
v21=trim(v1,137,138).Layer(p1,"add",255,0,0)
v22=trim(v1,139,140).Layer(p2,"add",255,0,0)
v23=trim(v1,141,142).Layer(p3,"add",255,0,0)
v24=trim(v1,143,144).Layer(p4,"add",255,0,0)
v25=trim(v1,145,146).Layer(p5,"add",255,0,0)
v26=trim(v1,147,148).Layer(p6,"add",255,0,0)
v31=trim(v1,149,150).Layer(p1,"add",255,0,0)
v32=trim(v1,151,152).Layer(p2,"add",255,0,0)
v33=trim(v1,153,154).Layer(p3,"add",255,0,0)
v34=trim(v1,155,156).Layer(p4,"add",255,0,0)
v35=trim(v1,157,158).Layer(p5,"add",255,0,0)
v36=trim(v1,159,160).Layer(p6,"add",255,0,0)
v41=trim(v1,161,162).Layer(p1,"add",255,0,0)
v42=trim(v1,163,164).Layer(p2,"add",255,0,0)
v43=trim(v1,165,166).Layer(p3,"add",255,0,0)
v44=trim(v1,167,168).Layer(p4,"add",255,0,0)
v45=trim(v1,169,170).Layer(p5,"add",255,0,0)
v46=trim(v1,171,172).Layer(p6,"add",255,0,0)
v51=trim(v1,173,174).Layer(p1,"add",255,0,0)
v52=trim(v1,175,176).Layer(p2,"add",255,0,0)
v53=trim(v1,177,178).Layer(p3,"add",255,0,0)
v54=trim(v1,179,180).Layer(p4,"add",255,0,0)
v55=trim(v1,181,182).Layer(p5,"add",255,0,0)
v56=trim(v1,183,184).Layer(p6,"add",255,0,0)
v61=trim(v1,185,186).Layer(p1,"add",255,0,0)
v62=trim(v1,187,188).Layer(p2,"add",255,0,0)
v63=trim(v1,189,190).Layer(p3,"add",255,0,0)
v64=trim(v1,191,192).Layer(p4,"add",255,0,0)
v65=trim(v1,193,194).Layer(p5,"add",255,0,0)
v66=trim(v1,195,196).Layer(p6,"add",255,0,0)
v71=trim(v1,197,198).Layer(p1,"add",255,0,0)
v72=trim(v1,199,200).Layer(p2,"add",255,0,0)
v73=trim(v1,201,202).Layer(p3,"add",255,0,0)
v74=trim(v1,203,204).Layer(p4,"add",255,0,0)
v75=trim(v1,205,206).Layer(p5,"add",255,0,0)
v76=trim(v1,207,208).Layer(p6,"add",255,0,0)
v81=trim(v1,209,210).Layer(p1,"add",255,0,0)
v82=trim(v1,211,212).Layer(p2,"add",255,0,0)
v83=trim(v1,213,214).Layer(p3,"add",255,0,0)
v84=trim(v1,215,216).Layer(p4,"add",255,0,0)
v85=trim(v1,217,218).Layer(p5,"add",255,0,0)
v86=trim(v1,219,220).Layer(p6,"add",255,0,0)
v91=trim(v1,221,222).Layer(p1,"add",255,0,0)
v92=trim(v1,223,224).Layer(p2,"add",255,0,0)
v93=trim(v1,225,226).Layer(p3,"add",255,0,0)
v94=trim(v1,227,228).Layer(p4,"add",255,0,0)
v95=trim(v1,229,230).Layer(p5,"add",255,0,0)
v96=trim(v1,231,232).Layer(p6,"add",255,0,0)
v01=trim(v1,233,234).Layer(p1,"add",255,0,0)
v02=trim(v1,235,236).Layer(p2,"add",255,0,0)
v03=trim(v1,237,238).Layer(p3,"add",255,0,0)
v04=trim(v1,239,240).Layer(p4,"add",255,0,0)
v05=trim(v1,241,242).Layer(p5,"add",255,0,0)
v06=trim(v1,243,244).Layer(p6,"add",255,0,0)
v3=trim(v1,245,0).converttorgb32
return v2+v11+v12+v13+v14+v15+v16+v21+v22+v23+v24+v25+v26+v31+v32+v33+v34+v35+v36+v41+v42+v43+v44+v45+v46+v51+v52+v53+v54+v55+v56+v61+v62+v63+v64+v65+v66+v71+v72+v73+v74+v75+v76+v81+v82+v83+v84+v85+v86+v91+v92+v93+v94+v95+v96+v01+v02+v03+v04+v05+v06+v3


动画从第5秒开始出现,5*25=125frm,持续4.8秒,9.8*25=245frm

ffdshow由于脚本行数受到限制,当语句过多时将无法加载;

将10个循环的avs脚本直接从Helix Producer Plus中打开,但动画出现后出现急速翻转现象;

若通过VirtualDubMod中的"Open video file(s) via AVIsynth"打开avs脚本,通过移动关键帧开始也会出现动画的翻转现象,但多移动几次后则正常显示,此时再按上面的方法压缩保存即可


级别: 新手上路
注册时间:
2005-02-19
在线时间:
0小时
发帖:
31
只看该作者 4楼 发表于: 2005-02-25
2.加入avi影片

若原影片为mp3音频,帧率23.976frm/s,尺寸640*352

(1)选择mp3音频的片子,帧率25frm/s,尺寸592*320

脚本:
引用

v1=AviSource("G:\Sample\AVI\s01.avi").ConvertToYUY2.trim(125,374)
v2=AviSource("G:\Sample\AVI\s08.avi").ConvertToYUY2.LanczosResize(296,160)
v3=Layer(v1,v2,"add",255,344,0).ConvertToYV12
v4=AviSource("G:\Sample\AVI\s01.avi").ConvertToYV12
v5=v4.trim(0,124)+v3+v4.trim(375,0)
return v5


解说:
v1=AviSource("G:\Sample\AVI\s01.avi").ConvertToYUY2.trim(125,374)
#以AviSource方式读取影片来源;改变成YUY2颜色环境;截取125到374幅

v2=AviSource("G:\Sample\AVI\s08.avi").ConvertToYUY2.LanczosResize(296,160)
#以AviSource方式读取影片来源;改变成YUY2颜色环境;改变载入影片的分辨率为296*160

v3=Layer(v1,v2,"add",255,344,0).ConvertToYV12
#合并两部分视频;加入的视频在右上角,344=640-296,不透明;改变成YV12颜色环境

v4=AviSource("G:\Sample\AVI\s01.avi").ConvertToYV12
#以AviSource方式读取影片来源;改变成YV12颜色环境

v5=v4.trim(0,124)+v3+v4.trim(375,0)
#小视频在第5秒出现到第15秒结束,持续10秒,5*25=125frm,15*25=375frm

return v5
#返回表达式v5;最后以YV12颜色环境模式输出


(2)若要加入2.0声道AC3音频或5.1声道AC3音频的AVI文件,首先要用VirtualDubMod去掉音频部分,分离出纯视频,再用上面的方法;
否则会出现错误提示:"ACM failed to suggest a compatible PCM format"

用GSpot查看avi片源:



对于加入的是mp3音频的AVI文件则不必去掉音频部分,layer函数合并两部分视频其音频采用前一视频的音频.


以上讨论了avi为mp3时的脚本写法,对2.0声道AC3音频或5.1声道AC3音频的avi,可先用VirtualDubMod分离音频


a.若保存为ac3文件,脚本:
引用

loadplugin("G:\Sample\AVI\AviSynth Filter\ac3source.dll")
v1=AviSource("G:\Sample\AVI\s09.avi",false).converttorgb32.trim(125,374)
v2=AviSource("G:\Sample\AVI\s04.avi").converttorgb32
v3=AviSource("G:\Sample\AVI\s05.avi").converttorgb32
v2=v2.mask(v3).FadeIO(25)
v4=Layer(v1,v2,"add",255,0,0)
v5=AviSource("G:\Sample\AVI\s09.avi",false).converttorgb32
v6=v5.trim(0,124)+v4+v5.trim(375,0)
v7=ac3source("G:\Sample\AVI\s11.ac3")
audiodub(v6,v7)


解说:
loadplugin("G:\Sample\AVI\AviSynth Filter\ac3source.dll")
#调用AC3解码滤镜

v1=AviSource("G:\Sample\AVI\s09.avi",false).converttorgb32.trim(125,374)
#false为取消声音

v7=ac3source("G:\Sample\AVI\s11.ac3")
#载入分离出的ac3文件

audiodub(v6,v7)
#合并视频,音频



b.若保存为wav文件,脚本:
引用

loadplugin("G:\Sample\AVI\AviSynth Filter\mpasource.dll")
v1=AviSource("G:\Sample\AVI\s09.avi",false).converttorgb32.trim(125,374)
v2=AviSource("G:\Sample\AVI\s04.avi").converttorgb32
v3=AviSource("G:\Sample\AVI\s05.avi").converttorgb32
v2=v2.mask(v3).FadeIO(25)
v4=Layer(v1,v2,"add",255,0,0)
v5=AviSource("G:\Sample\AVI\s09.avi",false).converttorgb32
v6=v5.trim(0,124)+v4+v5.trim(375,0)
v7=mpasource("G:\Sample\AVI\s11.wav")
audiodub(v6,v7)


解说:
loadplugin("G:\Sample\AVI\AviSynth Filter\mpasource.dll")
#调用mp1/2/3解码滤镜

v7=mpasource("G:\Sample\AVI\s11.wav")
#载入分离出的wav文件

或用以下脚本:
引用

v1=AviSource("G:\Sample\AVI\s10.avi",false).converttorgb32.trim(125,374)
v2=AviSource("G:\Sample\AVI\s04.avi").converttorgb32
v3=AviSource("G:\Sample\AVI\s05.avi").converttorgb32
v2=v2.mask(v3).FadeIO(25)
v4=Layer(v1,v2,"add",255,0,0)
v5=AviSource("G:\Sample\AVI\s10.avi",false).converttorgb32
v6=v5.trim(0,124)+v4+v5.trim(375,0)
v7=DirectShowSource("G:\Sample\AVI\s12.wav")
audiodub(v6,v7)


解说:
v7=DirectShowSource("G:\Sample\AVI\s12.wav")
#载入分离出的wav文件

滤镜下载:
http://www.avisynth.org/warpenterprises/


补充:
RGB/YUV颜色空间:
RGB颜色空间中,每种颜色都可以用三个变量来表示 ,为红色、绿色、蓝色的强度
YUV颜色空间中,“Y”代表明亮度(Luma);“U”和“V”表示色度(Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色;在YUV颜色空间中,图片是通过复合模式存储的.
由于不同颜色空间的存储量不同,因此运算速度也不相同;RGB24最慢,应必避免使用;最快为YV12,其次是YUY2,YV12的数据存储量仅占RGB32的一半;
我们可以用ConvertToYV12或ConvertToYUY2将颜色空间转为YV12或YUY2;如果视频源为YV12或YUY2,可以用ConvertToRGB转为RGB32模式;用ConvertToRGB32将RGB24模式转为RGB32模式.
AviSynth中不同滤镜的使用有对应的颜色空间.

级别: 新手上路
注册时间:
2005-02-19
在线时间:
0小时
发帖:
31
只看该作者 5楼 发表于: 2005-02-25
用VirtualDub的外置滤镜加载静/动态logo的方法

下载:
Logo.vdf滤镜:
http://neuron2.net/logo14.zip

24位BMP动画序列:
http://neuron2.net/earth.zip

1.静态logo

图片采用以下24位BMP图(链接转为jpg图)




脚本:
引用

AVISource("G:\Sample\AVI\s01.avi")
function StaticLogo(clip,int "x", int "y", int "Alpha", bool "transparent",
\ int "R", int "G", int "B", int "tolerance", string "LogoName",
\ bool "Animate", int "Start", int "Duration", int "Loops",
\ int "FadeIn", int "End", int "FadeOut")
{
LoadVirtualdubPlugin("G:\Sample\AVI\VirtualDub filters\Logo.vdf", "Logovdf", 1)
return clip.Logovdf(default(x,0), default(y,0),
\ default(Alpha,255),
\ default(transparent,false)?1:0, default(R,0), default(G,0), default(B,0), default(tolerance,0),
\ default(LogoName,"G:\Sample\pics\bmp VDM\VDM01.bmp"),
\ default(Animate,false)?1:0,
\ default(Start,0),
\ default(Duration,0), default(Loops,0),
\ default(FadeIn,0), default(End,0), default(FadeOut,0))
}
converttorgb32()
StaticLogo(460,0,255,true,152,115,211,40,"G:\Sample\pics\bmp VDM\VDM04.bmp",false,120,0,0,24,360,24)


解说:
AVISource("G:\Sample\AVI\s01.avi")
#以AviSource方式读取影片来源

function StaticLogo(...){...}
#定义"StaticLogo"函数;

参数说明:
引用

int "x",int "y":图片的水平,垂直坐标;

int "Alpha":透明度,相当于AviSynth中Layer滤镜的"level"参数,取值0-255

bool "transparent":设置图片的透明通道,true开启,false关闭,开启后,int "R",int "G",int "B"以及int "tolerance"才可用;其作用与AviSynth中colorkeymask滤镜的作用完全相同

int "R",int "G",int "B":RGB的十进制数

int "tolerance":作用与AviSynth中colorkeymask滤镜的"tolerance"一样,取值0-255

string "LogoName":图片logo的名称,带上路径

bool "Animate":设置动态效果;true开启,false关闭

int "Start":图片出现时影片所在的帧数

int "Duration":动画序列中每张BMP图显示所用的帧数;最小设为1(对静态图片设为0)

int "Loops":动画序列循环的次数;若设为0,则表示不受限制,循环次数由显示时间决定

int "FadeIn":淡入所用帧数

int "End":图片消失时影片所在的帧数

int "FadeOut":淡出所用帧数


{...}
#设置参数初值

LoadVirtualdubPlugin("G:\Sample\AVI\VirtualDub filters\Logo.vdf", "Logovdf", 1)
#将Logo.vdf命名为Logovdf;

converttorgb32()
#改变成rgb32的颜色环境;

StaticLogo(480,0,255,true,152,115,211,40,"G:\Sample\pics\bmp VDM\VDM04.bmp",true,120,0,0,24,360,24);
#调用StaticLogo函数;

影片分辨率640*352,图片分辨率180*119,460=640-180;在右上角;

"Alpha"为255,不透明;

"transparent"为true,开启透明通道;

背景色的RGB数值为:152,115,211;

调节"tolerance"到40;

logo图片路径及名称:"G:\Sample\pics\bmp VDM\VDM04.bmp";

"Animate"为false,关闭动态效果;对于静态图片改为true,仍然一样;

"Start"为120;对于23.976frm/s的影片,logo在第5秒出现,5*24=120;

对于静态图片,"Duration"与"Loops"都设为0

"FadeIn"为24,即淡入1秒(效果明显)

"End"为360;logo显示10秒,10*24=360-120

"FadeOut"为24,淡出1秒(效果明显)




2.动态logo

图片采用下载的BMP动画序列:



脚本:
引用

AVISource("G:\Sample\AVI\s01.avi")
function AnimatedLogo(clip,int "x", int "y", int "Alpha", bool "transparent",
\ int "R", int "G", int "B", int "tolerance", string "LogoName",
\ bool "Animate", int "Start", int "Duration", int "Loops",
\ int "FadeIn", int "End", int "FadeOut")
{
LoadVirtualdubPlugin("G:\Sample\AVI\VirtualDub filters\Logo.vdf", "Logovdf", 1)
return clip.Logovdf(default(x,0), default(y,0),
\ default(Alpha,255),
\ default(transparent,false)?1:0, default(R,0), default(G,0), default(B,0), default(tolerance,0),
\ default(LogoName,"G:\Sample\pics\bmp VDM\VDM01.bmp"),
\ default(Animate,false)?1:0,
\ default(Start,0),
\ default(Duration,0), default(Loops,0),
\ default(FadeIn,0), default(End,0), default(FadeOut,0))
}
converttorgb32()
AnimatedLogo(548,0,255,true,0,0,0,50,"G:\Sample\pics\bmp Earth\0000.BMP",true,120,1,0,24,490,24)


解说:

图片分辨率92*92,548=640-92;在右上角

背景色纯黑,所以RGB数值都定为0

调节"tolerance"到50;

图片序列的命名形式为name0000.bmp, name0001.bmp, name0002.bmp, etc. 这里只要加上第1张图片的路径及名称即可

开启动态效果

"Start"为120;logo在第5秒出现;

每张BMP图显示所用帧数为1;

对循环的次数不作限制,设为0;

"End"为490,动画序列共有74张单元图, 运动5个循环,5*74+120=490,也可以把上面的循环次数设为5,显示时间(490-120)/24=15.4秒

淡入,淡出都为1秒



级别: 新手上路
注册时间:
2005-02-19
在线时间:
0小时
发帖:
31
只看该作者 6楼 发表于: 2005-02-25
从射手网下载下来的VDM1.4.13.1里没有plugins文件夹,自己建立一个,将logo.vdf放在里面

filter中的参数完全对应前面StaticLogo和AnimatedLogo函数的参数:









级别: 新手上路
注册时间:
2005-02-19
在线时间:
0小时
发帖:
31
只看该作者 7楼 发表于: 2005-02-25
使用vdub_filters.avs:

做了三处修改:
vdub_filters.avs中

将LoadVirtualdubPlugin(VirtualDub_plugin_directory+"\logo.vdf", "_VD_Logo", 1)改为
LoadVirtualdubPlugin("G:\Sample\AVI\VirtualDub filters\Logo.vdf", "_VD_Logo", 1);

将\ default(tolerance,0), default(filename,VirtualDub_plugin_directory+"\logo.bmp"),改为
\ default(tolerance,0), default(filename,"G:\Sample\pics\bmp VDM\VDM01.bmp"),

建立sample31.avs,脚本为:

静态:
引用

Import("G:\Sample\AVI\vdub_filters.avs")
ConvertToRGB32()
VD_logo(460, 0, 255, true, 152, 115, 211, 40,"G:\Sample\pics\bmp VDM\VDM04.bmp", true, 120, 0, 0, 24, 360, 24)
ConvertToYUY2()


动态:
引用

Import("G:\Sample\AVI\vdub_filters.avs")
ConvertToRGB32()
VD_logo(548, 0, 255, true, 0, 0, 0, 50,"G:\Sample\pics\bmp Earth\0000.BMP", true, 120, 1, 0, 24, 490, 24)
ConvertToYUY2()




使用simplified_versions.avs

24位BMP动画序列(这里做成gif图)



将simplified_versions.avs中的\ 0, 0, 0, 0, default(filename,"G:\Recu0001.bmp"),改为
\ 0, 0, 0, 0, default(filename,"G:\Sample\AVI\recu\Recu0001.bmp"),

建立sample36.avs,脚本:
引用
LoadVirtualdubPlugin("G:\Sample\AVI\VirtualDub filters\Logo.vdf", "VD_Logo", 1)
Import("G:\Sample\AVI\simplified_versions.avs")
ConvertToRGB()
RE(30,30,0,20)
animate(240,312,"MV",30,30,240,1,155,30,312,1)
RE(155,30,313,20)
animate(552,624,"MV",155,30,552,1,280,30,624,1)
RE(280,30,625,20)
animate(864,936,"MV",280,30,864,1,405,30,936,1)
RE(405,30,937,20)
animate(1176,1248,"MV",405,30,1176,1,530,30,1248,1)
RE(530,30,1249,20)
animate(1488,1560,"MV",530,30,1488,1,30,250,1560,1)
RE(30,250,1561,20)
animate(1800,1872,"MV",30,250,1800,1,155,250,1872,1)
RE(155,250,1873,20)
animate(2112,2184,"MV",155,250,2112,1,280,250,2184,1)
RE(280,250,2185,20)
animate(2424,2496,"MV",280,250,2424,1,405,250,2496,1)
RE(405,250,2497,20)
animate(2736,2808,"MV",405,250,2736,1,530,250,2808,1)
RE(530,250,2809,20)


注: 这里我是针对帧率23.976frm/s,尺寸640*352的片子设置坐标的

色彩框:每次原地循环20个周期,10秒钟,每次平移时间3秒

原地运动10次,平移运动9次,总计10*10+3*9=127秒,即两分零七秒

正常观看速度会很慢,压缩以后可以

运动轨迹:



解说:

RE(155,30,313,20)
animate(552,624,"MV",155,30,552,1,280,30,624,1)

RE(155,30,313,20)
#调用动态函数RE;

155,30---起点位置坐标值为上次运动终点位置坐标值

313---运动起点帧等于上次运动终点帧加1,即313=312+1

20---循环20次

animate(552,624,"MV",155,30,552,1,280,30,624,1)

552---平移起点帧为上次运动终点帧加240(原地循环10秒),即552=312+240

624---平移终点帧为平移起点帧加72(平移时间3秒),即624=552+72

"MV"---调用调用静态函数MV

155,30---平移起点位置坐标

280,30---平移终点位置坐标


下载:
simplified_versions.avs

http://neuron2.net/vdub_filters_v15.zip

级别: 新手上路
注册时间:
2005-02-19
在线时间:
0小时
发帖:
31
只看该作者 8楼 发表于: 2005-02-25
Overlay滤镜

静态:

脚本1:
引用

v1=avisource("G:\Sample\AVI\s09.avi")
v2=ImageReader("G:\Sample\pics\p15.jpg").FlipVertical()
v3=ImageReader("G:\Sample\pics\p16.jpg").FlipVertical().ConvertToYUY2.ColorYUV(levels="TV->PC")
v4=Overlay(v1,v2,x=460,mode="Blend",mask=v3)
ColorYUV(v4,levels="PC->TV")


解说:

v1=avisource("G:\Sample\AVI\s09.avi")
#v1为源文件

v2=ImageReader("G:\Sample\pics\p15.jpg").FlipVertical()
#v2为要加入的图片

v3=ImageReader("G:\Sample\pics\p16.jpg").FlipVertical().ConvertToYUY2.ColorYUV(levels="TV->PC")
#v3为遮罩图片作为mask,转换为YUY2模式(亮度范围变为16-235),再转为0-255(对mask要保证亮度范围为0-255);用Histogram来看mask的亮度范围,如果在CCIR 601则需要通过ColorYUV(levels="TV->PC")扩展亮度范围

v4=Overlay(v1,v2,x=460,mode="Blend",mask=v3)
#图片坐标460=640-180,加入模式为Blend(默认值),关闭pc_range(默认值)

ColorYUV(v4,levels="PC->TV")
#转换YUY2模式的颜色范围为16-235



脚本2:
引用

v1=avisource("G:\Sample\AVI\s09.avi")
v2=ImageReader("G:\Sample\pics\p15.jpg").FlipVertical()
v3=ImageReader("G:\Sample\pics\p16.jpg").FlipVertical()
Overlay(v1,v2,x=460,mode="Blend",mask=v3,pc_range=true)
ConvertToYV12()

解说:

Overlay(v1,v2,x=460,mode="Blend",mask=v3,pc_range=true)
#开启pc_range(自动扩展YUV亮度范围为0-255,内部进行RGB->YUV->RGB转换);注:Overlay的运行是在YUV空间

ConvertToYV12()
#将RGB模式转为YV12模式输出

把脚本1改为:

v1=avisource("G:\Sample\AVI\s09.avi")
v2=ImageReader("G:\Sample\pics\p15.jpg").FlipVertical()
v3=ImageReader("G:\Sample\pics\p16.jpg").FlipVertical().ConvertToYUY2
Overlay(v1,v2,mode="Blend",mask=v3)



v1=avisource("G:\Sample\AVI\s09.avi")
v2=ImageReader("G:\Sample\pics\p15.jpg").FlipVertical().Crop(0,3,180,116)
v3=ImageReader("G:\Sample\pics\p16.jpg").FlipVertical().Crop(0,3,180,116).ConvertToYV12
Overlay(v1,v2,mode="Blend",mask=v3)



可以看到图片背景有轻微白色,这是ConvertToYUY2或ConvertToYV12作用在亮度的结果,也就是前面为什么要加上ColorYUV(levels="tv->pc")的原因;注:单纯的开启pc_range也不能解决问题

注:使用pc_range
1.加入模式为"add", "subtract" 或 "multiply" 时效果更好
2.当参数output不需要做空间转换时;其实Overlay很方便,用了output就不用再另外转空间

PC range:0-255
TV range:16-235(CCIR 601)

亮度范围转换:TV range<->PC range

ColorYUV(levels="TV->PC")
ColorYUV(levels="PC->TV")

以及常用的

ConvertToRGB
ConvertToRGB24
ConvertToRGB32
ConvertToYUY2
ConvertBackToYUY2
ConvertToYV12

另:ShowAlpha

clip.ShowAlpha("yuy2")
clip.ShowAlpha("rgb").ConvertToYUY2.
clip.ShowAlpha("rgb")

ShowAlpha的亮度范围都为0-255,仅对RGB32的源适用

级别: 新手上路
注册时间:
2005-02-19
在线时间:
0小时
发帖:
31
只看该作者 9楼 发表于: 2005-02-25
用Histogram观察亮度luma( Y ),色度chroma的分布:

为说明方便我采用p11.jpg这张图
引用

colordistributions=ImageReader("G:\Sample\pics\p11.jpg").FlipVertical().Crop(0,3,180,116).ConvertToYV12()
Histogram (colordistributions, "levels")

p11.jpg的原始尺寸为180*119,想想为什么要用crop
Crop与ConvertToYV12顺序不能颠倒



最上面为亮度图,最左边Y =0,最右边Y =255,两边轻微分界线围成CCIR601区域,中间的虚线表示Y = 128 ;白色区域为该clip所具有的亮度范围和强度

中间和下面的图分别表示U(chroma)分量和V分量

现在用遮罩图片p16.jpg
引用

colordistributions=ImageReader("G:\Sample\pics\p16.jpg").FlipVertical().Crop(0,3,180,116).ConvertToYV12()
Histogram (colordistributions, "levels")

p16.jpg的原始尺寸为180*119



由于遮罩图片仅有黑白两种颜色,故只分布两边的分界线上

级别: 新手上路
注册时间:
2005-02-19
在线时间:
0小时
发帖:
31
只看该作者 10楼 发表于: 2005-02-25
动态:

按照脚本2写出:
引用

v1=avisource("G:\Sample\AVI\s09.avi").trim(125,374)
v2=AviSource("G:\Sample\AVI\s04.avi")
v3=AviSource("G:\Sample\AVI\s05.avi")
v4=Overlay(v1,v2,mode="Blend",mask=v3,pc_range=true)
v5=v4.ConvertToYV12
v6=avisource("G:\Sample\AVI\s09.avi").ConvertToYV12
v7=v6.trim(0,124)+v5+v6.trim(375,0)
return v7



看到背景有轻微白色,可以知道是mask亮度范围不够造成的(仅管pc_range开启)

注:s09.avi帧率23.976frm/s
s04.avi与s05.avi帧率都为25frm/s

查看s05.avi的亮度分布:
引用

colordistributions=AviSource("G:\Sample\AVI\s05.avi").Crop(0,6,300,240).ConvertToYV12()
Histogram (colordistributions, "levels")

s05.avi的原始尺寸为300*246



按照脚本1写出:
引用

v1=avisource("G:\Sample\AVI\s09.avi").trim(125,374).ConvertToYUY2
v2=AviSource("G:\Sample\AVI\s04.avi")
v3=AviSource("G:\Sample\AVI\s05.avi").ConvertToYUY2.ColorYUV(levels="TV->PC")
v4=Overlay(v1,v2,mode="Blend",mask=v3)
v5=v4.ColorYUV(levels="PC->TV")
v6=avisource("G:\Sample\AVI\s09.avi").ConvertToYUY2
v7=v6.trim(0,124)+v5+v6.trim(375,0)
return v7



问题解决

1.上面的ConvertToYUY2可以换为ConvertToYV12

2.如果mask本身为YUY2或YV12形式,第三行中的ConvertToYUY2或ConvertToYV12可以略去,但ColorYUV(levels="TV->PC")不能省

3.第四行v4.ColorYUV(levels="PC->TV")可以略去,不影响片段合并

级别: 新手上路
注册时间:
2005-02-19
在线时间:
0小时
发帖:
31
只看该作者 11楼 发表于: 2005-02-25
imagesequence滤镜

http://www.avisynth.org/warpenterprises/files/imagesequence_25_dll_20030507.zip

静态:

配合mask,Layer:
引用

LoadPlugin("C:\Program Files\AviSynth 2.5\plugins\imagesequence.dll")
v1=AviSource("G:\Sample\AVI\s09.avi").converttorgb32
v2=CoronaSequence("G:\Sample\pics\p15.jpg", start=0, stop=240, fps=24, textmode=0, posx=0, posy=0).converttorgb32
v3=CoronaSequence("G:\Sample\pics\p16.jpg", start=0, stop=240, fps=24, textmode=0, posx=0, posy=0).converttorgb32
v2=v2.mask(v3).FadeIO(24)
v4=trim(v1,0,119)
v5=trim(v1,120,0).Layer(v2,"add",255,460,0)
return v4+v5

CoronaSequence/ImageSequence参数说明:

start:起始帧
stop:结束帧
fps:帧率
textmode:
0=无文本,1=文件名,2=文件路径
posx:文本的水平坐标
posy:文本的垂直坐标

解说:

图片第5秒出现,显示10秒,10=240/23.976,而非10=240/24,由于用到Layer函数,因此不管图片读取的fps设为多少,最后都要强制与源文件(s09.avi)相同,所以这里的fps只要是任意自然数都可;在单纯读取图片时,fps决定了单一图片的显示时间或序列图片的运动的快慢

通过CoronaSequence或ImageSequence起始帧,结束帧以及帧率的设定可以控制图片显示时间的长短,再利用trim决定起始时间,这一点和ImageReader,ImageSource的用法是相同的

CoronaSequence与ImageSequence分别使用两个不同的库CORONA.DLL和IMGLIB.DLL,CORONA更快一些



配合Overlay:
引用

LoadPlugin("C:\Program Files\AviSynth 2.5\plugins\imagesequence.dll")
v1=avisource("G:\Sample\AVI\s09.avi").trim(120,359).ConvertToYUY2
v2=CoronaSequence("G:\Sample\pics\p15.jpg", start=0, stop=240, fps=24, textmode=0, posx=0, posy=0)
v3=CoronaSequence("G:\Sample\pics\p16.jpg", start=0, stop=240, fps=24, textmode=0, posx=0, posy=0).ConvertToYUY2.ColorYUV(levels="TV->PC")
v4=Overlay(v1,v2,mode="Blend",mask=v3)
v5=v4.ColorYUV(levels="PC->TV")
v6=avisource("G:\Sample\AVI\s09.avi").ConvertToYUY2
v7=v6.trim(0,119)+v5+v6.trim(360,0)
return v7

图片第5秒出现,显示10秒,10=(360-120)/23.975,而非10=240/24;Layer中要加入的overlay_clip的显示时间是由本身的长度所决定的,而Overlay中要加入的clip overlay在源文件clip的整个时间段都会显示,从下面的脚本就会知道这一点
引用

LoadPlugin("C:\Program Files\AviSynth 2.5\plugins\imagesequence.dll")
v1=avisource("G:\Sample\AVI\s09.avi").trim(120,0).ConvertToYUY2
v2=CoronaSequence("G:\Sample\pics\p15.jpg", start=0, stop=240, fps=24, textmode=0, posx=0, posy=0)
v3=CoronaSequence("G:\Sample\pics\p16.jpg", start=0, stop=240, fps=24, textmode=0, posx=0, posy=0).ConvertToYUY2.ColorYUV(levels="TV->PC")
v4=Overlay(v1,v2,mode="Blend",mask=v3)
v5=v4.ColorYUV(levels="PC->TV")
v6=avisource("G:\Sample\AVI\s09.avi").ConvertToYUY2
v7=v6.trim(0,119)+v5
return v7

图片第5秒出现到影片结束

所以这里stop与fps的设定不起作用,只要保证start=

级别: 新手上路
注册时间:
2005-02-19
在线时间:
0小时
发帖:
31
只看该作者 12楼 发表于: 2005-02-25
动态:

配合mask,Layer:
引用

LoadPlugin("C:\Program Files\AviSynth 2.5\plugins\imagesequence.dll")
v1=AviSource("G:\Sample\AVI\s09.avi").converttorgb32
v2=CoronaSequence("G:\Sample\pics\png\f1\f1%.2d.png", start=1, stop=12, fps=24, textmode=0, posx=0, posy=0).converttorgb32.Loop (20)
v3=CoronaSequence("G:\Sample\pics\png\f2\f2%.2d.png", start=1, stop=12, fps=24, textmode=0, posx=0, posy=0).converttorgb32.Loop (20)
v2=v2.mask(v3).FadeIO(24)
v4=trim(v1,0,119)
v5=trim(v1,120,0).Layer(v2,"add",255,0,0)
return v4+v5

这里的图片序列我选用的是前面由天使gif图分解出来的单元图及其遮罩图片序列,由于Layer函数是将要加入的overlay_clip的帧率转为原文件base_clip的帧率;而s09.avi帧率为23.976frm/s,最初分解出来的6张单元图连续正常显示的帧率为12.5frm/s,为了使动画频率不变,需要在原来的帧后面插入一次相同帧

组成新的两个图片序列:

f101.png,f102.png......f112.png

f201.png,f202.png......f212.png

都为12张图

读取序列图片的命名规则(用的是C里面的 "sprintf"命令):

有x位变动就设为%.xd,比如p0001.jpg,p0002.jpg......p0280.jpg,就写成p0%.3d.jpg

用Loop函数实现循环播放;为使Loop里前后两部分衔接流畅,start取0或1,把图片序列的数目(这里有12张)作为stop值

从第5秒开始显示;持续10秒,10=(12*20)/23.975



配合Overlay:
引用

LoadPlugin("C:\Program Files\AviSynth 2.5\plugins\imagesequence.dll")
v1=avisource("G:\Sample\AVI\s09.avi").trim(120,359).ConvertToYUY2
v2=CoronaSequence("G:\Sample\pics\png\f1\f1%.2d.png", start=1, stop=12, fps=24, textmode=0, posx=0, posy=0).Loop (20)
v3=CoronaSequence("G:\Sample\pics\png\f2\f2%.2d.png", start=1, stop=12, fps=24, textmode=0, posx=0, posy=0).Loop (20).ConvertToYUY2.ColorYUV(levels="TV->PC")
v4=Overlay(v1,v2,mode="Blend",mask=v3)
v5=v4.ColorYUV(levels="PC->TV")
v6=avisource("G:\Sample\AVI\s09.avi").ConvertToYUY2
v7=v6.trim(0,119)+v5+v6.trim(360,0)
return v7

同样这两个脚本中fps不起作用

配合ColorKeyMask:

选用旋转地球图片序列,0000.bmp,0001.bmp......0074.bmp 共74张
引用

LoadPlugin("C:\Program Files\AviSynth 2.5\plugins\imagesequence.dll")
v1=AviSource("G:\Sample\AVI\s09.avi").converttorgb32
v2=CoronaSequence("G:\Sample\pics\bmp Earth\00%.2d.bmp", start=0, stop=74, fps=24, textmode=0, posx=0, posy=0).Loop(5)
v3=v2.converttorgb32.colorkeymask($000000,50)
v4=trim(v1,120,359).Layer(v3,"add",255,0,0)
v5=v1.trim(0,119)+v4+v1.trim(360,0)
return v5

这里把Layer的范围限制到120-360(不限制会有问题,后面我会提到),并使Loop的时间((图片序列数*循环次数)/base_clip的帧率)大于显示时间

图片序列背景为纯黑色,int color定为$000000,调节"tolerance"到50



级别: 新手上路
注册时间:
2005-02-19
在线时间:
0小时
发帖:
31
只看该作者 13楼 发表于: 2005-02-25
textmode=1
引用

LoadPlugin("C:\Program Files\AviSynth 2.5\plugins\imagesequence.dll")
ImageSequence("G:\Sample\pics\imagesequence\r01.jpg", start=0, stop=640, fps=24, textmode=1, posx=60, posy=120)


显示文件名



textmode=2
引用

LoadPlugin("C:\Program Files\AviSynth 2.5\plugins\imagesequence.dll")
ImageSequence("G:\Sample\pics\imagesequence\r01.jpg", start=0, stop=640, fps=24, textmode=2, posx=10, posy=220)


显示文件地址


级别: 新手上路
注册时间:
2005-02-19
在线时间:
0小时
发帖:
31
只看该作者 14楼 发表于: 2005-02-25
讨论:

1.对RGB32形式的源(针对mask来讲),Overlay并没有使用alpha通道,需要通过ShowAlpha命令提取alpha信息,对RGB32源(如32位bmp图)建议使用ShowAlpha;p16.jpg是24位jpg图,因此没有加ShowAlpha();下面的p22.bmp是32位bmp图,但我在使用ShowAlpha()后则无图片显示?

2.下面的脚本,CoronaSequence用了colorkeymask后,发现在3个循环后图片静止停留至影片结束(对静态图片也是一样),也就是Layer将overlay_clip在120-结束都加在base_clip上,和用mask的情况不同?
引用

LoadPlugin("C:\Program Files\AviSynth 2.5\plugins\imagesequence.dll")
v1=AviSource("G:\Sample\AVI\s09.avi").converttorgb32
v2=CoronaSequence("G:\Sample\pics\bmp Earth\00%.2d.bmp", start=0, stop=74, fps=24, textmode=0, posx=0, posy=0).Loop(3)
v3=v2.converttorgb32.colorkeymask($000000,50)
v4=trim(v1,0,119)
v5=trim(v1,120,0).Layer(v3,"add",255,0,0)
return v4+v5

3.xlogo的问题比较多,对jpg,png,8位bmp,24位bmp,32位bmp都无法打开?

快速回复

限150 字节
上一个 下一个