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来查看。


这个列表比较长,还有一些信息,可以自己执行命令查看

根据上图可以看到,在输出的内容中,分为三部分:

第一列是多媒体文件格式的Demuxing支持与Muxing支持;

第二列是多媒体文件格式;

第三列是文件格式的详细说明。

下面详细介绍ffmpeg的封装转换。



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的白名单;



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: 设置编解码等工作的线程数


ffmpeg 的基本编转码原理

ffmpeg工具主要用途为编码、解码、转码,常用ffmpeg做的为转码操作,使用ffmpeg转码主要原理为:

image.png










ffprobe 的常用命令

    在FFMpeg套件中,出了ffmpeg还有ffprobe,ffprobe主要用来查看多媒体文件的信息,下面看一下ffprobe中常见的基本命令.

ffprobe 常用参数

ffprobe常用参数比较多,可以用过ffprobe --help来查看详细的信息:

show_packets查看的多媒体包信息使用PACKET标签所包括起来,其中包含的信息主要如下:

codec_type: 多媒体类型,例如视频包,音频包等;

stream_index:  多媒体的stream索引;

pts: 多媒体的显示时间值

pts_time: 根据不同格式计算过后的多媒体的显示时间

dts: 多媒体解码时间值

dts_time: 根据不同格式计算过后的多媒体解码时间

duration: 多媒体包占用的时间值

duration_time: 根据不同格式计算过后的多媒体包占用的时间值

size: 多媒体包的大小

pos: 多媒体包所在的文件偏移位置

flags: 多媒体包标记,关键包与非关键包的标记





show_format

除了packets与data外,ffprobe还可以分析多媒体的封装格式,通过show_format参数可以查看多媒体的封装格式,封装可是使用FORMAT标签括起来显示:

ffprobe  -show_format ande_10s.flv

通过读取format信息,可以看到这个视频文件只有一个流通道,起始时间是0.000000,长度为85.867000,文件大小为2377700字节,码率为221523字节每秒,这个文件有可能是一个mov、有可能是mp4、有可能是m4a、有可能是3gp、有可能是3g2、也有可能是mj2,之所以ffprobe会这么输出,是因为这几种封装格式在ffmpeg中所识别的标签基本相同,所以才会这么多种显示方式,而其他种封装格式不一定是这样的,下面我们再看一个wmv的封装格式


show_frames

通过ffprobe的show_frames的参数可以查看视频文件中的帧信息,输出的帧信息使用FRAME标签括起来

image.png

通过-show_frames参数查看到如图的信息,能够看到每一帧的信息,下面介绍一下重要的信息


属性 说明

media_type 帧的类型(视频、音频、字幕等) video

stream_index 帧所在的索引区域 0

Key_frame 是否是关键帧 1

Pkt_pts Frame包的pts 0

Pkt_pts_time Frame包的pts的时间显示 0.000000

Pkt_dts Frame包的dts 0

Pkt_dts_time Frame包的dts的时间显示 0.000000

Pkt_duration Frame包的时长 1024

Pkt_duration_tine Frame包的时长时间显示 0.066667

Pkt_pos Frame包所在文件的偏移位置 44

Width 帧显示的宽度 608

height 帧显示的高度 320

Pix_fmt 帧的图像色彩格式 Yuv420p

Pict_type 帧类型 I


show_streams

通过-show_streams参数可以查看到多媒体文件中的流信息,流的信息使用STREAMS标签括起来:


如图所示,可以看到流的信息:

属性 说明

Index 流所在的索引区域 0

Codec_name 编码名 Mpeg4

Codec_long_name 编码全名 MPEG-4 part 2

profile 编码的profile Simple Profile

level 编码的level 1

Has_b_frames 包含B帧信息 0

Codec_tyoe 编码类型 Video

Codec_time_base 编码的时间戳计算基础单位 1/15

Pix_fmt 图像显示图像色彩格式 Yuv420p

Coded_width 图像的宽度 608

Coded_height 图像的高度 320

Codec_tag_string 编码的标签数据 Mp4v

image.png


print_forma

ffprobe使用前面的参数可以获得到对应的key-value,但是阅读起来因习惯不同所以有的人认为方便,有的人认为不方便,这样就需要用到ffprobe的print_format参数来进行相应的格式输出,下面举几种输出的例子:

ffprobe  -show_frames  ande_10s.flv -print_format flat


xml,json,ini,csv,flat

XML格式输出:


select_streams

如果只查看音频流或视频流,使用select_streams参数即可,例如只查看视频流的frames信息:

ffprobe -show_frames -select_streams v -of xml input.mp4


命令行执行后可以看到输出的信息如下,全部为视频的frames信息:




ffplay 的常用命令



在编译FFmpeg源代码时,如果系统中包含了SDL-1.2版本时,会默认将ffplay编译生成出来,如果不包含SDL-1.2或者版本不是SDL-1.2时,无法生成ffplay文件,所以,生成如果想使用ffplay进行流媒体播放测试,是需要安装SDL-1.2的。


通常使用ffplay作为播放器,其实ffplay不但可以做播放器,同样可以作为很多图像化音视频数据的分析根据,通过ffplay可以看到视频图像的运动估计方向,音频数据的波形等,在本节将会有更多的参数进行介绍并举例。



ffplay 常用参数

ffplay不仅仅是播放器,同时也是测试ffmpeg的codec引擎,format引擎,以及filter引擎的工具,并且也可以做可视化的媒体参数分析,可以通过ffplay --help 进行查看:



常见参数可以手动进行尝试:

如果希望从视频的第30秒开始播放,播放10秒钟的文件,则可以使用如下命令

#ffplay -ss 30 -t 10 input.mp4

