FFMpeg常用命令

Catalogue   
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153

#格式转换
ffmpeg -i input.avi output.mp4
ffmpeg -i input.mp4 output.ts

#提取音频
ffmpeg -i input.mp4 -acodec copy -vn output.aac

#提取视频
ffmpeg -i input.mp4 -vcodec copy -an output.mp4

#视频剪切 -ss表示开始时间 -t表示长度
ffmpeg -ss 00:00:00 -t 00:00:10 -i input.mp4 -vcodec copy -acodec copy output.mp4

#码率控制 bitrate=filesize/duration,比如一个文件20.8M,时长1分钟,那么,码率就是:
biterate = 20.8M bit/60s = 20.8*1024*1024*8 bit/60s= 2831Kbps
一般音频的码率只有固定几种,比如是128Kbps,那么,video的就是:video biterate = 2831Kbps -128Kbps = 2703Kbps。
ffmpeg -i input.mp4 -b:v 2000k output.mp4
ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k output.mp4 # 官方建议加上-bufsize,用于设置码率控制缓冲器的大小
ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k -maxrate 2500k output.mp4 # -minrate -maxrate 最小最大范围

#视频编码格式转换
ffmpeg -i input.mp4 -vcodec h264 output.mp4 #使用h264编码
ffmpeg -i input.mp4 -vcodec mpeg4 output.mp4 #使用mpeg4编码

#视频大小修改
ffmpeg -i input.mp4 -vf scale=960:540 output.mp4 //ps: 如果540不写,写成-1,即scale=960:-1, 那也是可以的,ffmpeg会通知缩放滤镜在输出时保持原始的宽高比

#添加水印
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay output.mp4
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=W-w output.mp4 #右上角
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=0:H-h output.mp4 #左下角
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=W-w:H-h output.mp4 #右下角

#去掉logo
有时候,下载了某个网站的视频,但是有logo很烦,咋办?有办法,用ffmpeg的delogo过滤器。
语法:-vf delogo=x:y:w:h[:t[:show]]
x:y 离左上角的坐标
w:h logo的宽和高
t: 矩形边缘的厚度默认值4
show:若设置为1有一个绿色的矩形,默认值0。
ffmpeg -i input.mp4 -vf delogo=0:0:220:90:100:1 output.mp4

#从视频中获取指定尺寸的缩略图, -ss参数要在-i参数之前
ffmpeg.exe -ss 2672 -i input.mkv -y -f mjpeg -t 0.01 -s 96x54 U:/xiaodao/src/temp/xxx.jpg

#将gif转成mp4
ffmpeg -f gif -i origin.gif -pix_fmt yuv420p output.mp4


#使用基于GDI的抓屏设备
ffmpeg -f gdigrab -i desktop out.mpg

#从屏幕的(10,20)点处开始,抓取640x480的屏幕,设定帧率为5
ffmpeg -f gdigrab -framerate 5 -offset_x 10 -offset_y 20 -video_size 640x480 -i desktop out.mpg

#设置帧率
ffmpeg -i input.avi -r 29.97 output.mpg

#码率 ABR、CBR、VBR
ffmpeg -i film.avi -b 1.5M film.mp4
ffmpeg -i file.avi -b:v 1500k output.mp4

设置输出文件最大大小
ffmpeg -i input.avi -fs 10MB output.mp4

文件大小计算
video_size = video_bitrate * time_in_seconds / 8
如果音频没有压缩:
audio_size = sampling_rate * bit_depth * channels * time_in_seconds / 8
压缩音频的文件:
audio_size = bitrate * time_in_seconds / 8

缩放视频
ffmpeg -i input_file -s 320x240 output_file
高级缩放 scale=width:height[:interl={1|-1}]
ffmpeg -i input.mpg -vf scale=320:240 output.mp4
根据输入来设置缩放大小
ffmpeg -i input.mpg -vf scale=iw/2:ih*0.9


裁剪视频 crop=ow[:oh[:x[:y[:keep_aspect]]]]
从左上角裁剪,宽度为原始尺寸的一半,高宽跟原始尺寸一样
ffmpeg -i input -vf crop=iw/2:ih:0:0 output

移动视频 pad=width[:height[:x[:y[:color]]]]
ffmpeg -i photo.jpg -vf pad=860:660:30:30:pink framed_photo.jpg
将视频比例从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 hflip
旋转 transpose={0, 1, 2, 3}
ffplay -f lavfi -i smptebars -vf transpose=2, vflip

画中画
ffmpeg -i input1 -i input2 -filter_complex overlay=x:y output
水印在右下角
ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=W-w:H-h pair1.mp4
指定水印开始的时间
ffmpeg -i video_width_timer.mp4 -itsoffset 5 -i logo.png -filter_complex overlay timer_width_logo.mp4

修改速度
ffplay -i input.mpg -vf setpts=PTS/3
快放2倍,取值范围0.5-2.0
ffplay -i speech.mp3 -af atempo=2


创建元数据 -metadata 后面跟键值对
ffmpeg -i input -metadata artist=FFmpeg -metadata title="test" output
保存元数据到文件
ffmpeg -i video.wmv -f ffmetadata data.txt
删除元数据
ffmpeg -i input.avi -map_metadata -l output.mp4

截图
ffmpeg -i videoclip.avi -ss 01:23:45 image.jpg

获取gif动画
ffmpeg -i promotion.swf -pix_fmt rgb24 promotion.gif

根据图片创建视频
ffmpeg -loop l -i photo.jpg -t 10 photo.mp4

根据多张图片生成视频
ffmpeg -f image2 -i img%d.jpg -r 25 video.mp4

播放rtmp
ffplay "rtmp://live.hkstv.hk.lxdns.com/live/hks"

保存直播流
ffmpeg -i http://60.199.188.151/HLS/WG_ETTV-N/index.m3u8 -c:v copy -c:a copy -bsf:a aac_adtstoasc d:\cap.mp4

从视频中抽离部分生成webp
ffmpeg -t 3 -ss 00:00:01 -i ${video_path} -vf scale=320:-1 -q:v 50 -r 10 -compression_level 6 -vcodec libwebp -loop 0 ${output_path}

从视频中提取关键帧图片
ffmpeg -i video_name.mp4 -vf select='eq(pict_type\,I)' -vsync 2 -s 1920*1080 -f image2 keyframe-%02d.jpeg


计算视频的时长
ffmpeg -i source.mp4 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//

合并两个视频
实用文件的方式:
1. 编写filetext.txt文件
file ‘a.mp4’
file ‘b.mp4’
2. 执行命令
ffmpeg -f concat -i filelist.txt -c copy output.mp4
直接用命令行
ffmpeg -i “concat:a.mp4|b.mp4" -c copy output.mp4