FFmpeg-最最强大的视频工具

时间:2023-01-10 17:55:15

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文件可以看作是一个容器,其内部构成如下:

FFmpeg-最最强大的视频工具

其中的视频流、音频流都可以采用不同的编码格式

MP4编码

编码格式解决的是:如何将每帧的画面存储成二进制的数据存储在硬盘上 或 是进行网络传输;

音频视频编码方案有很多,用百家争鸣形容不算过分,常见的音频视频编码有以下几类:

  1. MPEG系列
  2. H.26X系列

不同的编码对于视频的质量和压缩率有很大关系,对于**.mp4** 来说使用最广泛的是视频编码是 H264(也叫AVC、MPEG-4 Part10)

若需要更高的压缩率,我们可以使用 H265VP9 等编码,但其需求的硬件、需用许可限制更严格。

使用编码器

我们可以在 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 过滤器

过滤器可以对视频图像进行变换:修改尺寸、裁剪、旋转、添加滤镜等。

过滤器类似流,前一个过滤器的输出可以直接作为后一个过滤器的输入。

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​​即可。