FFMPEG 模块
库
- libavcodec:编码/解码库
- libavfilter:处理裸视频/音频数据
libavformat :I/O 和复用/解复用库
- 解复用:从媒体文件或者流解析出编码数据包
- 复用:把编码数据包封装成媒体文件
libavdevice:特殊设备复用/解复用库
- libavutil:常用实用程序库
- libswresample:音频重采样、格式转换和混合
- libpostproc:后处理库
- libswscale:视频缩放,与颜色空间转换
工具
ffmpeg 编译
添加库加载路径
1 | echo "export LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib64:$LD_LIBRARY_PATH" >> /etc/profile |
安装nasm
nasm代码地址:https://github.com/netwide-assembler/nasm.git
1 | yum install -y automake |
安装libx264
libx264源码地址:https://code.videolan.org/videolan/x264.git
1 | git clone https://code.videolan.org/videolan/x264.git |
安装libx265
libx265源码地址:https://github.com/videolan/x265.git
1 | git clone https://github.com/videolan/x265.git |
安装libfdk-aac
libfdk-aac源码地址:https://github.com/mstorsjo/fdk-aac.git
1 | git clone https://github.com/mstorsjo/fdk-aac.git |
安装ffmpeg
ffmpeg源码地址:https://git.ffmpeg.org/ffmpeg.git
1 | git clone https://git.ffmpeg.org/ffmpeg.git |
使用
./configure --help
查看编译选项汇编优化,默认使用yasm汇编器,进行汇编,可以使用
./configure --disable-yasm
,进行关闭
ffmpeg命令格式
官网:https://ffmpeg.org/ffmpeg.html
翻译手册:https://www.bookstack.cn/read/other-doc-cn-ffmpeg/README.md
定位:
ffmpeg
是一个的视频和音频转换器
格式与说明
1 | ffmpeg [global_options] |
输入与输出
- 都是url,都可以多个,一个url中可以有多个流,索引从0开始,
2:3
表示第3个url的第4个流 - 输入url前有
-i
,输出url前没有 - 输入输出不能混合声明,先输入,再输出
- 输入输出的匹配可以自动完成,也可以使用
-map
选项完成
单位
数据单位
默认bit,可以用k、m、G表示kb,mb,Gb。如1k,2m
byte需要额外加B,对应的有B、KB、MiB、GB
时间单位
- 默认单位S,支持ms,us
- 日期格式
[(YYYY-MM-DD|YYYYMMDD)[T|t| ]]((HH:MM:SS[.m...]]])|(HHMMSS[.m...]]]))[Z]
- 时间格式
[-][HH:]MM:SS[.m...]
or[-]S+[.m...][s|ms|us]
。例如200ms
,12:03:45
,23.189
(23.189 seconds)
Filter 选项
简单过滤器
输入与输出都只有一条用-filter
标识,
1 | ffmpeg -i in.wav -filter 'channelmap=1|2|0|5|3|4:5.1' out.wav |
复杂过滤器
具有多个输入和/或输出或者输出流类型与输入不同。用-filter_complex
或者-lavfi
标识,两者效果相同
1 | ffmpeg -i in.wav -filter_complex 'channelsplit=channel_layout=5.1:channels=LFE[LFE]' -map '[LFE]' lfe.wav |
流的复制
用-codec copy
标识,不会触发编解码,只是复用与解复用,性能效率较高
流的选择
自动
- 检查输出所支持的流类型,再从输出中选一个流与之匹配
- 选择规则
- 视频:分辨率最高
- 音频:通道最多
- 字幕:第一个同类型字幕流
-vn -an -sn -dn
用于关闭视频、音频、字幕和数据流的自动选择
手动
使用map
进行指定
复合过滤器
复合过滤器输出的流,如果没有标签,将会被输出到第一个文件中,没有map
,流的选择将被跳过。有map
,根据map
指定(没理解)
选择后流的处理
除字幕外,如果有-codec,则根据制定项输入,没有采用输出流的默认编码器。
若指定字幕编码器的流,将包含第一个被找到字幕流,无论其格式(没理解)
若输出流不支持指定-codec,则ffmpeg中止
选项作用限制符
- stream_index:流的编号,从0开始。
-threads:1 4
,标识第二个流 - stream_type[:additional_stream_specifier]:流的类型(v/V/a/s/d/t)及其附加符。V表示纯粹的流(不纯粹的附加图片,缩略图,封面)
- p:program_id[:additional_stream_specifier]:节目id及其附加符
- #stream_id or i:stream_id:流id
- m:key[:value]:流的元标志及其
- u:有可配置的流,编码器与关键信息必须存在