FFMPEG-Filter学习笔记-2

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012188065/article/details/88357015

本文主要介绍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.

猜你喜欢

转载自blog.csdn.net/u012188065/article/details/88357015
今日推荐