FFmpeg常用命令

FFmpeg常用命令

改变帧率,码率和文件大小

  • 帧率
1
2
//改变视频 input.mp4 的帧率,生成帧率为30的新视频 output.mp4
ffmpeg -i input.mp4 -r 30 output.mp4
  • 码率
1
2
//改变视频 input.mp4 的帧率,生成码率为 1.5 Mb/s(兆比特)的新视频 output.mp4
ffmpeg -i input.mp4 -b 1.5M output.mp4
  • 最大输出文件大小
1
2
//改变视频 input.mp4 的文件大小,生成文件大小为10MB的新视频 output.mp4
ffmpeg -i input.mp4 -fs 10MB output.mp4

调整视频分辨率

  • 分辨率:w*h (w:像素宽度,h:像素高度)
1
2
3
4
5
6
7
8
9
10
11
//改变视频 input.mp4 的分辨率,生成分辨率为320*240的新视频 output.mp4
ffmpeg -i input.mp4 -s 320*240 output.mp4

//改变视频 input.mp4 的分辨率(使用 scale filter 替代 -s ),生成分辨率为 320*240 的新视频 output.mp4
ffmpeg -i input.mp4 -vf scale=320:240 output.mp4

//改变视频 input.mp4 的分辨率,生成分辨率为640*480的新视频 output.mp4
ffmpeg -i input.mp4 -s 640*480 output.mp4

//改变视频 input.mp4 的分辨率,生成分辨率为 vga (640*480)的新视频 output.mp4
ffmpeg -i input.mp4 -s vga output.mp4

裁剪、填充视频

  • 视频裁剪

1
2
3
4
5
6
7
8
9
10
11
//裁剪矩形框---靠左1/3
ffmpeg -i input.mp4 -vf crop=iw/3:ih:0:0 output.mp4

//裁剪矩形框---靠中1/3
ffmpeg -i input.mp4 -vf crop=iw/3:ih:iw/3:0 output.mp4

//裁剪矩形框---靠右1/3
ffmpeg -i input.mp4 -vf crop=iw/3:ih:iw/3*2:0 output.mp4

//裁剪中间的一半(默认从输入视频的中间区域开始)
ffmpeg -i input.mp4 -vf crop=iw/2:ih/2 output.mp4
  • 视频填充

1
2
3
4
5
6
7
8
9
10
//改变视频的宽高比(4:3),生成宽高比为16:9的新视频 
ffmpeg -i input -vf pad=ih*16/9:ih:(ow-iw)/2:0:color output

//改变视频的宽高比(4:3),生成宽高比为16:9的新视频(颜色默认:黑色)
ffmpeg -i input -vf pad=ih*16/9:ih:(ow-iw)/2:0 output

//改变视频的宽高比(16:9),生成宽高比为4:3的新视频
ffmpeg -i input -vf pad=iw:iw*3/4:0:(oh-ih)/2:0:color output

ffmpeg -i input -vf pad=iw:iw*3/4:0:(oh-ih)/2:0 output

翻转、旋转视频

  • 视频翻转
1
2
3
4
5
//水平翻转
ffplay -f lavfi -i testsrc -vf hflip

//垂直翻转
ffplay -f lavfi -i testsrc -vf vflip
  • 视频旋转
    参数:transpose
    0 : 逆时针方向旋转90° 并且垂直翻转
    1 : 顺时针方向旋转90°
    2 : 逆时针方向旋转90°
    3 : 顺时针方向旋转90° 并且垂直翻转
1
2
3
4
5
6
7
8
9
10
11
//逆时针方向旋转90° 并且垂直翻转
ffmpeg -i input.mp4 -vf transpose=0 output.mp4

//顺时针方向旋转90°
ffmpeg -i input.mp4 -vf transpose=1 output.mp4

//逆时针方向旋转90°
ffmpeg -i input.mp4 -vf transpose=2 output.mp4

//顺时针方向旋转90° 并且垂直翻转
ffmpeg -i input.mp4 -vf transpose=3 output.mp4

模糊、锐化视频

  • 模糊视频
1
2
3
4
5
//模糊视频 input.mp4 ,生成一个luma半径为1.5,luma权值为1的新视频 output.mp4
ffmpeg -i input.mp4 -vf boxblur=1.5:1 output.mp4

//模糊视频 input.mp4 ,生成一个luma半径为1,luma亮度为0.8,亮度阈值为0的新视频 output.mp4 (不影响图像的轮廓,使用smartblur滤波器处理)
ffmpeg -i input.mp4 -vf smartblur=5:0.8:0 output.mp4
  • 锐化视频 (unsharp 滤波器)
1
2
3
4
5
6
7
8
9
10
11
//锐化视频 input.mp4 ,生成一个新视频 output.mp4
ffmpeg -i input.mp4 -vf unsharp output.mp4

//锐化视频 input.mp4 ,生成一个 5*5的矩形luma 强度为 1 色度值为-2 的新视频 output.mp4
ffmpeg -i input.mp4 -vf unsharp=6:6:-2 output.mp4

//增强去噪 (denoise3d视频滤波器)
ffmpeg -i input.mp4 -vf mp=denoise3d output.mp4

//视频降噪 (hqdn3d过滤器)
ffmpeg -i input.mp4 -vf hqdn3d output.mp4

画中画

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//视频叠加 input1:视频背景,input2:前景图
ffmpeg -i input1 -i input2 -filter_complex overlay=x:y output

