ffmpeg在做音视频编解码时非常方便,所以很多场景下转码使用的是ffmpeg,铜鼓通过ffmpeg –help命令操作可以看到ffmpeg常见的命令大概分为六部分:
1.ffmpeg信息查询部分
2.公共做操参数部分
3.文件主要操作参数部分
4.视频操作参数部分
5.音频操作参数部分
6.字幕操作参数部分
ffmpeg信息查询部分主要参数:
FFmpeg使用手册 - FFmpeg 的常用命令-LMLPHP

其中通过ffmpeg --help查看到的help信息是基础的信息,如果想获得高级参数部分,可以通过使用ffmpeg --help long参数来查看,如果希望获得全部的帮助信息,可以同过使用ffmpeg --help full参数来获得。
通过-L参数,可以看到ffmpeg目前所支持的license协议,通过-version查看ffmpeg的版本,这里所查看的版本,是详细的版本,包含libavformat、libavcodec、libavutil、libavfilter、libswscale、libswresample的版本,如图:
FFmpeg使用手册 - FFmpeg 的常用命令-LMLPHP
有时候使用ffmpeg转码,发现无法解析视频文件,或者无法生成视频文件,报一些不支持生成对应的视频文件的错误,这个时候就需要查看当前使用的ffmpeg是否支对应的视频文件格式,需要使用ffmpeg -formats来查看:
FFmpeg使用手册 - FFmpeg 的常用命令-LMLPHP

FFmpeg使用手册 - FFmpeg 的常用命令-LMLPHP
bbs.chinaffmpeg.com的孙悟空提示,这个列表比较长,还有一些信息,可以自己执行命令查看
根据上图可以看到,在输出的内容中,分为三部分:
第一列是多媒体文件格式的Demuxing支持与Muxing支持;
第二列是多媒体文件格式;
第三列是文件格式的详细说明。
下面详细介绍ffmpeg的封装转换。

4.1 ffmpeg 的封装转换
FFmpeg的封装转换部分,主要是通过libavformat这部分来完成的功能,通过libavformat库进行mux和demux操作,多媒体文件的格式有很多种,但是还是有好多demux与mux的操作参数是公用的,下面来详细介绍一下这些公用的参数:
通过查看ffmpeg的help full参数,找到AVFormatContext参数部分,在这个参数下面的所有的参数均为封装转换可使用的参数:
avioflags: format的缓冲设置,默认为0,就是有缓冲:
direct: 无缓冲状态;
probesize: 获得文件内容的大小;
formatprobesiz: 设置一个获得文件内容的大小来解析文件的format;
fflags: 设置读取或者写出的格式的形式的标签,分为多种方式:flush_packets,ignidx,genpts,nofillin,noparse,igndts,discardcorrupt,sortdts,keepside,fastseek,latm,nobuffer,bitexact,下面针对这些format读写方式进行一一详解;
flush_packets:  立即将packets数据刷新入文件中;
genpts: 输出是产生pts;
nofillin: 不填写可以精确计算缺失的值;
igndts: 忽略dts;
discardcorrupt: 丢弃损坏的帧;
sortdts: 尝试以dts的顺序为准输出;
keepside: 不合并数据;
fastseek: 快速seek,但是不够精确;
latm: 设置RTP MP4_LATM 生效;
nobuffer: 直接读取或者写出,不存buffer;
bitexact: 不写入随机或者不稳定的数据;
seek2any: 支持随意seek,这个seek可以不以keyframe为参考;
analyzeduration: 指定解析媒体所需要花销的时间,这里设置的值越高,解析的越准确,如果在直播中为了降低延迟,这个可以设置得低一些
codec_whitelist: 设置可以解析的codec的白名单;
format_whitelist: 设置可以解析的format的白名单;


4.2 ffmpeg 的编转码
FFmpeg的编解码部分主要是通过libavcodec这个库来完成的功能,通过libavcodec库进行encode与decode操作,多媒体的编码格式种类很多,但是还是有好多基本的操作参数是共同可以设置的,下面来详细介绍一下这些公用的参数:
通过查看ffmpeg的help full参数可以看到AVCodecContext AVOptions,在这个选项下面的所有参数均为编解码可以使用的参数:
b: 设置音频与视频码率,可以认为是音视频加起来的码率,默认为200k;
使用这个参数可以根据b:v设置视频码率,b:a设置音频码率;
ab: 设置音频的码率,默认是128k;
g: 设置视频GOP大小,关键帧间隔,默认是12帧一个gop
ar: 设置音频采样率,默认为0
ac: 设置音频通道数,默认为0
bf: 设置非B帧之间的B帧个数,默认为0
maxrate:最大码率设置,与bufsize一同使用即可,默认为0
minrate: 最小码率设置,配合maxrate与bufsize可以设置为CBR模式,平时基本没用,默认为0
bufsize:设置控制码率的buffer的大小,默认为0
keyint_min: 设置最小IDR帧间隔,默认为25
sc_threshold: 设置场景切换支持,默认为0
me_threshold: 设置运动估计阀值,默认为0
mb_threshold: 设置宏块阀值,默认为0
profile: 设置音视频的profile,默认为-99
level: 设置音视频的level,默认为-99
timecode_frame_start: 设置GOP帧的开始时间,需要在non-drop-frame默认情况下使用
channel_layout: 设置音频通道的布局格式
threads: 设置编解码等工作的线程数

4.3 ffmpeg 的基本编转码原理
ffmpeg工具主要用途为编码、解码、转码,常用ffmpeg做的为转码操作,使用ffmpeg转码主要原理为:
FFmpeg使用手册 - FFmpeg 的常用命令-LMLPHP
 通过前两节介绍的参数,可以设置转码的相关参数,如果转码操作则涉及到封装的改变,从而可以通过设置AVCodec与AVFormat的操作参数进行封装与编码的改变,下面举一个例子:
FFmpeg使用手册 - FFmpeg 的常用命令-LMLPHP
从图中可以看到,上图参数中使用了前面介绍过的参数:
1.转封装格式从rmvb格式转为mp4;
2.视频编码从rv40转为mpeg4;
3.视频码率从原来的377 kb/s 转为 200 kb/s;
4.视频帧率从原来的 23.98 fps转为 15 fps
可以分析出,这个例子的流程与前面提到的流程相同,首先解封装,需要解的封装为rmvb,然后解码,其中视频编码为rv40,音频编码为cook;然后解码后的视频编码为mpeg4,然后封装为一个没有音频的mp4文件。

12-17 17:08