返回

FFmpeg使用笔记

剪辑视频、转码;制作动图...

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可

FFmpeg视频转码技巧之二次编码

Intel QSV 硬件加速

英特尔® 快速视频同步技术(Intel Quick Sync Video),常用于英特尔带核显的CPU, 以及近几年因特尔推出的独显。

维基百科 因特尔GPU发布时间与架构 查看硬件架构支持列表及文档 利用ffmpeg+QSV进行视频处理

安装

Arch Linux 可能需要手动安装intel-media-sdk以启用qsv

pacman -S intel-media-sdk

h264

资料

Encoding with the codecx264

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,不用profile也行(没卵用)

-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资料