FFmpeg使用
安装 FFmpeg
Windows
因为 FFmpeg 只提供源码需要编译,但有大神编译好的 FFmepg 可以直接使用仓库中的发行版,当然更具你的需求也可以Clone仓库后自己编译一份,编译方法就不多讲了,详细可以参考FFmpeg的wiki
Ubuntu
1 | sudo add-apt-repository universe |
概览
容器格式
我们常见的视频文件格式本身其实就是一个容器,容器里面再包括视频轨道、音频轨道、元数据、字幕、标题、封面等等…… 常见的视频容器格式有包括这些
| 格式 | 全称 | 特点 |
|---|---|---|
| MP4 | MPEG-4 Part 14 | 通用性最好,兼容性强 |
| MKV | Matroska | 开放格式,支持多轨道 |
| WebM | Web Media | 专为 Web 设计,开源免费 |
| AVI | Audio Video Interleave | 微软开发,较老的格式 |
| MOV | QuickTime | 苹果开发,专业领域常用 |
TOP: WebM 就是最近大火的 AV1、VP9、VP8 常用的容器,编解码需要特定的硬件加速
例如 AIN 22年新品都支持 AV1 编解码硬件加速
编码
常见的几种编码;包括了授权编码、无版权编码、音频编码格式
授权编码
- H.262
- H.264
- H.265
无版权编码
- VP8
- VP9
- AV1
音频编码格式
- MP3
- AAC
视频编码器
| 编码器 | 说明 |
|---|---|
libx264 |
最流行的开源 H.264 编码器 |
libx265 |
开源的 HEVC 编码器 |
libvpx |
谷歌的 VP8 和 VP9 编码器 |
libaom |
AV1 编码器 |
h264_nvenc |
NVIDIA GPU 硬件加速 H.264 编码器 |
hevc_nvenc |
NVIDIA GPU 硬件加速 H.265 编码器 |
音频编码器
| 编码器 | 说明 |
|---|---|
libfdk_aac |
高质量 AAC 编码器 |
aac |
FFmpeg 内置 AAC 编码器 |
libmp3lame |
MP3 编码器 |
libopus |
Opus 编码器 |
查看 FFmpeg 已安装的编码器
1 ffmpeg -encoders
使用方式
1 | ffmpeg [1] [2] -i [3] [4] [5] |
[1] 全局参数
[2] 输入文件参数
[3] 输入文件
[4] 输出文件参数
[5] 输出文件
参数
-c: 指定编码器-c copy: 直接复制不经过重新编码,更快-c:v: 指定视频编码器-c:a: 指定音频编码器-i: 指定输入文件-an: 去除音频流-vn: 去除视频流-preset: 视频编码质量ultrafast,superfast,veryfast,faster,fast,medium,slow,slower,veryslow-y: 不经过确认,输出时直接覆盖同名文件
更多请参考: https://zh.m.wikipedia.org/zh-hans/FFmpeg
文件信息
1 | ffmpeg -i input.mp4 |
转格式
1 | ffmpeg -i input.avi output.mp4 |
-i输入文件
-ccopy 直接复制不转码速度更快
转码
1 | ffmpeg -i input.mp4 -c:v libx264 output.mp4 |
-i输入文件
-c:v转换编码器
剪片
1 | ffmpeg -ss 00:00:00 -t 00:00:30 -i input.mp4 -vcodec copy -acodec copy output.mp4 |
-
ss开始时间
-t截取到时间
-i输入文件
码率
本篇章过于专业,需要更深度的了解!这里只演示最简单的编码方式,不包括压片配置。
ABR (VBR)二次编码
1 | ffmpeg -i input.mp4 -c:v libx264 -b:v 1M -pass 1 -f null /dev/null |
CBR 恒定码率
1 | 压缩到 2M 码率 |
-i输入文件
-b:a音频码率
-b:v视频码率
-minrate允许最小码率
-maxrate允许最大码率
-bufsize码率控制缓冲器
大小
1 | ffmpeg -i input.avi -fs 114M output.mp4 |
-i输入文件
-fs控制文件大小
分辨率
1 | ffmpeg -i input.mp4 -vf scale=1920:1080 output.mp4 |
-i输入文件 [保持长宽比 -1]
FPS
1 | ffmpeg -i input.avi -r 30 output.mp4 |
-i输入文件
-r帧率值
提取音频
1 | ffmpeg -i input.mp4 -f mp3 -vn output.mp3 |
1 | ffmpeg -i input.mp4 -acodec aac -vn output.mp3 |
-i输入文件
-f输出格式
-vn不包含视频
-acodec设定声音编解码器
分离音视频
分离视频
1 | ffmpeg -i input.mp4 -vcodec copy -an output.mp4 |
分离 acc 格式
1 | ffmpeg -i input.mp4 -acodec copy -vn output.m4a ffmpeg -i m.m4a m.mp3 |
直接提取音频
1 | ffmpeg -i mavel4.mp4 m.mp3 |
音视频合并
1 | ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac -strict experimental output.mp4 |
-i输入文件
-c:a音频编码方式
-c:v视频编码方式
压缩音频
1 | ffmpeg -i input.wav -b:a 64k -acodec mp3 -ar 44100 -ac 1 output.mp3 |
-i输入文件
-b码率
-ar采样率
截图
指定时间截图
1 | ffmpeg -ss 00:11:45 -i input.mp4 -r 1 output.jpg |
从头开始抽帧截图
1 | ffmpeg -i input.mp4 -r 1 -q:v 2 -f image2 output.jpg |
-i输入文件-r几秒一帧-q:v图像质量-f输出格式
封面
视频封面
1 | ffmpeg -i input.mp4 -i input.jpg -map 0 -map 1:0 -c copy -disposition:v:1 output.mp4 |
音频封面
1 | ffmpeg -i input.mp3 -i input.jpg -map 0:0 -map 1:0 -codec copy -id3v2_version 3 \ |
性能优化
多线程处理
1 | 使用 5 个线程加速处理 |
硬件加速(NVIDIA GPU)
1 | 使用 NVENC 硬件编码 |
快速预览(降低质量换取速度)
1 | ffmpeg -i input.mp4 -c:v libx264 -preset ultrafast -crf 28 output.mp4 |
基础抽帧操作
1. 指定时间点抽取单帧
1 | ffmpeg -i d:\工作目录\***\01.mp4 -ss 00:01:30.000 -vframes 1 -an test.jpg |
读取 01.MP4 视频中的 1 分 30 秒位置抽帧,图片名称保存为 test.jpg,图像分辨率与视频分辨率一致
参数说明:
-ss 00:01:30.000:定位到指定时间点(时:分:秒.毫秒)-vframes 1:只抽取 1 帧-an:禁用音频流
2. 每秒抽帧(均匀抽帧)
1 | ffmpeg -i d:\01.mp4 -r 1 -q:v 2 -f image2 d:\***\%05d.00000000.jpg |
参数说明:
-r 1:设置输出帧率为每秒 1 帧-q:v 2:设置视频质量(1-31,数值越小质量越高)-f image2:指定输出格式为图片序列%05d:5 位数字序号(00001, 00002…)
3. 每 N 秒抽取一帧
1 | ffmpeg -i d:\01.mp4 -vf "fps=1/5" -q:v 2 d:\output\%05d.jpg |
每 5 秒抽取一帧
4. 指定总帧数均匀抽取
1 | ffmpeg -i d:\01.mp4 -vf "select=not(mod(n\,100))" -vsync vfr -q:v 2 d:\output\%05d.jpg |
每隔 100 帧抽取一帧
关键帧操作
5. 打印关键帧信息
1 | ffprobe -i d:\01.mp4 -v quiet -select_streams v -show_entries frame=pkt_pts_time,pict_type |
参数说明:
-v quiet:静默模式,减少输出信息-select_streams v:只选择视频流-show_entries frame=pkt_pts_time,pict_type:显示时间戳和帧类型
6. 抽取关键帧(I帧)
1 | ffmpeg -i d:\01.mp4 -vf "select=eq(pict_type\,I)" -vsync vfr -qscale:v 2 -f image2 d:\***\%08d.jpg |
参数说明:
-vf:视频过滤器select=eq(pict_type\,I):选择帧类型等于 I 的帧-vsync vfr:可变帧率,阻止每个关键帧产生多余的拷贝-qscale:v 2:视频质量参数(2 为高质量)-f image2:输出为图片序列%08d:8 位数字序号
关键帧原理:I/B/P 帧
帧类型说明
| 帧类型 | 名称 | 说明 | 特点 |
|---|---|---|---|
| I帧 | Intra-coded Frame(关键帧) | 完整编码的独立图像帧 | 可独立解码,数据量最大,是随机访问点 |
| P帧 | Predictive Frame(预测帧) | 参考前面的 I 帧或 P 帧进行编码 | 只存储与参考帧的差异,数据量中等 |
| B帧 | Bi-directional Frame(双向预测帧) | 同时参考前后帧进行编码 | 压缩率最高,数据量最小,解码顺序与显示顺序不同 |
帧结构示意图
1 | TEXTGOP (Group of Pictures) 示例: |
常用输入选项
-i filename:指定输入文件名。-f fmt:强制设定 文件格式,需使用能力集列表中的名称(缺省是根据扩展名选择的)。-ss hh:mm:ss[.xxx]:设定输入文件的起始时间点,启动后将跳转到此时间点然后开始读取数据。
-对于输入,以下选项通常是自动识别的,但也可以强制设定。
-c codec:指定解码器,需使用能力集列表中的名称。-acodec codec:指定声音的解码器,需使用能力集列表中的名称。-vcodec codec:指定视频的解码器,需使用能力集列表中的名称。-b:v bitrate:设定视频流的比特率,整数,单位bps。-r fps:设定视频流的帧率,整数,单位fps。-s WxH: 设定视频的画面大小。也可以通过挂载画面缩放滤镜实现。-pix_fmt format:设定视频流的图像格式(如RGB还是YUV)。-ar sample rate:设定音频流的采样率,整数,单位Hz。-ab bitrate:设定音频流的比特率,整数,单位bps。-ac channels:设置音频流的声道数目。
常用输出选项
-f fmt:强制设定文件格式,需使用能力集列表中的名称(缺省是根据扩展名选择的)。-c codec:指定编码器,需使用能力集列表中的名称(编码器设定为”copy“表示不进行编解码)。-acodec codec:指定声音的编码器,需使用能力集列表中的名称(编码器设定为”copy“表示不进行编解码)。-vcodec codec:指定视频的编码器,需使用能力集列表中的名称(编解码器设定为”copy“表示不进行编解码)。-r fps:设定视频编码器的帧率,整数,单位fps。-pix_fmt format:设置视频编码器使用的图像格式(如RGB还是YUV)。-ar sample rate:设定音频编码器的采样率,整数,单位Hz。-b bitrate:设定音视频编码器输出的比特率,整数,单位bps。-ab bitrate:设定音频编码器输出的比特率,整数,单位bps。-ac channels:设置音频编码器的声道数目。-an忽略任何音频流。-vn忽略任何视频流。-t hh:mm:ss[.xxx]:设定输出文件的时间长度。-to hh:mm:ss[.xxx]:如果没有设定输出文件的时间长度的画可以设定终止时间点。




