FFmpeg工具

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

  ffmpeg --help
  • ffmpeg信息查询部分
  • 公共做操参数部分
  • 文件主要操作参数部分
  • 视频操作参数部分
  • 音频操作参数部分
  • 字幕操作参数部分

一、ffmpeg信息查询

命令格式如下:

ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

下面罗列一些ffmpeg常用的信息查询命令:
1、查询版本信息

ffmpeg -version

2、ffmpeg查询是否支持对应的视频文件格式
使用ffmpeg转吗,有时候可能会遇到无法解析的视频文件或者无法生成视频文件,报错提示不支持生成对应的视频文件,这时候就需要查看当前使用的ffmpeg是否支持对应的视频文件格式,需要使用ffmpeg -formats参数来查看:

ffmpeg -formats

根据上面输出的信息可以看到,输出的内容分为3个部分,具体如下。

  • 第一列是多媒体文件封装格式的Demuxing支持与Muxing支持;
  • 第二列是多媒体文件格式;
  • 第三列是文件格式的详细说明;
    3、使用ffmpeg命令时,可能会出现ffmpeg不支持某种编码格式或者某种解码格式的错误提示信息,这种错误常见于并未将该编码器或者解码器集成到ffmpeg中,若想查看ffmpeg是否支持H.264编码或者解码,
  • 可以通过ffmpeg -codecs查看全部信息,
  • 也可以通过ffmpeg -encoders查看ffmpeg是否支持H.264编码器,
  • 或者通过ffmpeg -decoders查看ffmpeg是否支持H.264解码器。
ffmpeg -codecs
ffmpeg -encoders
ffmpeg -decoders

输出信息中包含了三部分内容,具体如下。

  • 第一列包含6个字段,第一个字段用来表示此编码器为音频、视频还是字幕,第二个字段表示帧级别的多线程支持,第三个字段表示分片级别的多线程,第四个字段表示该编码为试验版本,第五个字段表示draw horiz band模式支持,第六个字段表示直接渲染模式支持
  • 第二列是编码格式
  • 第三列是编码格式的详细说明
    4、除了查看ffmpeg支持的封装(Muxer)格式与解封装(Demuxer)格式、编码(Encoder)类型与解码(Decoder)类型,还可以通过ffmpeg -filters查看ffmpeg支持哪些滤镜:
ffmpeg -filters

输出信息的内容分为四列,具体如下。

  • 第一列总共有3个字段:第一个字段是时间轴支持;第二个字段是分片线程处理支持;第三个字段是命令支持;
  • 第二列是滤镜名;
  • 第三列是转换方式,入音频转音频(A->A),视频转视频(V->V),创建音频(|->A),创建视频(|->V)等操作;
  • 第四列是滤镜作用说明;
    5、如果要了解ffmpeg支持的具体某一中demuxer,muxer类型,可以通过ffmpeg -h查看该类型的详细参数,包括encoder、decoder所支持的操作参数,filter所支持的参数,下面是几个对应的例子。
    1)查看FLV封装器的参数支持
ffmpeg -h muxer=flv

从输出的帮助信息中可以看到,FLV的muxer的信息包含两大部分,具体如下。

  • 第一部分为FLV封装的默认配置描述,如扩展名、MIME类型、默认的视频编码格式、默认的音频编码格式
  • 第二部分为FLV封装时可以支持的配置参数及相关说明
    2)查看flv解封装器的参数支持
ffmpeg -h demuxer=flv

从输出的帮助信息可以看到,FLV的demuxer的信息包含两大部分:

  • 第一部分为FLV解封装默认的扩展名。
  • 第二部分为FLV解封装时可以支持的配置参数及相关说明。
    3)查看H.264(AVC)的编码参数支持
   ffmpeg -h encoder=h264

从帮助信息可以看到,H.264(AVC)的编码参数包含两大部分,具体如下。

  • 第一部分为h.264所支持的基本编码方式,支持的多线程编码方式(例如帧级别多线程编码或Slice级别多线程编码),编码器所支持的像素的色彩格式
  • 第二部分为编码的具体配置参数及相关说明
    4)查看H.264(AVC)的解码参数支持
ffmpeg -h decoder=h264

