0%

FFMPEG编译与命令格式

FFMPEG 模块

  • libavcodec:编码/解码库
  • libavfilter:处理裸视频/音频数据
  • libavformat :I/O 和复用/解复用库

    • 解复用:从媒体文件或者流解析出编码数据包
    • 复用:把编码数据包封装成媒体文件
  • libavdevice:特殊设备复用/解复用库

  • libavutil:常用实用程序库
  • libswresample:音频重采样、格式转换和混合
  • libpostproc:后处理库
  • libswscale:视频缩放,与颜色空间转换

工具

ffmpeg 编译

添加库加载路径

1
2
3
4
echo "export LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib64:$LD_LIBRARY_PATH" >> /etc/profile
echo "export LIBRARY_PATH=/usr/local/lib:/usr/local/lib64:$LIBRARY_PATH" >> /etc/profile
echo "export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/local/lib64/pkgconfig:$PKG_CONFIG_PATH" >> /etc/profile
source /etc/profile

安装nasm

nasm代码地址:https://github.com/netwide-assembler/nasm.git

1
2
3
4
5
yum install -y automake
git clone -b nasm-2.15 --depth=1 https://github.com/netwide-assembler/nasm.git
cd nasm; sh autogen.sh
./configure
make -j; make install

安装libx264

libx264源码地址:https://code.videolan.org/videolan/x264.git

1
2
3
git clone https://code.videolan.org/videolan/x264.git
cd x264; mkdir mybuild; cd mybuild; ../configure --enable-shared
make -j; make install

安装libx265

libx265源码地址:https://github.com/videolan/x265.git

1
2
3
4
git clone https://github.com/videolan/x265.git
cd x265/build/** #对应平台
#
make -j; make install

安装libfdk-aac

libfdk-aac源码地址:https://github.com/mstorsjo/fdk-aac.git

1
2
3
git clone https://github.com/mstorsjo/fdk-aac.git
cd fdk-aac; mkdir mybuild; cd mybuild; cmake ..
make -j; make install

安装ffmpeg

ffmpeg源码地址:https://git.ffmpeg.org/ffmpeg.git

1
2
3
4
git clone https://git.ffmpeg.org/ffmpeg.git 
cd ffmpeg; mkdir mybuild; cd mybuild;
../configure --enable-libx264 --enable-libx265 --enable-libfdk-aac --enable-gpl --enable-nonfree --enable-shared
make -j; make install
  • 使用./configure --help查看编译选项

  • 汇编优化,默认使用yasm汇编器,进行汇编,可以使用./configure --disable-yasm,进行关闭

ffmpeg命令格式

官网:https://ffmpeg.org/ffmpeg.html

中文:https://www.longqi.cf/tools/2015/01/07/ffmpegdoc3/、https://www.longqi.cf/tools/2014/12/23/ffmpegdoc/、https://www.longqi.cf/tools/2014/12/26/ffmpegdoc2/

翻译手册:https://www.bookstack.cn/read/other-doc-cn-ffmpeg/README.md

定位:ffmpeg是一个的视频和音频转换器

格式与说明

1
2
3
4
ffmpeg 	[global_options]
{[input_file_options] -i input_url} {[input_file_options] -i input_url}...
{[filter_option]}
{[output_file_options] output_url} {[output_file_options] output_url} ...

输入与输出

  • 都是url,都可以多个,一个url中可以有多个流,索引从0开始,2:3表示第3个url的第4个流
  • 输入url前有-i,输出url前没有
  • 输入输出不能混合声明,先输入,再输出
  • 输入输出的匹配可以自动完成,也可以使用-map选项完成

单位

https://ffmpeg.org/ffmpeg-utils.html#time-duration-syntax

数据单位
  • 默认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]。例如200ms12:03:4523.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:有可配置的流,编码器与关键信息必须存在

Filter语法