FFmpeg使用方法

官方文档:ffmpeg Documentation

查看支持的硬件加速方法

ffmpeg -hwaccels
结果包含:
Hardware acceleration methods:
cuda
dxva2
qsv
d3d11va
opencl
vulkan

GPU加速转换视频

ffmpeg -y -vsync 0 -hwaccel cuda -i input.mp4 -vf scale=960:-1 -c:a copy -c:v h264_nvenc -b:v 10M output.mp4
-y 若输出文件存在则覆盖
-vsync 0 passthrough: 时间戳不做任何改变,demuxer中是什么,直接传给muxer
-hwaccel cuda 使用cuda硬件加速
-i input.mp4 输入视频文件
-vf scale=960:-1 改变视频尺寸,-1表示按比例变化
-c:a分别代表视频,音频格式,copy代表原视频格式
-c:v h264_nven NVIDIA硬件解码
-b:v 10M 输出视频码率单位K,M

改变视频音频速度

视频速度提高一倍,音频不变,多余帧丢弃
ffmpeg -i input.mkv -filter:v "setpts=0.5*PTS" output.mkv
视频速度提高一倍,音频不变,提高帧率避免丢帧(如原来30帧提高到60帧)
ffmpeg -i input.mkv -r 60 -filter:v "setpts=0.5*PTS" output.mkv
滤波器通过改变每个视频帧的呈现时间戳(PTS)来工作,如果要降低速度,则使用大于1的PTS。
音频速度提高一倍,视频不变
ffmpeg -i input.mkv -filter:a "atempo=2.0" -vn output.mkv
atempo过滤器限于使用介于0.5和2.0之间的值(因此它可以将其减慢到不小于原始速度的一半,并且速度不超过输入的两倍)。如果你需要,你可以通过串联多个atempo过滤器来克服这个限制,如:
ffmpeg -i input.mkv -filter:a "atempo=2.0,atempo=2.0" -vn output.mkv
使用复杂的滤镜,同时加速视频和音频
ffmpeg -i input.mkv -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mkv

合并多个视频

使用 FFmpeg concat 分离器
这种方法成功率很高,也是最好的,但是需要 FFmpeg 1.1 以上版本
先创建一个文本文件 filelist.txt:
file 'input1.mkv'
file 'input2.mkv'
file 'input3.mkv'
……
命令:
ffmpeg -f concat -i filelist.txt -c copy output.mkv
注意:
输出文件的扩展名必须与输入文件相同。
使用 FFmpeg concat 分离器时,如果文件名有奇怪的字符,要在 filelist.txt 中转义。

合并视频和音频

视频中不包含音频,并且视频和音频长度相同
ffmpeg -i video.mp4 -i audio.mp3 -vcodec copy -acodec aac -strict experimental output.mp4
视频中包含音频,用新的音频替换原音频
ffmpeg -i video.mp4 -i audio.mp3 -vcodec copy -acodec aac -strict experimental -map 0:v:0 -map 1:a:0 output.mp4
视频和音频长度不同,视频短于音频,-ss指定音频开始时间,用视频长度截取音频
ffmpeg -i video.mp4 -ss 00:04:00 -i audio.mp3 -vcodec copy -acodec aac -shortest output.mp4
视频和音频长度不同,音频短于视频,-ss指定音频开始时间,添加静默填充
ffmpeg -i video.mp4 -ss 00:04:00-i audio.mp3 -vcodec copy -acodec aac -af apad -shortest output.mp4

视频转换为GIF

ffmpeg -ss 10 -t 5 -i input.mp4 -vf "fps=24,scale=320:-1:flags=lanczos,format=rgb24,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop 0 output.gif
-ss 起始时间;-t 持续时间;fps 输出帧率;scale 输出尺寸;flags 缩放方法

序列图片转换为视频

首先对序列图片进行重命名,文件名中需要有数字序列标记图片的先后顺序,如pic01.jpg、pic02.jpg……pic**.jpg。
按照默认参数将序列图片转换为视频,默认视频帧率25fps,采用h264编码,图片原始分辨率。
ffmpeg -f image2 -i pic%d.jpg -profile:v high -level 3.0 -pix_fmt yuv420p output.mp4
%d为数字占位符,前导零填充如001、002、003可以表示为%03d,它与 C printf 函数支持的语法相同。
常用参数:
-r 调整帧率
需要注意-r参数的位置,在-i pic%d.jpg前面和在后面的效果是不一样的。放在-i后面只会改变输出的视频帧率,而输入的还是默认值25 ,例如ffmpeg -f image2 -i pic%d.jpg -r 10 output.mp4,会先按照25fps生成视频,但视频的播放帧率会减小到10fps。
-b:v 调整视频码率
改变码率会影响到视频清晰度,但并不意味着高码率的视频一定比低码率的视频清晰度更高,这还取决于视频编码格式,比如h265编码可以用更小的码率生成h264同等的视频质量,av1、v8、v9等编码也优于h264。
-crf 调整视频质量
用以平衡视频质量和文件大小的参数,FFMPEG里取值范围为0-51,取值越高内容损失越多,视频质量更差。 ffmpeg的默认值是23,建议的取值范围是17-28。
-c:v 调整视频的编码格式
目前ffmpeg针对于mp4默认使用的是h264,可以使用-c:v libx265生成同等质量,但文件更小的h265视频。也可以使用-c:v libvpx -c:v libvpx-vp9分别生成v8和v9编码的webm文件。
-vf scale 调整视频分辨率
使用-s 640x480会将视频直接调整为640x480的分辨率,如果原始图片不是4:3会对原始图像做拉伸变形。可以使用下面的命令等比例缩放
-vf scale=640:-1        固定宽度进行等比例缩放
-vf scale=-1:480        固定高度进行等比例缩放
以上几个参数不仅限于图片转视频,视频转视频时也可以使用。

提取音频

提取音频且不对其进行重新编码
ffmpeg -i videoWithAudio.mp4 -vn -acodec copy onlyAudio.aac
提取音频并重新编码
ffmpeg -i videoWithAudio.mp4 -vn -c:a libmp3lame -q:a 1 onlyAudio.mp3
该命令从视频中提取音频,然后使用libmp3lame将音频编码为不同的质量,并将其存储为mp3文件。
-q:a表示质量(在LAME文档中定义[1]),质量分布范围为0~6,其中0表示高质量音频,6表示低质量音频。
截取音频片段
ffmpeg -i input.mp3 -ss 00:00:10 -t 00:00:10 output.mp3
-ss 起始时间;-t 持续时间;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容