FFmpeg视频处理入门教程

概念

视频文件本身其实是一个容器(container),里面包括了视频和音频,也可能有字幕等其他内容

查看 FFmpeg 支持的容器.

1
ffmpeg -formats

编码格式

1
2
3
H.262
H.264
H.265

查看 FFmpeg 支持的编码格式,视频编码和音频编码都在内

1
ffmpeg -codecs

FFmpeg 内置的视频编码器。

1
2
3
4
5
libx264:最流行的开源 H.264 编码器
NVENC:基于 NVIDIA GPU 的 H.264 编码器
libx265:开源的 HEVC 编码器
libvpx:谷歌的 VP8 和 VP9 编码器
libaom:AV1 编码器

音频编码器

1
2
libfdk-aac
aac

查看 FFmpeg 已安装的编码器

1
ffmpeg -encoders

FFmpeg 的使用格式

1
2
3
4
5
6
ffmpeg \
[全局参数] \
[输入文件参数] \
-i [输入文件] \
[输出文件参数] \
[输出文件]

eg

1
2
3
4
5
6
ffmpeg \
-y \ # 全局参数
-c:a libfdk_aac -c:v libx264 \ # 输入文件参数
-i input.mp4 \ # 输入文件
-c:v libvpx-vp9 -c:a libvorbis \ # 输出文件参数
output.webm # 输出文件

上面的命令将 mp4 文件转成 webm 文件,这两个都是容器格式。输入的 mp4 文件的音频编码格式是 aac,视频编码格式是 H.264;输出的 webm 文件的视频编码格式是 VP9,音频格式是 Vorbis。

如果不指明编码格式,FFmpeg 会自己判断输入文件的编码。因此,上面的命令可以简单写成下面的样子。

1
ffmpeg -i input.avi output.mp4

常用命令行参数

FFmpeg 常用的命令行参数如下

1
2
3
4
5
6
7
8
9
-c:指定编码器
-c copy:直接复制,不经过重新编码(这样比较快)
-c:v:指定视频编码器
-c:a:指定音频编码器
-i:指定输入文件
-an:去除音频流
-vn: 去除视频流
-preset:指定输出的视频质量,会影响文件的生成速度,有以下几个可用的值 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow。
-y:不经过确认,输出时直接覆盖同名文件。

常见用法

查看文件信息

查看视频文件的元信息,比如编码格式和比特率,可以只使用-i参数

1
ffmpeg -i /Users/cuishiying/Movies/dhxy.mp4

上面命令会输出很多冗余信息,加上-hide_banner参数,可以只显示元信息。

1
ffmpeg -i /Users/cuishiying/Movies/dhxy.mp4 -hide_banner

把本地音视频推到流服务器

1
ffmpeg -re -i /Users/cuishiying/Movies/dhxy.mp4 -f flv rtmp://127.0.0.1:1935/live/123

查看当前本本支持的摄像头设备情况

1
2
# -f 指定使用 avfoundation 采集数据
ffmpeg -f avfoundation -list_devices true -i ""

本地摄像头推流

1
ffmpeg -f avfoundation -framerate 30 -video_size 640x480 -i  "0" -vcodec libx264 -preset ultrafast -acodec libfaac -f flv  rtmp://127.0.0.1:1935/live/123

参考