从帮助信息可以看到,H.264(AVC)的解码参数查看包括两大部分,具体如下:

  • 第一部分为解码H.264时可以采用的常规支持、多线程方式支持(帧级别多线程解码或Slice级别多线程解码)
  • 第二部分为解码H.264时可以采用的解码参数及相关说明
    5)查看colorkey滤镜的参数支持
ffmpeg -h filter=colorkey

从帮助信息可以看到,colorkey滤镜查看信息包含两大部分,具体如下。

  • colorkey所支持的色彩格式信息,colorkey所支持的多线程处理方式,输入或输出正常
  • colorkey所支持的参数及说明
    关于ffmpeg的帮助信息查询部分已经介绍完毕,下面详细介绍ffmpeg的封装转换。

二、ffmpeg的封装转换

ffmpeg的封装转换(转封装)功能包含在AVFormat模块中,通过libavformat库进行Mux和Demux操作;多媒体文件的格式有很多种,这些格式中的很多参数在Mux与Demux的操作参数中是公用的,下面来详细介绍一下这些公用的参数。
通过查看ffmpeg --help full信息,找到AVFormatContext参数部分,该参数下的所有参数均为封装转换可使用的参数。下表列出了ffmpeg AVFormatContext的主要参数及说明。


image.png

这些都是通用的封装、解封装操作时使用的参数,后续章节中介绍转封装操作、解封装操作、封装操作时,上述参数可以与对应的命令行参数搭配使用。

三、ffmpeg的转码参数

ffmpeg编解码部分的功能主要是通过模块AVCodec来完成的,通过libavcodec库进行Encode与Decode操作。多媒体编码格式的种类有很多,但是还是有很多通用的基本操作参数设置,下面来详细介绍这些公用的参数。
通过命令ffmpeg --help full可以看到AVCodecContext参数列表信息。该选项下面的所有参数均为编解码可以使用的参数。


image.png

ffmpeg还有一些更细化的参数,本节中并未详细提及,可以根据本节中提到的查看方法查看ffmpeg的帮助文件以查看更多的内容,本节中介绍的是重点及常用的通用参数,后续章节中介绍编码操作时,上述参数可以配合对应的例子使用。

四、ffmpeg的基本转码原理

ffmpeg工具的主要用途为编码、解码、转码以及媒体格式转换,ffmpeg常用于进行转码操作,使用ffmpeg转码的主要原理如图


02c2035d611b45ffb0ff1fa9d104e600.png

通过之前介绍的参数,可以设置转码的相关参数,如果转码操作频涉及封装的改变,则可以通过设置AVCodec与AVFormat的操作参数进行封装与编码的改变,下面示例:

 ffmpeg -i test.rmvb -vcodec mpeg4 -b:v 200k -r 15 -an output.mp4

从输出信息中可以看到,以上输出的参数中使用了前面介绍过的参数,具体如下。

  • 转封装格式从RMVB格式转换为MP4格式
  • 视频编码从RV40转换为MPEG4格式
  • 视频码率从原来的674kbit/s转换为200kbit/s
  • 视频帧率从原来的30fps转换为15fps
  • 转换后的文件中不包括音频(-an参数)
  • 分辨率保持不变852x480
    可以分析出,这个例子的流程与前面提到的流程相同,首先解封装,需要解的封装为RMVB;然后解码,其中视频编码格式为RV40 ,音频为COOK;然后解码后的视频编码为MPEG4;最后封装为一个没有音频的MP4文件。

四、ffprobe常用命令

在 FFmpeg套件中,除了ffmpeg作为多媒体处理工具之外,还有ffprobe多媒体信息查看工具,ffprobe主要用来查看多媒体文件的信息,下面就来看一下ffprobe中常见的基本命令。
usage: ffprobe [OPTIONS] [INPUT_FILE] the other
ffprobe常用的参数比较多,可以通过ffprobe --help来查看详细的帮助信息。
这些输出的帮助信息既是ffprobe常用的操作参数,也是ffrpobe的基础参数。例如查看log,查看每一个音频数据包信息或者视频数据包信息,查看节目信息,查看流信息,查看每一个流有多少帧以及每一个流有多少个音视频包,查看视频像素点的格式等。下面就来根据以上的输出参数重点列举几个例子。
1)使用下面的命令,查看多媒体数据包信息:

