第五部分 裁剪/填充视频
裁剪视频crop filter
从输入文件中选取你想要的矩形区域到输出文件中,常见用来去视频黑边。
- 语法:
crop:ow[:oh[:x[:y:[:keep_aspect]]]]
- 1.举例
1.1.裁剪输入视频的左三分之一,中间三分之一,右三分之一:
ffmpeg -i input -vf crop=iw/3:ih :0:0 output
ffmpeg -i input -vf crop=iw/3:ih :iw/3:0 output
ffmpeg -i input -vf crop=iw/3:ih :iw/3*2:0 output
1.2.裁剪帧的中心
当我们想裁剪区域在帧的中间时,裁剪filter可以跳过输入x和y值,他们的默认值是
Xdefault = ( input width - output width)/2
Ydefault = ( input height - output height)/2
ffmpeg -i input_file -v crop=w:h output_file
1.3.裁剪中间一半区域:
ffmpeg -i input.avi -vf crop=iw/2:ih/2 output.avi
- 2.举例
2.1比较裁剪后的视频和源视频比较
ffplay -i jidu.mp4 -vf split[a][b];[a]drawbox=x=(iw-300)/2:(ih-300)/2:w=300:h=300:c=yellow[A];[A]pad=2*iw[C];[b]crop=300:300:(iw-300)/2:(ih-300)/2[B];[C][B]overlay=w*2.4:40
2.2自动检测裁剪区域
cropdetect filter 自动检测黑边区域
ffplay jidu.mp4 -vf cropdetect
2.3然后用检测到的值来裁剪视频
ffplay jidu.mp4 –vf crop=672:272:0:54
填充视频(pad)
在视频帧上增加一快额外额区域,经常用在播放的时候显示不同的横纵比
- 语法:
pad=width[:height:[:x[:y:[:color]]]]
- 举例
1.创建一个30个像素的粉色宽度来包围一个SVGA尺寸的图片:
ffmpeg -i photo.jpg -vf pad=860:660:30:30:pink framed_photo.jpg
2.同理可以制作testsrc视频用30个像素粉色包围视频
ffplay -f lavfi -i testsrc -vf pad=iw+60:ih+60:30:30:pink
3.?4:3到16:9
一些设备只能播放16:9的横纵比,4:3的横纵比必须在水平方向的两边填充成16:9,高度被保持,宽度等于高度乘以16/9,x(输入文件水平位移)值由表达式(output_width - input_width)/2来计算。
4:3到16:9的通用命令是:
ffmpeg -i input -vf pad=ih*16/9:ih :(ow-iw)/2:0:color output
这里写代码片
举例
ffplay -f lavfi -i testsrc -vf pad=ih*16/9:ih:(ow-iw)/2:0:pink
4.16:9到4:3
为了用4:3的横纵比来显示16:9的横纵比,填充输入文件的垂直两边,宽度保持不变,高度是宽度的3/4,y值(输入文件的垂直偏移量)是由一个表达式(output_height-input_height)/2计算出来的。
16:9到4:3的通用命令:
ffmpeg -i input -vf pad=iw :iw*3/4:0:(oh-ih)/2:color output
举例
ffplay -f lavfi -i testsrc=size=320x180 -vf pad=iw:iw*3/4:0:(oh-ih)/2:pink
第六部分 翻转和旋转
翻转
- 水平翻转语法: -vf hflip
ffplay -f lavfi -i testsrc -vf hflip
- 垂直翻转语法:-vf vflip
ffplay -f lavfi -i testsrc -vf vflip
旋转
语法:transpose={0,1,2,3}
0:逆时针旋转90°然后垂直翻转
1:顺时针旋转90°
2:逆时针旋转90°
3:顺时针旋转90°然后水平翻转
第七部分 模糊,锐化
模糊
- 语法:
boxblur=luma_r:luma_p[:chroma_r:chram_p[:alpha_r:alpha_p]]
ffplay -f lavfi -i testsrc -vf boxblur=1:10:4:10
**注意:**luma_r和alpha_r半径取值范围是0~min(w,h)/2, chroma_r半径的取值范围是0~min(cw/ch)/2
锐化
- 语法:-vf
unsharp=l_msize_x:l_msize_y:l_amount:c_msize_x:c_msize_y:c_amount
所有的参数是可选的,默认值是5:5:1.0:5:5:0.0
l_msize_x:水平亮度矩阵,取值范围3-13,默认值为5
l_msize_y:垂直亮度矩阵,取值范围3-13,默认值为5
l_amount:亮度强度,取值范围-2.0-5.0,负数为模糊效果,默认值1.0
c_msize_x:水平色彩矩阵,取值范围3-13,默认值5
c_msize_y:垂直色彩矩阵,取值范围3-13,默认值5
c_amount:色彩强度,取值范围-2.0-5.0,负数为模糊效果,默认值0.0
- 举例
使用默认值,亮度矩阵为5x5和亮度值为1.0
ffmpeg -i input -vf unsharp output.mp4
高斯模糊效果(比较强的模糊):
ffplay -f lavfi -i testsrc -vf unsharp=13:13:-2
第八部分 覆盖(画中画)
覆盖
- 语法:
overlay[=x[:y]
所有的参数都是可选,默认值都是0 - 1举例
Logo在左上角
ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay pair1.mp4
- 2举例
Logo右上角:
ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=W-w pair2.mp4
左下角:
ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=0:H-h pair2.mp4
右下角:
ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=W-w:H-h pair2.mp4
删除logo
语法:-vf delogo=x:y:w:h[:t[:show]]
x:y 离左上角的坐标
w:h logo的宽和高
t: 矩形边缘的厚度默认值4
show:若设置为1有一个绿色的矩形,默认值0.
ffplay -i jidu.mp4 -vf delogo=50:51:60:60:100:0
第九部分 添加文本
添加文本
- 语法:
drawtext=fontfile=font_f:text=text1[:p3=v3[:p4=v4[…]]]
常用的参数值
x:离左上角的横坐标
y: 离左上角的纵坐标
fontcolor:字体颜色
fontsize:字体大小
text:文本内容
textfile:文本文件
t:时间戳,单位秒
n:帧数开始位置为0
draw/enable:控制文件显示,若值为0不显示,1显示,可以使用函数
简单用法
1、在左上角添加Welcome文字
ffplay -f lavfi -i color=c=white -vf drawtext=fontfile=arial.ttf:text=Welcom
2、在中央添加Good day
ffplay -f lavfi -i color=c=white -vf drawtext=”fontfile=arial.ttf:text=’Goodday’:x=(w-tw)/2:y=(h-th)/2”
3、设置字体颜色和大小
ffplay -f lavfi -i color=c=white -vf drawtext=”fontfile=arial.ttf:text=’Happy Holidays’:x=(w-tw)/2:y=(h-th)/2:fontcolor=green:fontsize=30”
动态文本1
用 t (时间秒)变量实现动态文本
1、顶部水平滚动
ffplay -i jidu.mp4 -vf drawtext="fontfile=arial.ttf:text='Dynamic RTL text':x=w-t*50:fontcolor=darkorange:fontsize=30"
2、底部水平滚动
ffplay -i jidu.mp4 -vf drawtext="fontfile=arial.ttf:textfile=textfile.txt:x=w-t*50:y=h-th:fontcolor=darkorange:fontsize=30"
3、垂直从下往上滚动
ffplay jidu.mp4 -vf drawtext="textfile=textfile:fontfile=arial.ttf:x=(w-tw)/2:y=h-t*100:fontcolor=white:fontsize=30“
想实现右上角显示当前时间?
动态文本2
1.在右上角显示当前时间 localtime
ffplay jidu.mp4 -vf drawtext="fontfile=arial.ttf:x=w-tw:fontcolor=white:fontsize=30:text='%{localtime\:%H\\\:%M\\\:%S}'“
2.每隔3秒显示一次当前时间
ffplay jidu.mp4 -vf drawtext="fontfile=arial.ttf:x=w-tw:fontcolor=white:fontsize=30:text='%{localtime\:%H\\\:%M\\\:%S}':enable=lt(mod(t\,3)\,1)"
第十部分 图片处理
图片支持
FFmpeg支持绝大多数图片处理, 除LJPEG(无损JPEG)之外,其他都能被解码,除了EXR,PIC,PTX之外,所有的都能被编码。
1.截取一张图片使用 –ss(seek from start)参数.
ffmpeg -ss 01:23:45 -i jidu.mp4 image.jpg
2.从视频中生成GIF图片
ffmpeg -i jidu.mp4 -t 10 -pix_fmt rgb24 jidu.gif
3.转换视频为图片(每帧一张图)
ffmpeg -i clip.avi frame%4d.jpg
4.图片转换为视频
ffmpeg -f image2 -i img%4d.jpg -r 25 video.mp4
裁剪、填充
和视频一样,图片也可以被裁剪和填充
1.裁剪
ffmpeg -f lavfi -i rgbtestsrc -vf crop=150:150 crop_rg.png
2.填充
ffmpeg -f lavfi -i smptebars -vf pad=360:280:20:20:orange pad_smpte.jpg
翻转,旋转,覆盖
和视频一样图片同样能翻转,旋转和覆盖
1.翻转
ffmpeg -i orange.jpg -vf hflip orange_hfilp.jpg
ffmpeg -i orange.jpg -vf vflip orange_vfilp.jpg
2.旋转
ffmpeg -i image.png -vf transpose=1 image_rotated.png
3.覆盖
ffmpeg -f lavfi -i rgbtestsrc -s 400x300 rgb .png
ffmpeg -f lavfi -i smptebars smpte.png
ffmpeg -i rgb .png -i smpte.png -filter_complex overlay= (W-w)/2:(H-h)/2 rgb_smpte.png
第十一部分 其他高级技巧
屏幕录像
1.显示设备名称
ffmpeg -list_devices 1 -f dshow -i dummy
2.调用摄像头
ffplay -f dshow -i video="Integrated Camera"
3.保存为文件
ffmpeg -y -f dshow -s 320x240 -r 25 -i video="Integrated Camera" -b:v 800K -vcodec mpeg4 new.mp4
4.添加字幕subtitles
语法 –vf subtitles=file
ffmpeg -i jidu.mp4 -vf subtitles=rgb.srt output.mp4
视频颤抖、色彩平衡
1.视频颤抖
ffplay –i jidu.mp4 -vf crop=in_w/2:in_h/2:(in_w-out_w)/2+((in_w-out_w)/2)*sin(n/10):(in_h-out_h)/2 +((in_h-out_h)/2)*sin(n/7)
2.色彩平衡
ffplay -i jidu.mp4 -vf curves=vintage
3.色彩变幻
ffplay -i jidu.mp4 -vf hue="H=2*PI*t: s=sin(2*PI*t)+1“
4.彩色转换黑白
ffplay -i jidu.mp4 -vf lutyuv="u=128:v=128"
设置音频视频播放速度
1.@3倍视频播放视频
ffplay -i jidu.mp4 -vf setpts=PTS/3
2.@?速度播放视频
ffplay -i jidu.mp4 -vf setpts=PTS/(3/4)
3.@2倍速度播放音频
ffplay -i speech.mp3 -af atempo=2
问题:视频和音频同时3/4慢速播放
截图
1.每隔一秒截一张图
ffmpeg -i input.flv -f image2 -vf fps=fps=1 out%d.png
2.每隔20秒截一张图
ffmpeg -i input.flv -f image2 -vf fps=fps=1/20 out%d.png
**注意:**ffmpeg version N-57961-gec8e68c版本最多可以每隔20s截一张图。
3.多张截图合并到一个文件里(2x3) ?每隔一千帧(秒数=1000/fps25)即40s截一张图
ffmpeg? -i jidu.mp4 -frames 3 -vf "select=not(mod(n\,1000)),scale=320:240,tile=2x3" out.png
马赛克视频
1.马赛克视频
用多个输入文件创建一个马赛克视频:
ffmpeg -i jidu.mp4 -i jidu.flv -i "Day By Day SBS.mp4" -i "Dangerous.mp4" -filter_complex "nullsrc=size=640x480 [base]; [0:v] setpts=PTS-STARTPTS, scale=320x240 [upperleft]; [1:v] setpts=PTS-STARTPTS, scale=320x240 [upperright]; [2:v] setpts=PTS-STARTPTS, scale=320x240 [lowerleft]; [3:v] setpts=PTS-STARTPTS, scale=320x240 [lowerright]; [base][upperleft] overlay=shortest=1 [tmp1]; [tmp1][upperright] overlay=shortest=1:x=320 [tmp2]; [tmp2][lowerleft] overlay=shortest=1:y=240 [tmp3]; [tmp3][lowerright] overlay=shortest=1:x=320:y=240" -c:v libx264 output.mkv
Logo动态移动
1、2秒后logo从左到右移动:
ffplay -i jidu.mp4 -vf movie=logo.png[logo];[in][logo]overlay=x='if(gte(t\,2)\,((t-2)*80)-w\,NAN)':y=0
2、2秒后logo从左到右移动后停止在左上角
ffplay -i jidu.mp4 -vf movie=logo.png[logo];[in][logo]overlay=x='if(gte(((t-2)*80)-w\,W)\,0\,((t-2)*80)-w)':y=0
3、每隔10秒交替出现logo。
ffmpeg -y -t 60 -i jidu.mp4 -i logo.png -i logo2.png -filter_complex "overlay=x=if(lt(mod(t\,20)\,10)\,10\,NAN ):y=10,overlay=x=if(gt(mod(t\,20)\,10)\,W-w-10\,NAN ) :y=10" overlay.mp4
资料
FFmpeg官网: http://www.ffmpeg.org
FFmpeg doc : http://www.ffmpeg.org/documentation.html
FFmpeg wiki : https://trac.ffmpeg.org/wiki
FAQ
Thanks!
FFmpeg基础: http://wenku.baidu.com/view/296eefcaf90f76c661371af1.html