ffmpeg -i input1 -vf movie=input2[logo];[in][logo]overlay=x:y output

//视频 input.mp4 添加logo到视频左上角,生成新视频 output.mp4
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay output.mp4

//视频 input.mp4 添加logo到视频右上角,生成新视频 output.mp4
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=W-w output.mp4

//视频 input.mp4 添加logo到视频右下角,生成新视频 output.mp4
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=W-w:H-h output.mp4

//视频 input.mp4 添加logo到视频左下角,生成新视频 output.mp4
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=0:H-h output.mp4

//视频 input.mp4 添加logo(5s后显示),生成新视频 output.mp4
ffmpeg -i input.mp4 -itsoffset 5 -i logo.png -filter_complex overlay output.mp4

//视频 input.mp4 添加计时器,生成新视频 output.mp4

//生成计时器
ffmpeg -f lavfi -i testsrc -vf crop=61:52:224:94 -t 142 timer.ogg

//添加计时器到视频中
ffmpeg -i input.mp4 -i timer.ogg -filter_complex overlay=451 output.mp4

//添加计时器到视频中(将计时器缩小到原来的1/2,并放到底部)
ffmpeg -i input.mp4 -vf movie=timer.ogg,scale=15:14[tm];[in][tm] overlay=248:371 output.mp4

在视频上添加文字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//字体文件(arial.ttf)复制到当前目录下
ffplay -f lavfi -i color=c=white -vf drawtext=fontfile=arial.ttf:text=Welcome

//文字位置(x:水平方向,y:垂直方向)
//tw:文本宽度,w:帧宽,(w-tw)/2:水平居中,w-tw:文本对齐到右边
//th:文本高度,w:帧高,(h-th)/2:垂直居中,h-th:文本对齐到底部
//drawtext(滤镜):如果其中有空格,将包含在成对单引号或成对双引号中
ffplay -f lavfi -i color=c=white -vf drawtext="fontfile=arial.ttf:text='hello world':x=(w-tw)/2:y=(h-th)/2"

//fontcolor:文字颜色,fontsize:文字大小,color:背景颜色
//背景色:蓝色,字体颜色:黄色,字体大小:30
ffplay -f lavfi -i color=c=blue -vf drawtext="fontfile=arial.ttf:text='hello world':x=(w-tw)/2:y=(h-th)/2:fontcolor=yellow:fontsize=30"

//水平方向上的文字运动
//t:时间(单位:s),n:移动像素
//从右往左方向向上移动,每秒移动n个像素: x = w - t*n
//从左往右方向向上移动,每秒移动n个像素: x = w + t*n

//顶部移动
ffmpeg -f lavfi -i color=c=blue -vf drawtext="fontfile=arial.ttf:text='hello world':x=w-t*50:fontcolor=yellow:fontsize=30" output

//底部滚动
ffmpeg -f lavfi -i color=c=blue -vf drawtext="fontfile=arial.ttf:textfile=info.txt:x=w-t*50:y=h-th:fontcolor=yellow:fontsize=30" output

//垂直方向文字滚动
ffmpeg -i input.mp4 -vf drawtext="fontfile=arial.ttf:textfile=Credits:x=(w-tw)/2:y=h-t*100:fontcolor=white:fontsize=30" output.mp4

视频文件格式转化

格式(视频) 编解码器 其他数据
.avi mpeg4 mpeg4 (Simple profile), yuv420p; audio: mp3
.flv flv1 yuv420p; audio: mp3
.mkv h264 h264 (High), yuvj420p; audio: vorbis codec, fltp sample format
.mov h264 h264 (High), yuvj420p; audio: aac (mp4a)
.mp4 h264 h264 (High), yuvj420p; audio: aac (mp4a)
.mpg mpeg1video yuv420p; audio: mp2
.ogg theora yuv422p, bitrate very low; audio excluded during conversion
.ts mpeg2video yuv422p; audio: mp2
.webm vp8 yuv420p; audio: vorbis codec, fltp sample format
格式(音频) 编解码器 其他数据
.aac aac libvo_aacenc, bitrate 128 kb/s
.flac flac FLAC (Free Lossless Audio Codec), bitrate 128 kb/s
.m4a aac mp4a, bitrate 128 kb/s
.mp2 mp2 MPEG Audio Layer 2, bitrate 128 kb/s
.mp3 mp3 libmp3lame, bitrate 128 kb/s
.wav pcm_s16le PCM (Pulse Code Modulation), uncompressed
.wma wmav2 Windows Media Audio
  • 重写相同命名的输出文件
1
ffmpeg -y -i input.avi output.mp4

时间操作

1
2
3
4
5
6
7
8
9
10
11
12
13
//通过视频 input.mp4 ,生成一个时长为120s的新视频 output.mp4
ffmpeg -i input.mp4 -t 120 output.mp4

//通过视频 input.mp4 ,生成一个时长为30s帧率为25的新视频 output.mp4
ffmpeg -i input.mp4 -t 30 -r 25 output.mp4

//设置一个10分钟25fps的视频
ffmpeg -i video.avi -vframes 15000 video_10_minute.avi

//设置延迟转换 (从10s开始进行转换)
ffmpeg -i input.avi -ss 10 output.mp4
//提取媒体文件中部分内容 (提取视频第5分钟的内容)
ffmpeg -i video.avi -ss 240 -t 60 clip_5th_minute.mpg