如果希望视频播放时播放器的窗口显示标题为自定义标题,则使用如下命令

ffplay -window_title "Hello World, This is a sample" output.mp4

显示窗口如下图:


例如使用ffplay打开网络直播流,可以使用命令

# ffplay -window_title "播放测试"  rtmp://up.v.test.com/live/stream


如图播放的视频为实时网络直播视频流。



根据上图可以看到播放器播放的窗口标题已经显示为自定义设置的内容。

基本参数介绍完毕,下面进一步介绍ffplay的高级一些的参数。


ffplay高级参数

通过使用ffplay –help参数看到帮助信息比较多,其中包含了高级参数介绍,下面详细介绍一下


如上图,大多数是前面已经介绍过的参数,还有些是未介绍过的

参数 说明

X 强制设置视频显示窗口的宽度

y 强制设置视频显示窗口的高度

S 设置视频显示的宽高

fs 强制全屏显示

an 屏蔽音频

vn 屏蔽视频

Sn 屏蔽字幕

ss 根据设置的秒进行定位拖动

t 设置播放视频/音频长度

Bytes 设置定位拖动的策略,0为不可拖动,1为可拖动,-1为自动

Nodisp 关闭图形化显示窗口

f 强制使用设置的格式进行解析

window_title 设置显示窗口的标题

af 设置音频的滤镜

Codec 强制使用设置的codec进行解码

autorotate 自动旋转视频




通过使用ffplay –help参数看到帮助信息比较多,其中包含了高级参数介绍,下面详细介绍一下

参数 说明

ast 设置将要播放的音频流

vst 设置将要播放的视频流

sst 设置将要播放的字幕流

Stats 输出多媒体播放状态

Fast 非标准化规范的多媒体兼容优化

sync 音视频同步设置可设置根据音频视频进行参考,视频时间参考,或者外部扩展时间进行参考

autoexit 多媒体播放完毕自动退出ffplay,ffplay默认播放完毕不退出播放器

exitonkeydown 当有按键按下事件产生时退出ffplay

exitonmousedown 当有鼠标按键事件产生时退出ffplay

loop 设置多媒体文件循环播放次数

framedrop 当CPU资源占用过高时,自动丢帧

infbuf 设置无极限的播放器buffer,这个选项常见于实时流媒体播放场景

vf 视频滤镜设置

acodec 强制使用设置的音频解码器

vcodec 强制使用设置的视频解码器

scodec 强制使用设置的字幕解码器


下面根据这些参数与前面介绍过的一些参数进行组合:

例如从20秒播放一个视频,播放时长为10秒钟,播放完成后自动退出ffplay,播放器的窗口标题为”Hello World”,为了确认播放时长正确,可以通过系统命令time查看命令运行时长

#time ffplay -window_title "Hello World" -ss 20 -t 10 -autoexit output.mp4

该命令执行完毕之后输出如下:

real 0m10.783s

user 0m8.401s

sys 0m0.915s


例如强制使用H264解码器解码mpeg4的视频,将会报错:

# ffplay -vcodec h264 output.mp4

当视频流中出现多个Program时,播放Program与常规的播放方式则有所不同,需要指定对应的流,可以通过vst、ast、sst参数指定,例如希望播放Program 13中的音视频流,则通过如下命令行指定:

#ffplay -vst 4 -ast 5 ~/Movies/movie/ChinaTV-11.ts



通过Program 13中的信息可以看到该流名称为service_name对应的值是CCTV 9,而指定音视频流播放之后播放出来的图像也能够与之对应。

如果使用ffplay播放视频时希望加载字幕文件,则可以通过加载ASS或者SRT字幕文件来解决,下面举一个加载SRT字幕的例子,首先编辑SRT字幕文件,内容如下:


然后通过filter将字幕文件加载如播放数据中,使用命令

# ffplay -window_title "Test Movie" -vf "subtitles=input.srt" output.mp4




ffplay的数据可视化分析应用

使用ffplay除了可以播放视频流媒体文件之外,还可以作为可视化的视频流媒体分析工具,例如当播放音频文件时,不确定文件的声音是否正常,噪声数据等分析,可以直接使用ffplay播放音频文件,播放的时候将会把解码后的音频数据以音频波形显示出来:

#ffplay -showmode 1 output.mp3


从图中可以看到,音频的播放时的波形可以通过振幅显示出来,可以用来看到音频的播放情况。

例如当播放视频时体验解码器是如何解码每个宏块的,可以使用命令

# ffplay -debug vis_mb_type -window_title "show vis_mb_type" -ss 20 -t 10 -autoexit output.mp4

显示窗口内容



在输出的视频信息中,可以看到不同颜色的方块,下面来说明一下这些颜色代表着什么信息:

颜色 宏块类型条件 说明

IS_PCM (MB_TYPE_INTRA_PCM) 无损(原始采样不包含预测信息)   

(IS_INTRA && IS_ACPRED) || IS_INTRA16x16  16x16帧内预测

IS_INTRA4x4      4x4帧内预测

IS_DIRECT 无运动向量处理(B帧分片)

IS_GMC && IS_SKIP 16x16跳宏块(P或B帧分片)

IS_GMC    全局运动补偿(与H264无关)

!USES_LIST(1)  参考过去的信息(P或B帧分片)

!USES_LIST(0)  参考未来的信息(B帧分片)

USES_LIST(0) && USES_LIST(1) 参考过去和未来信息(B帧分片)


例如通过ffplay查看B帧预测与P帧预测信息,希望将信息在窗口中显示出来,使用命令

# ffplay -vismv pf output.mp4







好文章,来自【福优学苑@音视频+流媒体】
***【在线视频教程】***