FFmpeg简介
FFmpeg是一个完整的跨平台解决方案,用于录制,转换和流式传输音频和视频。
很多视频播放器和格式工厂都是基于FFmpeg。
耻辱柱事件
许多播放器使用了FFmpeg的代码或模块但没有遵守LGPL/GPL协议,FFmpeg将许多不遵守协议的播放器发布在其官网页面上,名为Hall Of Shame,故称为耻辱柱事件,其页面现已停止更新。
涉及耻辱柱事件的播放器包括国内的暴风影音、QQ影音,甚至还有著名的KMplayer和Potplayer
FFmpeg命令
通用参数
显示详细信息
ffmpeg -v verbose ......
隐藏版权信息
防止 ffmpeg 输出其版权声明、构建选项和库版本
ffmpeg -hide_banner ......
截取视频
-ss 开始时间 -to 结束时间 -t 持续时间
-c copy 不重新编码,否则默认重新编码
“文件名"防止文件名含空格出错
ffmpeg -hide_banner -i "xx.mp4" -ss 00:03:40 -to 00:16:38 -c copy "yy.mp4"
ffmpeg -hide_banner -i "xx.mp4" -ss 00:03:40 -t 00:00:05 -c copy "yy.mp4"
提取音频
从视频中提取音频,例如mp4提取音频一般为aac,某些格式可能会报错
ffmpeg -hide_banner -i "xx.mp4" -vn "yy.acc"
提取视频
从视频中只保留视频而不保留音频
ffmpeg -hide_banner -i "xx.mp4" -an "yy.mp4"
添加字幕
通过ffmpeg为视频添加字幕。 disposition:s:0 default设置为默认字幕,不能一次-i多个字幕
# mp4添加软字幕
ffmpeg -hide_banner -i infile.mp4 -i infile.srt -c copy -c:s mov_text outfile.mp4
# mkv添加软字幕
ffmpeg -hide_banner -i input.mkv -i subtitles.srt -c copy output.mkv
# 硬字幕
ffmpeg -hide_banner -i end_font.mp4 -vf subtitles=words.srt -y output.mp4
# mkv添加默认软字幕
ffmpeg -hide_banner -i input.mkv -i subtitles.srt -c copy -disposition:s:0 default output.mkv
修改分辨率
将分辨率缩小到960x540
ffmpeg -hide_banner -i input.mp4 -vf scale=960:540 output.mp4
添加图片
可以用于给视频添加logo
# 将图片添加到视频中,默认在左上角
ffmpeg -hide_banner -i input.mp4 -i logo.png -filter_complex overlay output.mp4
# 右上角
ffmpeg -hide_banner -i input.mp4 -i logo.png -filter_complex overlay=W-w output.mp4
# 左下角
ffmpeg -hide_banner -i input.mp4 -i logo.png -filter_complex overlay=0:H-h output.mp4
# 右下角
ffmpeg -hide_banner -i input.mp4 -i logo.png -filter_complex overlay=W-w:H-h output.mp4
局部打码
可用于一些网站logo打码
# 语法:-vf delogo=x:y:w:h[:t[:show]]
ffmpeg -hide_banner -i input.mp4 -vf delogo=0:0:220:90:100:1 output.mp4
视频拼接
ffmpeg -hide_banner -i "concat:input1.mpg|input2.mpg|input3.mpg" -c copy output.mpg
音视频合成
如果音频比视频长,就会停在最后一帧继续播放音频
ffmpeg -hide_banner -i a.wav -i a.avi out.avi
测试视频
用于测试视频是否正常,不输出保存到文件
ffmpeg -hide_banner -i input -f null -
视频管道(pipe)
可能会报错,而且pipe输出无法用于某些格式(mp4,mov)(Note that some formats (typically MOV), require the output protocol to be seekable, so they will fail with the pipe output protocol.)
# pipe in
cat test.wav | ffmpeg -i pipe:0
#pipe out
ffmpeg -i test.wav -f avi pipe:1 | cat > test.avi
录制视频
略
记录命令耗时(linux)
time ffmpeg ......
查看支持的编解码器
ffmpeg -hide_banner -decoders #编码器
ffmpeg -hide_banner -encoders #解码器
ffmpeg -hide_banner -decoders|grep qsv #qsv解码器 windows 把grep换成sls
ffmpeg -hide_banner -h encoder=hevc_qsv #hevc_qsv编码器参数
参考资料
制作动图
- gif支持最广泛,像素只有8bit,最多只有256种颜色
- apng,24-bit图像以及透明通道
- webp:谷歌推出,技术较新,压缩率是最高,静图+动图,近年来B站、微信等平台有使用
- 大小:WebP < APNG < GIF
- 质量:WebP = APNG > GIF
- 性能:WebP > APNG > GIF
视频转gif
s分辨率,r帧率,sn无字幕 华为手机相册缩略图中可能发黄,分辨率有关?
ffmpeg -hide_banner -ss 00:04:23.570 -to 00:04:27.180 -i "xx.mp4" " yy.gif"
ffmpeg -hide_banner -ss 00:04:23.570 -to 00:04:27.180 -i "xx.mp4" -s 320x180 -r 15 "yy.gif"
# 分辨率:1920x1080 / 1.5 = 1280x720 1280x720和1280*720都可
视频转apng
如果不加其他参数控制质量,生成的文件大小非常感人
ffmpeg -hide_banner -ss 00:04:23.570 -to 00:04:27.180 -i "xx.mp4" -plays 0 " yy.apng"
# 这里不是loop而是plays
参考资料
视频转webp
ios14后支持?ios 14 webp动图有坑 华为手机相册中不动……可能等鸿蒙3的安卓12再看看?
ffmpeg -hide_banner -ss 00:04:23.570 -to 00:04:27.180 -i "xx.mp4" -loop 0 " yy.webp"
# -lossless 1 无损,文件会非常大
# -q 0-100 质量,默认75,上次用的85,质量100大小也远比无损小......
参考资料
其他资料
FFmpeg转码与硬件加速
软件编码:使用cpu,慢,效果好,体积较小,字幕组都是用软压 硬件编码:使用gpu,快,效果差,体积较大
Intel QSV无法二次编码,NVIDIA NVENC可
Intel QSV 硬件加速
英特尔® 快速视频同步技术(Intel Quick Sync Video),常用于英特尔带核显的CPU, 以及近几年因特尔推出的独显。
维基百科 因特尔GPU发布时间与架构 查看硬件架构支持列表及文档 利用ffmpeg+QSV进行视频处理
安装
Arch Linux 可能需要手动安装intel-media-sdk以启用qsv
pacman -S intel-media-sdk
h264
略
资料
h265/hevc
软编h265 crf控制码率
-crf 23
qsv硬编h265 icq控制码率
hevc_qsv无crf,推荐icq, h264_qsv推荐la_icq
... -global_quality 20
软解软编 264->265
ffmpeg -hide_banner -i "xx.mp4" -c:v libx265 -crf 23 -c:a copy "yy.mp4"
qsv软解硬编 264->265
ffmpeg -hide_banner -c:v h264_qsv -i "xx.mp4" -c:v hevc_qsv -global_quality 20 -c:a copy "yy.mp4"
h264_qsv解码器兼容性不好,对于部分h264会报错,改用软解即可
qsv硬解硬编 264->265
ffmpeg -hide_banner -hwaccel qsv -c:v h264_qsv -i "xx.mp4" -c:v hevc_qsv -global_quality 20 -c:a copy "yy.mp4"
qsv硬解软编 264->265
相比软解软编,文件会大那么一丁点,时间几乎没区别
ffmpeg -hide_banner -c:v h264_qsv -i "xx.mp4" -c:v libx265 -crf 23 -c:a copy "yy.mp4"
h265/hevc 10 bit
推荐使用,直接指定10bit的像素格式即可 有关像素格式的知识:
科普:为什么8bit的视频能压成10bit,能获得更多的好处么?
查看指定编码器支持的像素格式
ffmpeg -hide_banner -h encoder=libx265
qsv硬解硬编 264->265 10bit
光-profile:v main10会报错,需要加-pix_fmt p010le
-pix_fmt p010le 指定像素格式为p010le,在官方文档使用范例和reddit有提及
ffmpeg -hide_banner -hwaccel qsv -c:v h264_qsv -i "xx.mp4" -c:v hevc_qsv -global_quality 20 -pix_fmt p010le -c:a copy "yy.mp4"
软解软编 264->265 10bit
ffmpeg -hide_banner -i "xx.mp4" -c:v libx265 -crf 23 -pix_fmt yuv420p10le -c:a copy "yy.mp4"
h265/hevc 12 bit
也是直接指定12bit的像素格式使用
浅试了下,potplayer和ios es文件浏览器中呈紫色无法正常显示,等过几年12bit解码普及再看吧
NVIDIA NVENC/NVDEC CUDA 硬件加速
编码器好像无crf、icq之类相对质量的码率控制
cuvid硬解软编
ffmpeg -hide_banner -c:v h264_cuvid -i "xx.mp4" -c:v libx265 -crf 23 -c:a copy "yy.mp4"
ffmpeg -hide_banner -c:v h264_cuvid -i "xx.mp4" -c:v libx265 -crf 23 -pix_fmt yuv420p10le -c:a copy "yy.mp4"
hevc_nvenc
preset slow 即是二次编码
相关资料
- FFmpeg关于Nvidia支持介绍
- ffmpeg#CUDACUVIDNVDEC#完全硬件转码vs部分硬件转码
- ffmpeg硬件编解码Nvidia GPU
- ffmpeg + cuda(cuvid) 硬解码+像素格式转换(cpu主导)实战
- NVIDIA FFmpeg Transcoding Guide