FFmpeg是一个非常著名的多媒体框架开源项目,它可用于编码,解码,转码,音视频复用,音视频解复用,播放等重要功能。FFmpeg作为一个多媒体框架被各大音视频播放器软件使用于支持广泛的音视频格式,还有很多Android ROM为了提高音视频的兼容性也内置了ffmpeg。FFmpeg项目中的ffmpeg工具具有非常强大的功能,可以满足我们日常对视频裁剪,合并和编辑的需求。
作者:户锐
单位:中国移动智慧家庭运营中心
Part 01
● FFmpeg简介 ●
FFmpeg是一个非常著名的多媒体框架,它可用于编码,解码,转码,音视频复用,音视频解复用,播放等重要功能,ffmpeg采用LGPL V2.1, 其中部分可选组件采用GPL V2许可证,其官网地址:https://ffmpeg.org/。
FFmpeg作为一个多媒体框架被各大音视频播放器软件使用用于支持广泛的音视频格式,还有很多Android ROM为了提高音视频的兼容性也内置了ffmpeg,中国移动的AOS-RM操作系统也内置了ffmpeg用于提供强大的兼容性。另一方面FFmpeg项目还提供了几个重要工具,分别是ffmpeg, ffplay, ffprobe。其中ffmpeg主要用于视频编辑操作,比如转码,为视频添加背景音乐,添加特效等, ffplay工具主要用于播放音视频文件,ffprobe则用于查看音视频文件的详细信息。
Part 02
● FFmpeg工具下载和安装 ●
windows版本下载页面:
https://ffmpeg.org/download.html#build-windows
Windows版本5:
https://www.gyan.dev/ffmpeg/builds/packages/ffmpeg-5.0.1-full_build.7z
下载后解压到本地,并配置环境变量,将ffmpeg/bin路径加入到PATH中。
打开Windows命令行,输出ffmpeg%20-version,验证ffmpeg命令是否可以正常执行。
Part 03
● FFmpeg命令使用 ●
方式ffmpeg主要用于视频编辑操作,比如转码,为视频添加背景音乐,添加特效等
时间单位说明:-t 后面的时间单位为秒, -ss后面的时间格式是HH:MM:SS(时:分:秒)
3.1. 调整视频文件分辨率
命令:ffmpeg -i 输入文件名 -s 宽度*高度 输出文件名
示例:ffmpeg -i 1.mp4 -s 640*480 out.mp4
示例说明:将1.mp4文件的分辨率修改为640*480
3.2.视频文件容器格式转换
命令:ffmpeg -i 输入文件 输出文件
示例:ffmpeg -i 1.mp4 1.avi
示例说明:将mp4格式转换为avi格式
查看支持的格式:ffmpeg -formats
3.3.视频文件编码器格式转换
命令:ffmpeg -i 输入文件 -vcodec 视频格式 -acodec 音频格式输出文件
示例:ffmpeg -i 1.mp4 -vcodec hevc -acodec mp3 out.mp4
示例说明:将视频编码格式转为HEVC,音频编码格式转换为MP3
查看支持的格式:ffmpeg -codecs
3.4.多个视频合并
3.4.1.使用FFmpeg concat分离器
说明:要求编码格式一致。建议合并前将各个文件的分辨率转换为一致,否则会导致视频无法正常播放。另外使用此命令前需要先生成视频列表文件,可以手动创建也可以使用命令。
命令:ffmpeg -f concat -i 视频列表文件 -c copy 输出文件
示例:ffmpeg -f concat -i filelist.txt -c copy output.mp4
示例说明:将filelist.txt中指定的文件合并为output.mp4
在windows命令行生成filelist.txt(读取my开头的mp4文件):(for %i in (my*.mp4) do @echo file '%i') > filelist.txt
filelist.txt的内容
file 'my1.mp4'
file 'my2.mp4'
file 'my3.mp4'
3.4.2.使用FFmpeg concat协议
说明:只有特定格式的文件能连接-如:mpg或mpeg transport stream格式
命令:ffmpeg -i "concat:文件1|文件2|文件3" -c copy 输出文件
示例:ffmpeg -i "concat:1.mpg|2.mpg|3.mpg" -c copy output.mpg
ffmpeg -i "concat:1.ts|2.ts|3.ts" -c copy output.ts
示例说明:将1.mpg, 2.mpg, 3.mpg文件合并为output.mpg
3.5.多张图片转为视频
命令:ffmpeg -r 每秒图片张数 -i 图片文件名 视频文件名
示例:ffmpeg -r 3 -i %3d.jpg out.mp4
示例说明:将当前目录001.jpg到999.jpg的图片,以每秒3张图片的速度合成视频文件out.mp4
3.6.多张图片转为视频并添加背景音乐
命令:ffmpeg -r 每秒图片张数 -i 图片文件名 -i 音频文件 视频文件名
示例:ffmpeg -r 3 -i %3d.jpg -i test.mp3 out2.mp4
示例说明:将当前目录001.jpg到999.jpg的图片,以每秒3张图片的速度合成视频文件out.mp4,同时添加音频
补充:如果音频文件的长度大于视频的文件,则合成后的视频会停留在最后一个画面播放音频,此时可以加上-shortest参数,完整的命令ffmpeg -r 3 -i %3d.jpg -i test.mp3 -shortest out2.mp4
3.7.从视频中提取图片
命令:ffmpeg -i 原始视频文件 -ss 开始时间 -t 时间长度 -s 宽度*高度 -r 每秒图片张数 输出图片文件名
示例:ffmpeg -i 1.mp4 -ss 00:00:05 -t 5 -s 640*624 -r 3 %3d.jpg
示例说明:从1.mp4文件的5秒开始往后的5s内容获取640*624分辨率的图片,每秒获取3张图片,%3d.jpg表示图片的名字以001.jpg, 002,.jpg的形式存在。图片的分辨率最好和视频的分辨率一致,可以用ffproble -i 1.mp4的方式获取视频的分辨率信息。
3.8.视频文件去除音频
命令:ffmpeg -i 原始视频文件 -vcodec copy -an 去除音频后的视频文件
示例:ffmpeg -i 1.mp4 -vcodec copy -an out.mp4
示例说明:-vcodec copy表示视频编码格式不变, -an表示删除音频
3.9.视频文件添加背景音乐
命令1:ffmpeg -i 原始视频文件 -i 背景音乐文件 -filter_complex [1:a]aloop=loop=-1:size=2e+09[out];[out][0:a]amix -t 视频时间 添加背景音乐后的视频文件
示例:ffmpeg -i 1.mp4 -i test.mp3 -filter_complex [1:a]aloop=loop=-1:size=2e+09[out];[out][0:a]amix -t 10 out.mp4
示例说明:-filter_complex滤镜, [1:a]aloop=loop=-1:size=2e+09[out];将背景音无限循环, [out][0:a]amix将背景音和视频中的音频混合, -t 10文件时长,单位为秒,建议取值原始视频总时长
命令2:ffmpeg -i 原始视频文件 -stream_loop -1 -i 背景音乐文件 -filter_complex [0:a][1:a]amix -t 时长 添加背景音乐后的视频文件
示例:ffmpeg -i video.mp4 -stream_loop -1 -i test.mp3 -filter_complex [0:a][1:a]amix -t 10 out4.mp4
示例说明:-stream_loop -1 参数-1代表循环输入源(背景音乐),[0:a][1:a]amix 将0和1号的音频流进行混合, -t 10文件时长,单位为秒,建议取值原始视频总时长
3.10.视频文件替换音频
命令:ffmpeg -an -i 原始视频文件 -stream_loop -1 -i 背景音乐文件 -t 时长 输出视频文件
示例:ffmpeg -an -i 1.mp4 -stream_loop -1 -i test.mp3 -t 11 out.mp4
示例说明:将test.mp3文件添加到1.mp4中,并替换1.mp4中的原始音频
3.11.视频剪辑:保留部分片段
3.11.1.去除片头
命令:ffmpeg -ss 开始时间 -i 原始视频文件 剪辑后的视频文件
示例:ffmpeg -ss 5 -t 10 -i 1.mp4 out.mp4
示例说明:去除片头5秒的内容,保存到out.mp4
3.11.2.保留中间区域
命令:ffmpeg -ss 开始时间 -t 剪辑后的时间总长度 -i 原始视频文件 剪辑后的视频文件 时间单位为秒
示例:ffmpeg -ss 5 -t 10 -i 1.mp4 out.mp4
示例说明:获取1.mp4文件的5s开始保留10s长度的内容,保存到out.mp4
3.11.3.保留中间区域
命令:fmpeg -ss 开始时间 -i 原始视频文件 -to 结束时间 -c 剪辑后的视频文
示例:fmpeg -ss 00:00:05 -i 1.mp4 -to 00:00:10 -c copy out.mp4
示例说明:获取1.mp4文件的00:00:05到00:00:10的内容,保存到out.mp4
3.12.加快播放速度
3.12.1.视频加速
命令:ffmpeg -i 原始视频文件 -filter:v "setpts=倍速的倒数*PTS" 编辑后的视频文件
示例:ffmpeg -i test.mp4 -filter:v "setpts=0.5*PTS" output.mp4
示例说明:-filter:v "setpts=0.5*PTS"表示2倍速,0.5=1/2,取值0.25表示4倍速,取值为2时表示0.5倍慢速播放。倍速的倒数范围[0.25, 4]
3.12.2.音频加速
命令:ffmpeg -i 原始视频文件 -filter:"atempo = 倍速" -vn 编辑后的视频文件
示例:ffmpeg -i test.mp4 -filter:"atempo = 2.0" -vn output.mp4
示例说明:--filter:"atempo = 2.0"表示2倍速atempo配置区间在0.5和2.0之间, -vn表示移除视频
3.12.3.音视频同时加速
命令:ffmpeg -i 原始视频文件 -filter:v "setpts=倍速的倒数*PTS" 编辑后的视频文件
示例:ffmpeg -i test.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output2.mp4
示例说明:音频和视频都2倍速
示例2:ffmpeg -i test.mp4 -filter_complex "[0:v]setpts=0.25*PTS[v];[0:a]atempo=2.0,atempo=2.0[a]" -map "[v]" -map "[a]" output3.mp4
示例2说明:音频和视频都4倍速,由于atempo最大值为2,因此设置了两次
3.13.图片转场特效
命令:ffmpeg -loop 1 -t 时长 -i 图片文件名 -loop 1 -t 时长 -i 图片文件名 -filter_complex "xfade=transition=特效名:duration=特效时长:offset=视频做转场的起始位置,format=yuv420p" 编辑后的视频文件
示例:ffmpeg -loop 1 -t 3 -i 1.jpg -loop 1 -t 3 -i 2.jpg -filter_complex "xfade=transition=rectcrop:duration=1:offset=2,format=yuv420p" out.mp4
示例说明:要求图片1.jpg和2.jpg的分辨率一致,duration=1:offset=2表示转场效果从第2秒开始持续1秒。transition=rectcrop是转场效果,rectcrop可以修改为其他转场效果
可以用的特效参考:
https://trac.ffmpeg.org/wiki/Xfade
3.14.命令常用选项介绍
参考:
https://ffmpeg.org/ffmpeg.html