ffprobe -show_packets 1.mp4

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

[PACKET]
codec_type=video
stream_index=0
pts=369664
pts_time=24.066667
dts=369664
dts_time=24.066667
duration=512
duration_time=0.033333
size=2875
pos=3204521
flags=__
[/PACKET]
字段 说明
codec_type 多媒体类型,如视频包、音频包等
stream_index 多媒体的stream索引
pts 多媒体的显示时间值
pts_time 根据不同格式计算过后的多媒体的显示时间
dts 多媒体的解码时间值
dts_time 根据不同格式计算过后的多媒体解码时间
duration 多媒体占用的时间值
duration_time 根据不同格式计算过后的多媒体所占用的时间值
size 多媒体包的大小
pos 多媒体所在的文件偏移位置
flags 多媒体包标记,如关键包与非关键包的标记

2)除了以上字段和信息之外,还可以通过如下的组合参数来查看包中的具体数据:

ffprobe -show_data -show_packets 1.mp4

和上面的比起来多了一个data字段,具体如下
[PACKET]
codec_type=video
stream_index=0
pts=379904
pts_time=24.733333
dts=379904
dts_time=24.733333
duration=512
duration_time=0.033333
size=2010
pos=3272564
flags=__
data=
00000000: 0000 07d6 419a cc21 3ffa 5800 0031 9893 ....A..!?.X..1..
00000010: d7e7 0641 039b 27c5 e0f8 5175 1abc 0e4f ...A..'...Qu...O
00000020: d710 f401 3224 0093 a2e5 c07e 9c30 0003 ....2$.....~.0..

略过一大段数据
00000770: 1ebe 840a 5ac2 4f9a 614c 5697 8eab fef8 ....Z.O.aLV.....
00000780: 0b59 9647 cc6d 8a4b f8c0 89e8 798e f569 .Y.G.m.K....y..I
00000790: 2aca ec22 e1f5 d2e5 31b1 010e 7725 e127 *.."....1...w%.'
000007a0: c5f4 7051 f07b 8449 649f 3fab 6a3d 3913 ..pQ.{.Id.?.j=9.
000007b0: d9e4 bdd6 0f22 fa77 2b32 35f5 f4f7 5393 .....".w+25...S.
000007c0: 1c9d fe72 1550 ba41 c774 5031 96d5 aef5 ...r.P.A.tP1....
000007d0: f1b9 77a7 ad54 0800 010f ..w..T....
[/PACKET]
从输出的内容中可以看到多媒体包中包含的数据,那么我们可以根据上述输出内容中的pos,也就是文件偏移位置来查看,pos的值为3272564,将其转换为十六进制位置为0x31EF74,这就是这个包在flv文件中的偏移量,可以使用Linux下的xxd 1.mp4命令进行查看:
0031ef70: 0000 000e 0000 07d6 419a cc21 3ffa 5800 ........A..!?.X.
0031ef80: 0031 9893 d7e7 0641 039b 27c5 e0f8 5175 .1.....A..'...Qu
0031ef90: 1abc 0e4f d710 f401 3224 0093 a2e5 c07e
0031efa0: 9c30 0003 389a 06b7 f211 fb06 362c 95a9 .0..8.......6,..
0031efb0: 0020 8f32 e280 6773 015e 78d2 87a3 e114 . .2..gs.^x.....
0031efc0: f3b3 9d2d ffd7 b202 2233 923f 3d42 bc7f ...-...."3.?=B..
可以看到从0x31EF74开始的数据和上面一致:0000 07d6 419a cc21 3ffa 5800。
通过ffprobe读取packets来进行对应的数据分析,使用show_packets与show_data配合可以进行更加精确的分析。
3)除了packets与data之外,ffprobe还可以分析多媒体的封装格式,其使用FORMAT标签括起来显示:

ffprobe -show_format 1.mp4 

