ffmpeg threads_FFmpeg使用手册 - FFmpeg 的常用命令

ffmpeg在做音视频编解码时非常方便,所以很多场景下转码使用的是ffmpeg,铜鼓通过ffmpeg –help命令操作可以看到ffmpeg常见的命令大概分为六部分:

1.ffmpeg信息查询部分

2.公共做操参数部分

3.文件主要操作参数部分

4.视频操作参数部分

5.音频操作参数部分

6.字幕操作参数部分

ffmpeg信息查询部分主要参数:

其中通过ffmpeg --help查看到的help信息是基础的信息,如果想获得高级参数部分,可以通过使用ffmpeg --help long参数来查看,如果希望获得全部的帮助信息,可以同过使用ffmpeg --help full参数来获得。

通过-L参数,可以看到ffmpeg目前所支持的license协议,通过-version查看ffmpeg的版本,这里所查看的版本,是详细的版本,包含libavformat、libavcodec、libavutil、libavfilter、libswscale、libswresample的版本,如图:

有时候使用ffmpeg转码,发现无法解析视频文件,或者无法生成视频文件,报一些不支持生成对应的视频文件的错误,这个时候就需要查看当前使用的ffmpeg是否支对应的视频文件格式,需要使用ffmpeg -formats来查看:

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转码主要原理为:

通过前两节介绍的参数,可以设置转码的相关参数,如果转码操作则涉及到封装的改变,从而可以通过设置AVCodec与AVFormat的操作参数进行封装与编码的改变,下面举一个例子:

从图中可以看到,上图参数中使用了前面介绍过的参数:

1.转封装格式从rmvb格式转为mp4;

2.视频编码从rv40转为mpeg4;

3.视频码率从原来的377 kb/s 转为 200 kb/s;

4.视频帧率从原来的 23.98 fps转为 15 fps

可以分析出,这个例子的流程与前面提到的流程相同,首先解封装,需要解的封装为rmvb,然后解码,其中视频编码为rv40,音频编码为cook;然后解码后的视频编码为mpeg4,然后封装为一个没有音频的mp4文件。

阅读(31723) | 评论(0) | 转发(1) |

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值