此篇文章只列举常见命令,不进行详细解释。

视频调整

裁剪视频时长

1
ffmpeg -ss 00:00:00 -t 00:00:30 -i test.mp4 -vcodec copy -acodec copy output.mp4
  • -ss 指定从什么时间开始
  • -t 指定需要截取多长时间
  • -i 指定输入文件

缩放视频

1
ffmpeg -i big.mov -vf scale=360:-1 small.mov
  • -vf 表示对视频应用 Video Filter,可应用多个 filter,中间用,隔开并用""包起来
  • 注意 sacle 值必须是偶数,这里的 -1 表示保持长宽比,根据宽度值自适应高度。如果要求压缩出来的视频尺寸长宽都保持为偶数,可以使用 -2

旋转视频

1
ffmpeg -i input.mp4 -acodec copy -vcodec libx264 -b 800k -vf transpose=1 output.mp4
  • transpose=1 表示顺时针转 90°
  • transpose=2 表示逆时针旋转90°
  • transpose=3 表示先顺时针旋转90°,再垂直翻转
  • transpose=0 表示先逆时针旋转90°,再垂直翻转

缩放视频并添加黑边

1
ffmpeg -i input.mp4  -vf "scale=640:360,pad=640:1138:0:389:black" -acodec copy -vcodec libx264 -s 640*1138 -b 2000k output.mp4
  • 将视频分辨率压缩到 640×360,再给视频加上黑边,最终视频分辨率改为 640×1138,也就是将一个横屏视频变为竖屏视频
  • pad 为 Video Filter 的一种,设置视频边框,使用方法为 pad=w:h:x:y:color
  • color 的定义见 http://ffmpeg.org/ffmpeg-utils.html

裁剪视频画面

1
ffmpeg -i input.mp4 -vf crop=500:500:100:100 -acodec copy -vcodec libx264 -f mp4 output.mp4
  • crop 为 Video Filter的一种,表示裁切画面,用法为 crop=w:h:x:y 从 (x, y) 的位置开始取 w×h 大小的画面

播放速度调整

1
ffmpeg -i input.mov -filter:v "setpts=0.5*PTS" output.mov
  • 乘 0.5 代表将原来一份视频当半份时间算,所以加快了一倍,小于 1 加速,大于 1 减速

修改帧率

1
ffmpeg -i input.mov -r 16 output.mov
  • 指定输出帧率为 16

推流一个本地 mp4 到指定地址

1
ffmpeg -re -i INPUT.mp4 -c copy -f flv rtmp://……
  • -re 表示以原生帧率读取数据。一般情况下ffmpeg会以尽可能快的速度读取数据,所以推流文件的话要加上此参数,如果是转推直播流的话,不用加此参数
  • -c copy 表示音视频保持原有编码
  • -f flv 表示输出的封装格式为 flv

拉流并保存为 mp4

1
ffmpeg -i rtmp://…… output.mp4

录屏

1
ffmpeg -f avfoundation -list_devices true -i ""
  • 使用这条命令可以查看电脑上都有哪些设备
1
2
3
4
5
[AVFoundation indev @ 0x12f604290] AVFoundation video devices:
[AVFoundation indev @ 0x12f604290] [0] FaceTime HD Camera
[AVFoundation indev @ 0x12f604290] [1] Capture screen 0
[AVFoundation indev @ 0x12f604290] AVFoundation audio devices:
[AVFoundation indev @ 0x12f604290] [0] MacBook Pro麦克风

可以看到我的电脑上视频设备有两个,0 是我电脑的摄像头,1 是我电脑的屏幕;音频设备有一个,是我电脑的麦克风

1
ffmpeg -f avfoundation -i 1 -r 30 output.mp4
  • -f avfoundation 表示从 avfoundation 采集数据
  • -i 1 表示从设备 1 取数据,1 在我的电脑上代表屏幕
  • -r 30 标识编码的帧率为 30
1
ffmpeg  -f avfoundation -i 1:0  -r 30 -c:v libx264 -crf 0 -c:a libfdk_aac -profile:a aac_he_v2 -b:a 32k  out.flv

同时录制电脑屏幕和麦克风

  • -c:v libx264 表示视频编码器选择 libx264,c 是 codec 的缩写,v 是 video 的缩写
  • -crf 0 该选项是 x264 的参数, 0 表示无损压缩
  • -c:a libfdk_aac 表示音频编码器选择 libfdk_aac
  • -profile:a aac_he_v2 是 fdk_aac 的参数。 aac_he_v2 表式使用 AAC_HE v2 压缩数据
  • -b:a 指定音频码率,b 是 bitrate 的缩写,,a是 audio 的缩写

截取视频内任意时间点的一帧图像保存为JPEG文件

1
ffmpeg -ss 00:00:16 -i input.mp4 -s 320x240 -frames:v 1 -f image2 output.jpeg
  • 从视频第 16 秒的时候截取一帧保存为分辨率为 320x240 的图片
  • -frames:v 表示选择视频轨道
  • -f image2 表示输出的封装格式,image2 是 ffmpeg 中对图片的封装格式

