ffmpeg命令的一般结构如下,需要注意的是全局选项影响所有输入和输出:
常用命令选项
-y 覆盖视频
-n 不覆盖视频
-i 输入
-t 时间
-vf 音频滤镜
-af 视频滤镜
-r 指定帧率(帧速率是编码成视频文件的每秒帧数)
-f 指定格式
1.视频格式转换
ffmpeg -i video.flv video.mp4
指定编码器转换格式
ffmpeg -i video.flv -c:v libx264 -c:a libfaac video.mp4
2.音视频的提取和合并
从视频中提取aac
ffmpeg -i video.mp4 -vn -acodec copy output.aac
从视频中提取h264
ffmpeg -i video.mp4 -vcodec copy -an output.h264
提取视频
ffmpeg -i test.mp4 -vcodec copy -an test2.mp4(使用流拷贝速度很快)
ffmpeg -i test.mp4 -an test2.mp4(效果同上,但是需要编码解码速度比较慢)
-an 禁用音频
-vcodec copy 拷贝视频流
提取音频为mp3
ffmpeg -i test.mp4 -vn -acodec copy testaac
ffmpeg -i test.mp4 -vn test.mp3
-vn 禁用视频流
关掉视频原声与mp3音乐合成新的视频
ffmpeg -i scenery.mp4 -i music.mp3 -map 0:v -vcodec copy -map 1:a -acodec copy video_music.mp4
3.截取视频
截取视频的 5-25秒
-ss 开始时间
-t截取时间
ffmpeg -i test.mp4 -ss 5 -t 20 t.mp4
4.视频分片
把视频切为每10秒一段
ffmpeg -i test.mp4 -c copy -map 0 -f segment -segment_time 10 video/part-%d.mp4
5.调整视频分辨率
1.通过 –s改变视频宽高
ffmpeg -i video3.mp4 -s 320*240 s.mp4
2.通过scale滤镜进行缩放
ffmpeg -i video3.mp4 -vf scale=320:240 scale.mp4
6.视频裁剪
Crop = w:h:x:y 宽度:高度:x:y(x,y如果不写则从中心裁剪)
ffmpeg -i video.mp4 -vf crop=iw/2:ih:0:0 crop.mp4
7.视频填充
填充视频意味着向视频帧添加额外的区域以包含额外的内容。当输入应在具有不同宽高比的显示器上播放时, 通常需要填充视频
ffmpeg -i test.jpg -vf pad=2*iw:2*ih:30:30 framed_photo.jpg
8.视频与图片的转换
视频转为图片
img2为图片的存储目录,img-%3d.jpg命名规则
-r帧率 -f格式
ffmpeg -i scenery.mp4 -r 2 -f image2 img2/img-%3d.jpg
将图片转换为视频
ffmpeg -f image2 -i img/img2%4d.jpg -r 25 video_img.mp4
视频生成GIFffmpeg -i video.mp4 -pix_fmt rgb24 video.gif
定时截图
ffmpeg -i video.mp4 -ss 00:00:7.43 -vframes 1 out.png
每秒生成一个张图片
ffmpeg -i scenery.mp4 -vf fps=1 out%03d.png
每分钟生成一张图片
ffmpeg -i scenery.mp4 -vf fps=1/60 out%03d.png
每个I帧生成一张图片
ffmpeg -i scenery.mp4 -vf "select='eq(pict_type,PICT_TYPE_I)'" -vsync vfr thumb%04d.png
9.水印处理 添加水印一般使用 overlay
文字水印
x:离左上角的横坐标
y: 离左上角的纵坐标
x=0:y=0 左上角
x=0:y=h-th 左下角
x=w-tw:y=0 右上角
x=w-tw:y=h-th 右下角
生成滚动文字例子
ffmpeg -y -i video.mp4 -vf drawtext=“fontfile=fonts/Medium.ttf:text=‘hello’:x=90+t*20:y=55:fontcolor=#ffffff:fontsize=25” drawtext.mp4
横向滚动 x+t*n 从左往右滚动,n越大滚动越快
x-t*n 从右边到左边滚动
垂直滚动 y+t*n
在视频右上角添加一个gif图片
http://ffmpeg.org/ffmpeg-all.html#toc-gif-1
//-ignore_loop 0 使gif循环播放
//=shortest=1使视频结束播放
ffmpeg -i tc.mp4 -ignore_loop 0 -i cat.gif -filter_complex "overlay=x=W-w:y=0:shortest=1” test.mp4
跑马灯效果
分析:如果時間大於0,那麼就開始從子內容的寬度的x-w位置開始,然後每一幀n計數,幀數n除以(背景W+子內容背景w)求餘數+1設置為x坐標,即可循環
ffmpeg -i video2.mp4 -i logo.png -filter_complex "[1:v]scale=50*50[logo];[0:v]scale=200*200[bg];[bg][logo]overlay=x='if(gte(t,0),-w+(mod(n,W+w))+5,NAN)':y=0” output.mp4
//问题,调节不了水印移动速度
添加弹幕效果
在视频中同时加入多个文字和多个图片,使用到多个滤镜就需要使用滤镜链,而指定输入输出标签就形成滤镜链图
ffmpeg -i video.mp4 -i logo.png -i logo1.png -filter_complex "[1:v]scale=30:30[img1];[2:v]scale=30:30[img2];[0:v][img1]overlay=(main_w-overlay_w)/2+t*100:(main_h-overlay_h)/2[bkg];[bkg][img2]overlay=0:0",drawtext="fontfile=fonts/Medium.ttf:text='hello':fontcolor=white:fontsize=50:x='if(between(t,2,10),150,NAN)':y=120" -y output.mp4
解析:
1.[0:v]指定流 ,0表示第0个文件,v表示操作对象里的视频信息。
2.[img1]是对scale滤镜的处理结果命名标记标签,[0:v][img1]表示将scale缩略处理后的图片覆盖到第0个文件即视频上,类似这个包含链接输入输出标记如[img1]的就组成滤镜链图filtergraphs
3.由于使用overlay添加图片水印,使用drawtext添加文字水印,这个两个滤镜间使用逗号,分割开来,组成一个滤镜链
4.overlay中t*100,表示从x轴以100的速度移动
5.x='if(between(t,2,10),150,NAN)’表示在2,10秒的区间显示字幕。if(条件,条件为true时的值,条件为false时的值)
11.视频图片的旋转
把图片旋转45度放到视频中心
ffmpeg -i scenery.mp4 -i logo.png -filter_complex "[1:v]rotate='45*PI/180:ow=hypot(iw,ih):oh=ow:c=none'[rotate];[0:v][rotate]overlay=(W-w)/2:(H-h)/2" rotate.mp4 -y
解析
c=none这样就不会出现黑色背景
ow=hypot(iw,ih):hypot(x, y) 计算斜边(直角三角形最长边)等效于sqrt(xx + yy),如果不设置ow,oh则旋转之后溢出边框部分之间被裁剪掉了
在旋转角度中加入t参数即可实现随着时间而旋转 rotate='2*PI*t
ffmpeg -i scenery.mp4 -filter_complex "rotate='2*PI*t:ow=min(iw,ih)/sqrt(2):oh=ow:c=none’” test.mp4