[FORMAT]
filename=1.mp4
nb_streams=2
nb_programs=0
format_name=mov,mp4,m4a,3gp,3g2,mj2
format_long_name=QuickTime / MOV
start_time=0.000000
duration=25.704000
size=3307949
bit_rate=1029551
probe_score=100
TAG:major_brand=isom
TAG:minor_version=512
TAG:compatible_brands=isomiso2avc1mp41
TAG:encoder=Lavf55.33.100
[/FORMAT]
下面是对输出信息关键字段的说明:

字段 说明
filename 文件名
nb_streams 媒体中包含的流的个数
nb_programs 节目数
format_name 使用的封装模块的名称
format_long_name 封装的完整名称
start_time 媒体文件的起始时间
duration 媒体文件的的总时间长度
duration_time 根据不同格式计算过后的多媒体所占用的时间值
size 媒体文件的大小
bit_rate 媒体文件的码率

4)使用下面的命令可以查看视频文件的帧信息,输出的帧信息将使用FRAME标签括起来:

ffprobe -show_frames 1.mp4

[FRAME]
media_type=video
stream_index=0
key_frame=1
pts=0
pts_time=0.000000
pkt_dts=0
pkt_dts_time=0.000000
best_effort_timestamp=0
best_effort_timestamp_time=0.000000
pkt_duration=512
pkt_duration_time=0.033333
pkt_pos=22995
pkt_size=1888
width=720
height=1280
pix_fmt=yuv420p
sample_aspect_ratio=N/A
pict_type=I
coded_picture_number=0
display_picture_number=0
interlaced_frame=0
top_field_first=0
repeat_pict=0
color_range=tv
color_space=bt709
color_primaries=bt709
color_transfer=bt709
chroma_location=left
[/FRAME]
通过-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包的时长 512
pkt_duration_time Frame包的时长时间显示 0.033333
pkt_pos Frame包所在文件的偏移位置 22995
width 帧显示的宽度 720
height 帧显示的高度 1280
pix_fmt 帧的图像色彩格式 yuv420p
pict_type 帧类型 I 帧/ P帧 / B帧
pkt_size 每帧的大小 1888

在Windows下常用的Elecard StreamEye工具中打开查看MP4时,会很直观地看到帧类型显示,用ffprobe的pict_type同样可以看到视频的帧是I帧,P帧或者B帧;每一帧的大小同样也可以通过ffprobe的pkt_size查看到。
5)通过-show_streams参数可以查看到多媒体文件中的流信息,流的信息将使用STREAM标签括起来:

ffprobe -show_streams 1.mp4 

[STREAM]
index=0
codec_name=h264
codec_long_name=H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
profile=Main
codec_type=video
codec_tag_string=avc1
codec_tag=0x31637661
width=720
height=1280
coded_width=720
coded_height=1280
closed_captions=0
film_grain=0
has_b_frames=0
sample_aspect_ratio=N/A
display_aspect_ratio=N/A
pix_fmt=yuv420p
level=42
color_range=tv
color_space=bt709
color_transfer=bt709
color_primaries=bt709
chroma_location=left
field_order=progressive
refs=1
is_avc=true
nal_length_size=4
id=0x1
r_frame_rate=30/1
avg_frame_rate=30/1
time_base=1/15360
start_pts=0
start_time=0.000000
duration_ts=388608
duration=25.300000
bit_rate=964695
max_bit_rate=N/A
bits_per_raw_sample=8
nb_frames=759
nb_read_frames=N/A
nb_read_packets=N/A
extradata_size=39
DISPOSITION:default=1
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
DISPOSITION:timed_thumbnails=0
DISPOSITION:captions=0
DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
TAG:language=und
TAG:handler_name=VideoHandler
TAG:vendor_id=[0][0][0][0]
[/STREAM]
如以上输出内容所示,从中可以看到流的信息,具体属性及说明如下表

属性 说明
index 流所在的索引区域 0
codec_name 编码名 h264
codec_long_name 编码全名 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
profile 编码的profile Main
level 编码的level 42
has_b_frames 包含B帧信息 0
codec_type 编码类型 video
codec_tag_string 编码的标签数据 avc1
pix_fmt 图像显示的色彩格式 yuv420p
coded_width 图像的宽度 720
coded_height 图像的高度 1280
r_frame_rate 实际帧率 30/1
avg_frame_rate 平均帧率 30/1
time_base 时间基数(用来进行timestamp) 1/15360
bit_rate 码率 964695
max_bit_rate 最大码率 N/A
nb_frames 帧数 759