将一张图片转换为指定时长的视频

1
ffmpeg -loop 1 -i input.png -vcodec libx264 -b 500k -s 480*640 -r 15 -t 10 ouput.mp4
  • -loop 表示循环输入流,只工作于图像流
  • -vcodec libx264 表示选择 libx264 编码器
  • -b 500k 表示设置编码视频的比特率为 500k
  • -s 480*640 表示设置编码视频的尺寸为 480x640
  • -r 15 表示编码的帧率为 15
  • -t 10 表示编码十秒的视频

转换封装格式

1
ffmpeg -i input.mp4 -vcodec copy -acodec copy output.flv
  • -vcodec copy -acodec copy 代表不重新编码音频和视频

合并音频和视频

1
ffmpeg -i input.h264 -i input.aac -vcodec copy -acodec copy output.mp4

视频顺序拼接

首先要建一个拼接文件 input.txt,文件内容如下:

1
2
3
file '1.mp4'
file '2.mp4'
file '3.mp4'

然后执行下面的命令:

1
ffmpeg -f concat -i inputs.txt -c copy output.mp4

水印处理

1
ffmpeg -y -t 60 -i input.mp4 -i logo1.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" output.mp4
  • 60 编辑视频时长,如果填写只会处理并输出前60秒的视频,不填写会处理整个视频
  • x 水印的左上角的x坐标
  • y 水印的左上角的y坐标
  • input.mp4 输入的视频文件(需要处理的)
  • output.mp4 输出的视频文件(已经处理完成的)
  • if(gt(mod(t,20),10),W-w-10,NAN )中第二个10说logo出现的时长,即是说水印会显示10秒

实现跑马灯水印

1
ffmpeg -i input1 -i input2 -vcodec libx264 -an -filter_complex "overlay=x='if(gte(t,2), -w+(t-2)*20, NAN)':y=0" -s 320x240 output.mp4
  • input1 放在底部的视频
  • input2 放在上面的视频
  • 320x240 输出视频的宽高

实现 2 秒后 logo 从左到右移动

1
ffmpeg -i input.mp4 -vf "movie=logo.png[logo];[in][logo]overlay=x='if(gte(t\,2)\,((t-2)*80)-w\,NAN)'" output.mp4
  • 80 移动的距离,单位像素

实现 gif 格式的 logo 循环命令

1
ffmpeg -i video.mpg -ignore_loop 0 -i loop.gif -filter_complex  "[0:v][1:v]overlay=10:10:shortest=1" -vcodec mpeg2video out.mpg

实现视频添加字幕

1
ffmpeg -i input -vf drawtext=fontfile=arial.ttf:text=welcome output

实现周期显示输入的文字水印

1
ffmpeg -i input.mp4 -vf "drawtext=fontfile=font.ttf:text='testtest':x=w-100:y=100:enable=lt(mod(t\,3)\,1):fontsize=24:fontcolor=yellow@0.5:shadowy=2" output.mp4

模糊水印

1
ffmpeg -i 1.mp4 -vf "delogo=x=50:y=640:w=180:h=60:show=0" -c:a copy 2.mp4
  • show=0 水印位置没有边框,show=1 水印位置是一个绿色框覆盖
  • x y 表示水印左上角坐标
  • w h 表示水印宽高

添加图片水印

1
ffmpeg -i input_file -i watermark_file -filter_complex 'overlay=x=x坐标:y=y坐标' output_file
  • input_file 输入的视频文件
  • watermark_file 输入的图片文件
  • x 坐标和 y 坐标是图片左上角在视频上的位置

GIF 相关

将 mp4 转换成 GIF

1
ffmpeg -i small.mp4 small.gif

默认转化是中等质量模式,若要转化出高质量的 gif,可以修改比特率

1
ffmpeg -i small.mp4 -r 5 -b 2000k small.gif
  • -b 可以指定 gif 的比特率
  • -r 可以指定 gif 的帧率

裁剪视频一部分转换成 GIF

1
ffmpeg -ss 00:00:5 -t 7 -i input.mp4 -s 320x240 -f gif -r 15 output.gif

从视频中第五秒开始,截取时长为 7 秒的片段转化为大小 320x240 帧率 15 的 gif

将 GIF 转换成 mp4

1
ffmpeg -f gif -i animation.gif animation.mp4

也可以将 gif 转为其他视频格式

1
2
ffmpeg -f gif -i animation.gif animation.mpeg
ffmpeg -f gif -i animation.gif animation.webm

获取 GIF 的第 N 张图片

安装 ImageMagick

1
brew install imagemagick

提取第一帧

1
convert 'animation.gif[0]' animation-first-frame.gif

音频操作

静音视频

1
ffmpeg -i input.mov -an mute-output.mov
  • -an 代表静音

抽取视频中的音频并保存为 mp3

1
ffmpeg -i input.mp4 -acodec copy -vn out.mp3
  • -acodec copy 指定音频编码器,copy 指明只拷贝,不做编解码
  • -vn v 代表视频,n 代表 no,也就是无视频