本文主要介绍video filter 的用法
Video Filter
10.1 alphaextract - 提取 alpha通道的filter
毋庸置疑,这个filter用于提取alpha通道的,当然只针对有alpha的视频才起作用,
即颜色格式为 rgba, yuva422p等格式的视频,
我们一般使用ffmpeg命令将码流转码为带alpha通道的颜色格式码流
但一般alpha均为255,使用 ffplay -i test.avi -vf alphaextract
播放时,整个画面是白的
为了体现alpha的用处,我们可以 lumakey filter 转一个alpha通道有变化的视频,如下:
ffmpeg -i linmeimei.rm -vf "lumakey=threshold=0:tolerance=100:softness=20" -pix_fmt rgba -vcodec rawvideo -f avi softness_20_lin.avi
我们使用 alphaextract filter播放 softness_20_lin.avi视频时,对比原视频如下效果:
播放命令如下:
ffplay -i softness_20_lin.avi -vf “split[0][1];[1]alphaextract[2];[0][2]hstack”
此filter一般与 接下来的 alphamerge filter配合使用
10.2 alphamerge
ffmpeg -y -i softness_20_21_i_352x288.avi -i softness_20_lin.avi -filter_complex “[1:v]alphaextract[tmp];[0:v][tmp]alphamerge[outv]” -map [outv] alphamerge.avi
使用两个带alpha通道的视频,将其中后者的alpha放置于前者中,得到如下效果:
简单来看,就是透明的地方变的不再透明,大概就是这一个功能吧
softness_20_21_i_352x288.avi 视频也是通过命令
lumakey=threshold=0:tolerance=100:softness=20 做出来的
当然,要保证两个视频拥有同样的宽高。
10.3 amplify
放大当前帧像素与附近帧对应像素的差异
10.157 reverse
翻转一个视频片段。
即逆序播放一个视频,这个filter比较好玩,例如,地上的水可以回到瓶子里,破碎的杯子可以重新聚集到一起……
注意ffmpeg中,此filter的逻辑是,将视频所有的帧全部解码后,做reorder处理
保证最后的帧最先输出。
所以,一定要与 trim filter 结合使用,否则不仅仅是占内存的问题,是压根没有输出的问题。
(因为内部avfilter中, av_buffersink_get_frame_flags 接口压根不返回新的帧)。
如 逆序播放林妹妹视频的前10s。
ffplay -i linmeimei.rm -vf “trim=duration=10,reverse”
也可以将林妹妹视频的前十秒逆序输出保存到文件中,最好使用 -an 选项禁掉视频吧,否则音视频不同步太难受了。
ffmpeg -i linmeimei.rm -vf “trim=duration=10,reverse” -an -f mp4 reverse.mp4
10.197 trim
裁剪视频片段
参数如下:
1,start/end
设置裁剪的起止时间,以秒为单位。
filter内部会根据AVStream中的time_base将start/end转换成time_base为单位的时间,
每一帧的pts与 start/end比较, 决定是否drop
如直接播放林妹妹的第5s–10s片段
ffplay -i linmeimei.rm -vf "trim=start=5:end=10"
2,start_pts/end_pts,
设置裁剪的起止时间,以AVStream中的time_base为单位.
每一帧的pts与 start_pts/end_pts做比较,决定是否drop
3, duration
设置最大的裁剪时间,以秒为单位
注意,ffplay命令使用 trim与reverse时,设置duration的值不能超越视频的时长,
因为ffplay播放时,会根据frame的pts与duration判断,pts不超过duration的情况下,ffmpeg认为还没有reverser完成,不能直接输出播放。
如使用如下命令,不会出现画面(因为此视频的时长为45s)
ffplay -i linmeimei.rm -vf "trim=duration=100,reverse"
使用ffmpeg命令转码时没有这个限制
4、start_frame/end_frame, 设置trim的起止帧数
如只播放林妹妹的前120帧。
ffplay -i linmeimei.rm -vf “trim=start_frame=0:end_frame=120”
trim filter内部有一计数器,nb_frames,每来一帧便加1,start_frame/end_frame与此值比较来决定是否drop.