fprobe 使用前面的参数可以获得key-value格式的显示方式,但是阅读起来因为习惯不同,可能有的人会认为方便,有的人认为不方便;如果要进行格式化的显示,这样就需要用到ffprobe -print_format 或者 ffprobe -of 参数来进行相应的格式输出,而-print_format 支持多种格式输出,包括XML,INI,JSON,CSV,FLAT等。下面列举几种常见的格式输出的例子

ffprobe -of xml -show_streams 1.mp4



Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf55.33.100
Duration: 00:00:25.70, start: 0.000000, bitrate: 1029 kb/s
Stream #0:00x1: Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 720x1280, 964 kb/s, 30 fps, 30 tbr, 15360 tbn (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
Stream #0:10x2: Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 72 kb/s (default)
Metadata:
handler_name : SoundHandler
vendor_id : [0][0][0][0]















从输出的内容可以看到,输出的内容格式为XML格式,如果原有的业务本身就可以解析XML格式,那么就不需要更改解析引擎,直接将输出内容输出为XML格式即可,解析引擎解析Packet信息是会更方便。
输出INI格式:

ffprobe -of ini -show_streams 1.mp4

输出FLAT格式:

ffprobe -of flat -show_streams 1.mp4

输出JSON格式:

ffprobe -of json -show_streams 1.mp4

输出CSV格式:

 ffprobe -of csv -show_streams 1.mp4

通过各种格式的输出,可以使用对应的绘图方式绘制出可视化图形。
CSV格式输出后可以使用Excel打开表格形式

img.jpg

6)使用select_streams可以只查看音频(a)、视频(v),字幕(s)的信息,例如配合show_frames查看视频的frames信息:

ffprobe -show_frames v -of xml 1.mp4

可以在命令行中自行输出,输出的frame信息全部为视频相关的信息。
使用ffprobe还可以查看很多信息,我们可以通过本节介绍的help方法查看更多更详细的信息

四、ffplay常用命令

在FFmpeg中通常使用ffplay作为播放器,其实ffplay同样也可作为很多音视频的图形化分析工具,通过ffplay可以看到视频图像的运动估计方向、音频数据的波形等,以下将介绍更多参数并举例说明。
1)ffplay常用参数
ffplay不仅仅是播放器,同时也是测试ffmpeg的codec引擎、format引擎,以及filter引擎的工具,并且还可以进行可视化的媒体参数分析。其可以通过ffplay --help进行查看:

ffplay --help

Simple media player
usage: ffplay [options] input_file

Main options:
-L show license
-h topic show help
-? topic show help
-help topic show help
--help topic show help
-version show version
-buildconf show build configuration
-formats show available formats
-muxers show available muxers
-demuxers show available demuxers
-devices show available devices
-codecs show available codecs
-decoders show available decoders
-encoders show available encoders
-bsfs show available bit stream filters
-protocols show available protocols
-filters show available filters
-pix_fmts show available pixel formats
-layouts show standard channel layouts
-sample_fmts show available audio sample formats
-dispositions show available stream dispositions
-colors show available color names
-loglevel loglevel set logging level
-v loglevel set logging level
-report generate a report
-max_alloc bytes set maximum size of a single allocated block
-sources device list sources of the input device
-sinks device list sinks of the output device
-x width force displayed width
-y height force displayed height
-s size set frame size (WxH or abbreviation)
-fs force full screen
-an disable audio
-vn disable video
-sn disable subtitling
-ss pos seek to a given position in seconds
-t duration play "duration" seconds of audio/video
-bytes val seek by bytes 0=off 1=on -1=auto
-seek_interval seconds set seek interval for left/right keys, in seconds
-nodisp disable graphical display
-noborder borderless window
-alwaysontop window always on top
-volume volume set startup volume 0=min 100=max
-f fmt force format
-window_title window title set window title
-af filter_graph set audio filters
-showmode mode select show mode (0 = video, 1 = waves, 2 = RDFT)
-i input_file read specified file
-codec decoder_name force decoder
-autorotate automatically rotate video
这只是Main options里面的部分,另外还有Advanced options,AVCodecContext AVOptions等等很多内容。就上述帮助信息的输出所示,有些是前面已经介绍过的参数,这里就不再一一赘述,一些未介绍的参数说明见下表

