本备忘清单是 FFmpeg 中常见视频处理操作的备忘清单
| :- | - |
|---|---|
-b bRate | 设置视频比特率(单位 kbit/s) |
-fixaspect | 固定纵横比 |
-bt tolerance | 设置视频比特率容差(单位 kbit/s) |
-maxrate bRate | 设置最大视频比特率容差(单位 kbit/s) |
-minrate bRate | 设置最小视频比特率容差(单位 kbit/s) |
-bufsize size | 设置速率控制缓冲区大小(以 kByte 为单位) |
-sameq | 使用与源相同的视频质量(意味着 VBR) |
-newvideo | 将新的视频流添加到当前输出流 |
-aspect RATIO | 纵横比(4:3、16:9 或 1.25) |
-r RATE | 每秒帧率 |
-s WIDTHxHEIGHT | 帧大小 |
-vn | 没有视频 |
-crf | 指定编码的质量,数值越大压缩越高,一般范围是 18-28 |
| :- | - |
|---|---|
-ab bRate | 设置音频比特率(单位 kbit/s) |
-aframes N | 设置要录制的音频帧数 [-frames:a 的别名] |
-aq q | 设置音频质量(特定于编解码器,VBR) [-q:a 的别名] |
-an | 禁用录音 |
-acodec codec | 设置音频编解码器。[-codec:a 的别名] 使用 'copy' 复制流。 |
-vol | 以 256 的倍数更改音频音量,其中 256 = 100%(正常)音量。例如 512 = 200% |
-newaudio | 将新的音频流添加到当前输出流 |
-alang code | 设置当前音频流的 ISO 639 语言代码(3 个字母) |
-ac nTract | 指定立体声通道数(n个声道)。例如 nTract = 2 即2个声道 |
# 从1分45秒开始剪切2分35秒
$ ffmpeg -i <input> -ss 00:01:45 -t 00:02:35 -vcodec copy -acodec copy <output>
# 从1分45秒开始剪切到第4分20秒,与上一行等效
$ ffmpeg -i <input> -ss 00:01:45 -to 00:04:20 -codec copy <output>
$ ffmpeg -ss 00:00:30 -i orginalfile.mpg -t 00:00:05 -vcodec copy -acodec copy newfile.mpg
# 从 4.5 秒开始的 5 秒长的视频
$ ffmpeg -i in.mp4 -ss 4.5 -t 5 out.mp4
提取
$ ffmpeg -i file.mp3 -f ffmetadata metadata.txt
设置
$ ffmpeg -i file.mp3 -acodec copy -metadata title="<title>" -metadata artist="<artist>" -metadata album="<album>" out.mp3
更多请查看
-map 命令用于指定索引文件,以及索引文件中流类型和它的索引
-map index:stram_type:stream_index
| :- | - |
|---|---|
input_file_index | 输入的文件索引(从 0 开始) |
stream_type | 指定文件流的类型(a -> 音频,v -> 视频,s -> 字幕) |
stream_index | 指定流类型的索引(从 0 开始) |
将第一个输入文件的第二个音频拷贝到 out.mp3
$ ffmpeg -i input.mp4 -map 0:a:1 -c copy out.mp3
将第一个输入文件的视频流和第二个输入文件的音频流拷贝到 out.mp4
$ ffmpeg -i i1.mp4 -i i2.mp4 -map 0:v -map 0:a -c copy out.mp4
反向的 map 命令(在 map 命令的参数前加负号)。例如,-map -0:a:0,忽略第一个文件中的第一个音频流。
$ ffmpeg -f avfoundation -list_devices true -i ""
一定要选择好设备,根据设备进行配置。
$ ffmpeg -hide_banner -loglevel error -stats -f gdigrab -framerate 60 \
-offset_x 0 -offset_y 0 -video_size 1920x1080 -draw_mouse 1 -i deskop \
-c:v libx264 -r 60 -preset ultrafast -pix_fmt yuv420p -y screen_record.mp4
$ ffmpeg -f avfoundation -i 1:0 -preset ultrafast out.mkv
合并多个音频,自定义背景图片,生成视频音乐
# mylist.txt >>>
file '1.mp3'
file '2.mp3'
file '3.mp3'
# OBS: 46500 = 25:50 minutes * 60 * 30fps
# echo "00:25:50" | awk -F: '{ print (($1 * 3600) + ($2 * 60) + $3) * 30 }'
$ ffmpeg -y -loop 1 -i cover.jpg -f concat -i mylist.txt -c:v libx264 -r 30 -pix_fmt yuv420p -vframes 46500 -c:a aac -b:a 192k -strict experimental -shortest output.mp4
$ ffmpeg -ss 2 -t 28 -i input.mp4 -vf "fps=10,scale=1080:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop 0 output.gif
上面有关更多信息,请参阅 StackOverflow 问题
# 转换为 GIF
$ ffmpeg -i input.mov output.gif
# 从 GIF 转换
$ ffmpeg -i input.gif output.mov
# 在非 GIF 格式之间转换
$ ffmpeg -i input.mov -codec:v copy -codec:a copy output.mp4
合并相同规格(解码/分辨率/帧率)视频
# mylist.txt >>>
file '1.mp4'
file '2.mp4'
file '3.mp4'
# 这些文件是相对路径,如使用绝对路径需要添加 `-safe 0` 参数
$ ffmpeg -f concat -i mylist.txt -c copy output.mp4
合并当前目录下所有视频
$ ffmpeg -f concat -safe 0 -i <(for f in ./*.mp4; do echo "file '$PWD/$f'"; done) -c copy output.mp4
合并不同规格视频,保证视频不变形
$ ffmpeg -i 1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts tmp1.ts
$ ffmpeg -i 2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts tmp2.ts
$ ffmpeg -i 3.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts tmp3.ts
$ ffmpeg -threads 2 -i "concat:tmp1.ts|tmp2.ts|tmp3.ts" -vf "scale=720:1080:force_original_aspect_ratio=decrease,pad=720:1080:(ow-iw)/2:(oh-ih)/2" -pix_fmt yuvj420p -shortest -y output.mp4
合并不同解码视频
$ ffmpeg -i input1.mp4 -i input2.webm -i input3.mov \
-filter_complex "[0:v:0][0:a:0][1:v:0][1:a:0][2:v:0][2:a:0]concat=n=3:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" output.mkv
合并视频并重新编码音频
$ ffmpeg -f concat -i mylist.txt -c:v copy -c:a flac -strict -2 output.mp4