FFmpeg-最最强大的视频工具
FFmpeg 是一个自由软件,它可以用于处理音频和视频数据。它包含了许多命令行工具,可以进行各种不同的媒体处理任务,如音频编解码、视频编解码、转码、合并、裁剪等。
FFmpeg 使用 C 语言编写,因此可以在不同的平台上运行,包括 Windows、macOS 和 Linux。它是业界公认的高性能多媒体处理库,被广泛应用于音频/视频编辑软件、游戏引擎、流媒体服务器等领域。
使用 FFmpeg 可以轻松完成多媒体处理任务,如视频压缩、转码、截图、录屏、音频提取、直播流传输等。且FFmpeg支持很多常用的媒体格式,如 mp3、mp4、mov、flac、mkv、avi、wmv等.
下载:FFmpeg官网
使用示例:转化视频格式
Converting video and audio has never been so easy.
ffmpeg -i input.mp4 output.avi
FFmpeg 编码器
一个简单的mp4文件可以看作是一个容器,其内部构成如下:
其中的视频流、音频流都可以采用不同的编码格式
MP4编码
编码格式解决的是:如何将每帧的画面存储成二进制的数据存储在硬盘上 或 是进行网络传输;
音频视频编码方案有很多,用百家争鸣形容不算过分,常见的音频视频编码有以下几类:
- MPEG系列
- H.26X系列
不同的编码对于视频的质量和压缩率有很大关系,对于**.mp4** 来说使用最广泛的是视频编码是 H264(也叫AVC、MPEG-4 Part10)。
若需要更高的压缩率,我们可以使用 H265、VP9 等编码,但其需求的硬件、需用许可限制更严格。
使用编码器
我们可以在 FFmpeg 中手动选择编码器:-c:v
$ffmpeg -i input.avi -c:v libx264 output.mp4
libx264 是 FFmpeg 默认提供的、用纯软件实现的H264编码器。
若你使用的是NVIDIA显卡,我们还可以用h264_nvenc
进行硬件加速:
$ffmpeg -i input.avi -c:v h264_nvenc output.mp4
在使用 libx264 编码器时,我们可以使用一些参数来控制其工作:
1.控制压缩视频文件大小和编码速率:-preset xxx
(预设)
$ffmpeg -i input.avi -c:v libx264 -preset xxx output.mp4
预设 preset 可以是以下值:
- ultrafast(编码速度最快,但产生文件最大)
- superfast
- veryfast
- fast
- medium(默认)
- slow
- slower
- veryslow(编码速度最慢,但产生文件最小)
2.控制图像质量:-crf
(constant rate factor)
$ffmpeg -i input.avi -c:v libx264 -crf xx output.mp4
crf:取值范围是 0~51,0代表无损,压缩值越小代表图像质量越好,文件较大。实际上的常用范围为 19~28。
FFmpeg 过滤器
过滤器可以对视频图像进行变换:修改尺寸、裁剪、旋转、添加滤镜等。
过滤器类似流,前一个过滤器的输出可以直接作为后一个过滤器的输入。
过滤器使用格式:-vf "xxx"
(videp filter)
1.修改视频的尺寸
-vf "scale = height:width"
我们可以将任意一个参数设置为 -1 或 -2,可以 让FFmpeg根据另一个参数自动帮我们推算;更建议使用 -2,分辨率只能是偶数,-1 可能会生成奇数,而-2强制生成偶数
# 生成 720P
$ffmpeg -i input.avi -c:v libx264 -vf "scale = -2: 720" output.mp4
2.视频旋转
-vf "transpose = x"
参数可以是 0 1 2 3 中的一个,比如2就是代表视频90°逆时针旋转
# 生成 720P , 并逆时针旋转 90°(多个过滤器使用只需要使用逗号隔开)
$ffmpeg -i input.avi -c:v libx264 -vf "scale = -2: 720, transpose = 2" output.mp4
3.裁剪视频
-vf "crop = "w:h:x:y"
(宽、高、水平位置、竖直位置)
其参数也可以是表达式,如设置为原始大小的三分之一
$ffmpeg -i input.avi -c:v libx264 -vf "crop = iw/3:ih/3" output.mp4
#iw(input width)、ih(input height)
4.音频调节
-af "xxx"
(audio filter)
FFmpeg 对音频的支持也很齐全,如:
$ffmpeg -i input.mp4 -af "volume = 1.5" output.mp4 # 调节音量的大小
$ffmpeg -i input.mp4 -af "loudnorm = I = -5:LRA=1" output.mp4 # 统一视频的音量
5.删除音轨、字幕...
删除视频中的音频轨:-an
(创造一个无声的视频)
$ffmpeg -i input.mp4 -an output.mp4 # 调节音量的大小
类似的还有:
- -vn 删除视频轨
- -sn 删除字幕
- -dn 删除数据流
更多过滤器请参考:FFmpeg Filters Documentation
FFmpeg应用
1.剪切视频
1.-ss 起始位置 --t 时间长度
,起始位置可以使用 hh:mm:ss 的格式,时间长度亦可以使用 hh:mm:ss ,还可以直接填写秒数。
$ffmpeg -i input.avi -c:v libx264 -ss 00:00:03 -t 5 output.mp4
2.--s 起始位置 --to 终止位置
$ffmpeg -i input.avi -c:v libx264 -ss 00:00:03 -to 00:00:08 output.mp4
-ss 需要填写在 -i 的后面,才能做到分毫不差的剪切:如果将 -ss 放在 -i 之前,使用的是关键帧定位,所以剪切的起始位置可能稍有偏差,但剪切的视频较长,则可以选择 -ss 放在 -i 前面,更加快速定位。
2.合并视频
若要合并视频,先将文件列举在一个文本文件中:(file.txt)
file 'cilp1.mp4'
file 'cilp2.mp4'
file 'cilp3.mp4'
然后通过 -f concat
:指定输入的文件是一个视频列表
ffmpeg -f concat -i file.txt -c:copy output.mp4
-c copy
:不重新编码,直接拷贝原始视频的数据(在输入视频的编码格式一致情况下才能这样用)
3.创建视频缩略图
# 在当前目录输出若干张视频的缩略图
$ffmpeg -i input.mp4 -vf "fps=1/10 ,scale=-2:720" thumbnail-%03d.jpg
- fps 指定了输出文件的帧率,1/10 代表每10秒输出1帧画面
- scale 指定了输出图像的大小
- 最后图片名有 thumbnail 加上编号组成,格式为jpg
4.给视频添加水印
需要先准备一张图片作为水印(logo.jpg),将视频和水印图片同时输入:
$ffmpeg -i logo.jpg -i logo.jpg -filter_complex "overlay=100:100" output.mp4
使用过滤器 overlay 将水印叠加在原始视频中,后两个参数决定了水印在视频中的位置
5.转换为GIF动图
由于Gif编码的限制,不太适合较大或较长的视频,我们需要先剪接出一个片段,然后用过滤器缩放视频(720P)并降低视频的帧率(15)。
ffmpeg -i input.avi --s 0 -t 3 -filter_complex [0:v]fps=15,scale=-1:256,splie[a][b];[a]palettegen[p];[b][p]paletteuse output.gif
最后因为gif自身256色的限制,因此需要单独创建一个调色板。
6.屏幕录制(鸡肋、简洁)
ffmpeg -hide_banner -loglevel error -stats -f gdigrab -framerate 60 -offset_x 0 -offset_y 0 -video_size 1920x1080 -draw_mouse 1 -i desktop -c:v libx264 -r 60 -preset ultrafast -pix_fmt yuv420p -y d:/out.mp4
输出到 d:/out.mp4,不需要录制时按下Q
即可。