参数 说明
x 强制设置视频显示窗口的宽度
y 强制设置视频显示窗口的高度
s 设置视频显示的宽高
fs 强制全屏显示
an 屏蔽音频
vn 屏蔽视频
sn 屏蔽字幕
ss 根据设置的秒进行定位拖动
t 设置播放视频/音频的长度
bytes 设置定位拖动的策略,0为不可拖动,1为可拖动,-1为自动
nodisp 关闭图形化显示窗口
f 强制使用设置的格式进行解析
window_title 设置显示窗口的标题
af 设置音频的滤镜
codec 强制使用设置的codec进行解码
autorotate 自动旋转视频

常见参数可以手动进行尝试,下面列举几个示例。
*如果希望从视频的第5秒开始播放,播放5秒钟的文件,则可以使用如下命令

ffplay -ss 5 -t 5 1.mp4

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

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

*如果希望使用ffplay打开网络直播流,则可以使用如下命令:

ffplay -window_title "播放测试" ramp://up.v.test.com/live/stream  (已经不可用)
ffplay -window_title "播放测试" http://1011.hlsplay.aodianyun.com/demo/game.flv (测试可用)
ffplay -window_title "播放测试" rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov (测试可用)

可以看出ffplay可以支持的协议有多种,ramp,rtmp,http等等都支持。
显示如下窗口内容

image.png

可以看到播放器播放的窗口标题已经显示为自定义设置的内容啦。
基本参数介绍完毕,下面进一步介绍ffplay的高级参数。
2)ffplay高级参数
使用ffplay --help展示的帮助信息,其中的Main options部分我们上面已经介绍过了。下面介绍Advanced options的部分。
Advanced options:
-cpuflags flags force specific cpu flags
-cpucount count force specific cpu count
-hide_banner hide_banner do not show program banner
-ast stream_specifier select desired audio stream
-vst stream_specifier select desired video stream
-sst stream_specifier select desired subtitle stream
-pix_fmt format set pixel format
-stats show status
-fast non spec compliant optimizations
-genpts generate pts
-drp let decoder reorder pts 0=off 1=on -1=auto
-lowres
-sync type set audio-video sync. type (type=audio/video/ext)
-autoexit exit at the end
-exitonkeydown exit on key down
-exitonmousedown exit on mouse down
-loop loop count set number of times the playback shall be looped
-framedrop drop frames when cpu is too slow
-infbuf don't limit the input buffer size (useful with realtime streams)
-left x pos set the x position for the left of the window
-top y pos set the y position for the top of the window
-vf filter_graph set video filters
-rdftspeed msecs rdft speed
-default generic catch all option
-acodec decoder_name force audio decoder
-scodec decoder_name force subtitle decoder
-vcodec decoder_name force video decoder
-find_stream_info read and decode the streams to fill missing information with heuristics
-filter_threads number of filter threads per graph
下面就其中的部分详细说明一下

参数 说明
ast 设置将要播放的音频流
vst 设置将要播放的视频流
sst 设置将要播放的字幕流
stats 输出多媒体播放状态
fast 非标准化规范的多媒体兼容优化
sync 音视频同步设置可根据音频时间、视频时间或者外部扩展时间进行参考
autoexit 多媒体播放完毕之后自动退出ffplay,ffplay默认完毕之后不退出播放器
exitonkeydown 当有按钮按下事件产生时退出ffplay
exitonmousedown 当有鼠标按下事件产生时退出ffplay
loop 设置多媒体文件循环播放的次数
framedrop 当cpu资源占用过高时,自动丢帧
infbuf 设置无极限的播放器buffer,这个选项常见于实时流媒体播放场景
vf 视频滤镜设置
acodec 强制使用设置的音频解码器
vcodec 强制使用设置的视频解码器
scodec 强制使用设置的字幕解码器

下面将这些参数与前面介绍过的一些参数进行组合,举几个例子。
1⃣️从10秒播放一个视频,播放时长为5秒,播放完毕后自动退出ffplay,播放器的窗口标题为“Hello World”,为了确认播放时长正确,可以通过系统命令time查看命令运行时长:

time ffplay -window_title "Hello World" -ss 10 -t 5 -autoexit 1.mp4

可以看到输出结果如下:
ffplay -window_title "Hello World" -ss 10 -t 5 -autoexit 1.mp4 0.94s user 0.52s system 22% cpu 6.502 total
2⃣️如果强制使用H.264解码器解码MPEG4的视频,将会报错

ffplay -vcodec h264 1.mp4

我们这个视频是h264编码,所以可以正常播放。
查看视频编码可以使用

ffprobe test.rmvb      //这是一个RV40编码格式的视频

查看ffmpeg支持的解码格式

 ffmpeg -decoders

下面这个方式解码就会报错

ffplay -vcodec rv40  1.mp4

前面举过的例子中,我们看到的比较多的是单节目的流,多节目的流,常用于广电行业的视频。当视频中出现多个Program时,播放Program与常规的播放方式有所不同,需要指定对应的流,可以通过vst,ast,sst参数来指定,例如希望播放Program 13中的音视频流,视频编号为4,音频编号为5,则可以通过如下命令进行制定:

replay -vst 4 -ast 5 demo.ts

有条件的朋友可以自己找视频来查看。
3⃣️如果使用ffplay播放视频时希望加载字幕文件,则可以通过加载ASS或者SRT字幕文件来解决,下面列举一个加载SRT字幕的例子,首先编辑SRT字幕文件,内容如下:
1
00:00:01.000 --> 00:00:05.000
这是我 我是谁
2
00:00:05.001 --> 00:00:10.000
我爱中国
3
00:00:10.001 --> 00:00:15.000
为人民服务
4
00:00:18.001 --> 00:00:20.000
疫情早日结束,国泰民安!

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

ffplay -window_title "我爱祖国" -vf "subtitles = zimu.srt" 1.mp4

播放的效果如下:


image.png

可以看出,视频中已经将SRT格式的文字字幕加入到视频中并展现了出来。
2)ffplay的数据可视化分析应用
使用ffplay除了可以播放视频流媒体文件之外,还可以作为可视化的视频流媒体分析工具,例如播放音频文件时,如果不确定文件的声音是否正常,则可以直接使用ffplay播放音频文件,播放的时候其将会把解码后的音频数据以音频波形的形式显示出来,

ffplay -showmode 1 1.mp3

命令行执行后的效果如下:


企业微信截图_8d1f0d92-71ae-4cc7-9782-8c5e4da7be6e.png

从图中可以看到,音频播放时的波形可以通过振幅显示出来,可以用来查看音频的播放情况。
当播放视频时想要体验解码器是如何解码每个宏块的,可以使用如下命令

ffplay -debug mb_type -window_title "show vis_mb_type" -ss 5 -t 5 -autoexit test.mp4 

新版FFmpeg此方法已经不再支持啦,可参考
https://trac.ffmpeg.org/wiki/Debug/MacroblocksAndMotionVectors

我们可以使用ffmpeg或者ffplay来分析视频文件中的运动向量。ffmpeg的早期版本(2017年10月之前)也允许分析宏块,但此选项已被删除。
'codecview'过滤器可用于将运动向量显示为每个宏块的小箭头。它采用一个叫mv的选项,它指定了要绘制的运动向量的类型:

参数 说明
pf P帧前向预测运动向量
bf B帧前向预测运动向量
bb B帧后向预测运动向量

你可以使用如下的命令

ffplay -flags2 +export_mvs input.mp4 -vf codecview=mv=pf+bf+bb
ffmpeg -flags2 +export_mvs -i input.mp4 -vf codecview=mv=pf+bf+bb output.mp4

第一条命令是直接用ffplay显示视频。
第二条命令是把生成的带有运动向量的视频保存到output.mp4中。
显示效果如下:

image.png

注意事项:
早期版本的 ffmpeg 没有此过滤器,但支持现已弃用的 -vismv 选项。
此选项不适用于不导出运动矢量的编解码器(大多数非基于 MPEG 的编解码器)

你可能感兴趣的:(FFmpeg工具)