FFmpeg 工具:音视频开发都用它,快@你兄弟来看丨音视频工具

vx 搜索『gjzkeyframe』 关注『关键帧Keyframe』来及时获得最新的音视频技术文章。

毕加索《灯》像素版

去公众号发送消息『像素王国』,帮你生成像素风格图片

(本文基本逻辑:ffmpeg 常用命令介绍 → ffplay 常用命令介绍 → ffprobe 常用命令介绍)

从事音视频开发的程序员几乎都应该知道或使用过 FFmpeg。FFmpeg 是一个开源软件,采用 LGPL 或 GPL 许可证(需要注意这里的开源协议,它具有『传染性』,会要求它的使用方也开源)。我们可以使用 FFmpeg 来进行多种格式音频和视频的录制、转换、流处理功能。

FFmpeg 由多个组件组成,包含了命令行应用程序以及一系列函数库:

  • 命令行应用程序:

  • ffmpeg:用于音视频的编解码、格式转换以及音视频流的内容处理。

  • ffplay:基于 SDL 与 ffmpeg 库实现的一个播放器。

  • ffprobe:音视频分析工具。

  • 函数库:

  • libavcodec:编解码库。

  • libavformat:音视频容器格式以及所支持的协议的封装和解析。

  • libavutil:提供了一些公共函数,工具库。

  • libavfilter:音视频的滤镜库,如视频加水印、音频变声等。

  • libavdevice:支持众多设备数据的输入与输出,如读取摄像头数据、屏幕录制。

  • libswresample, libavresample:提供音频的重采样工具库。

  • libswscale:提供对视频图像进行色彩转换、缩放以及像素格式转换,如图像的 YUV 转换。

  • libpostproc:多媒体后处理器。

如果你使用 Mac 设备,在 Mac 上安装 FFmpeg 可以用 Homebrew

$ brew install ffmpeg

至于 Homebrew 的安装,以及使用它安装 ffmpeg 的相关细节,这里就不做过多探讨了。

本文主要介绍 FFmpeg 命令行应用程序的使用,这是我们在音视频开发中必不可少的工具。

1、ffmpeg 命令行工具

ffmpeg 是一个音视频编解码、格式转换以及音视频流内容处理的工具。

1.1、基础能力

通过下列命令可以查看当前 ffmpeg 工具所支持的能力:

// 获取帮助$ ffmpeg -help// 支持的格式$ ffmpeg -formats// 支持的解码$ ffmpeg -decoders// 支持的编码$ ffmpeg -encoders// 支持的协议$ ffmpeg -protocols

1.2、转封装

可以使用下列命令来转封装:

$ ffmpeg -i <输入文件路径> -c copy -f <输出封装格式> <输入文件路径>

1)转 MP4

MP4 是当下短视频最常使用的封装格式,关于 MP4 格式更详细的介绍,参见《MP4 格式》

FFmpeg 封装 MP4 常用参数:

FFmpeg 封装 MP4 常用参数

示例:将 FLV 的文件转封装成 MP4 并将 moov box 移动到文件头部。

$ ffmpeg -i input.flv -c copy -f mp4 -movflags faststart output.mp4

2)转 FLV

FLV 是当下实时直播最常使用的封装格式,关于 FLV 格式更详细的介绍,参见《FLV 格式》

FFmpeg 封装 FLV 常用参数:


FFmpeg 封装 FLV 常用参数

示例:将 MP4 的文件转封装成 FLV。

$ ffmpeg -i input.mp4 -c copy -f flv output.flv

FLV 封装中可以支持的音频编码和视频编码是有限的,在转封装的时候,如果音频或视频不符合标准时,会封装不了而报错。一般,我们可以在转封装的时候同时将音频和视频转码成 FLV 支持的格式。

示例:将 MP4 的文件转封装成 FLV 并确保音频转码为 AAC。

$ ffmpeg -i input.mp4 -vcodec copy -acodec aac -f flv output.flv

3)转 HLS

HLS 是当下直播回放和部分实时直播场景最常使用的协议,它对应的媒体格式是 M3U8 + TS,关于 HLS 更详细的介绍,参见《HLS 协议》《M3U8 格式》《TS 格式》

FFmpeg 封装 HLS 常用参数:

FFmpeg 封装 HLS 常用参数

示例:将 MP4 的文件转封装成 HLS 直播。

$ ffmpeg -re -i input.mp4 -c copy -f hls -bsf:v h264_mp4toannexb output.m3u8

因为默认是 HLS 直播,所以生成的 M3U8 文件内容会随着切片的产生而更新。这里多了一个 -bsf:v h264_mp4toannexb 参数,它的作用是将 MP4 中的 H.264 数据转换为 H.264 AnnexB 标准的编码,AnnexB 标准的编码常见于实时传输流中。如果源文件为 FLV、TS 等可作为直播传输流的视频,则不需要这个参数。

  • re:表示以本地帧率读数据。
  • bsf:表示 Binary Stream Filter。

4)音视频流抽取

FFmpeg 除了转封装、转码之外,还可以提取音频流和视频流。

示例:从 MP4 文件中提取 AAC 音频流。

$ ffmpeg -i input.mp4 -vn -acodec copy output.aac
  • vn:表示不包含视频。

示例:从 MP4 文件中提取 H.264 视频流。

$ ffmpeg -i input.mp4 -an -vcodec copy output.h264
  • an:表示不包含音频。

示例:从 MP4 文件中提取 H.265 视频流。

$ ffmpeg -i input.mp4 -an -vcodec copy -bsf hevc_mp4toannexb -f hevc output.hevc

1.3、转码

FFmpeg 一般使用 libx264 来进行软编码。下面是 x264 相关的编码参数:

FFmpeg x264编码常用参数

1)Preset

示例:设置 preset 预设参数为 ultrafast 进行转码。

$ ffmpeg -i input.mp4 -vcodec libx264 -preset ultrafast -b:v 2000k output.mp4
  • b:v:表示视频输出码率。

2)Profile

示例:设置 profile 为 high 进行转码。

$ ffmpeg -i input.mp4 -vcodec libx264 -profile:v high -level 3.1 -s 720x1280 -an -y -t 10 output_high.ts
  • y:表示覆盖输出文件。
  • s:表示输出分辨率。

使用 main profile 和 high profile 编码出来的视频是可以包含 B 帧的,转码完后,可以看一下:

$ ffprobe -v quiet -show_frames -select_streams v output_high.ts | grep "pict_type=B" | wc -l

3)GOP

示例:设置 GOP 为 50 帧,并且场景切换时不插入关键帧。

$ ffmpeg -i input.mp4 -c:v libx264 -g 50 -sc_threshold 0 -t 60 -y output.mp4
  • g:以帧为单位设置 GOP 大小。
  • sc_threshold:设定是否在场景切换时插入关键帧。0 表示不插入,1 表示插入。

4)B 帧

由于设置 x264 的参数比较多,所以 FFmpeg 开放了 x264opts 来设置 x264 内部的私有参数。

示例:设置 GOP 为 50 帧,并且场景切换时不插入关键帧,且不出现 B 帧。

$ ffmpeg -i input.mp4 -c:v libx264 -x264opts "bframes=0" -g 50 -sc_threshold 0 -t 60 -y output.mp4

示例:设置 GOP 为 50 帧,并且场景切换时不插入关键帧,且 2 个 P 帧之间存放 3 个 B 帧。

$ ffmpeg -i input.mp4 -c:v libx264 -x264opts "bframes=3:b-adapt=0" -g 50 -sc_threshold 0 -t 60 -y output.mp4

5)码率

编码时能够设置 VBR、CBR 编码模式,VBR 表示可变码率,CBR 表示恒定码率。

示例:

$ ffmpeg -i input.mp4 -c:v libx264 -x264opts "bframes=10:b-adapt=0" -b:v 1000k -maxrate 1000k -minrate 1000k -bufsize 50k -nal-hrd cbr -g 50 -sc_threshold 0 -t 60 -y output.ts

上面的命令比较复杂,分别做了这些事:

  • -x264opts "bframes=10:b-adapt=0":设置 B 帧个数为 2 个 P 帧之间包含 10 个 B 帧。
  • -b:v 1000k:设置视频平均码率为 1000kbps。
  • -maxrate 1000k:设置视频最大码率为 1000kbps。
  • -minrate 1000k:设置视频最小码率为 1000kbps。
  • -bufsize 50k:设置编码的 buffer 大小为 50KB。
  • -nal-hrd cbr:设置 H.264 的编码 HRD 信号形式为 CBR。
  • -g 50:设置每 50 帧一个 GOP。
  • -sc_threshold 0:设置场景切换不插入关键帧。

1.4、流媒体

1)发布 RTMP 流

RTMP 是当下实时直播最常使用的推流协议,关于 RTMP 协议更详细的介绍,参见《RTMP 协议》

FFmpeg 操作 RTMP 直播流使用的参数:

FFmpeg 操作RTMP常用参数

示例:本地 MP4 视频文件转封装为 FLV 后推流至指定 RTMP 流媒体服务器。

$ ffmpeg -re -i input.mp4 -c copy -f flv rtmp://localhost:1935/live/room

2)录制 RTMP 流

示例:RTMP 媒体流保存为 FLV 视频文件。

$ ffmpeg -i rtmp://localhost:1935/live/room -c copy output.flv

3)录制 HTTP 流

在流媒体服务中,HTTP 服务是最为常见的,尤其是点播。直播也是可以的,包括 HTTP-FLV、HTTP-TS、HLS。

FFmpeg 操作 HTTP 使用的参数:

FFmpeg 操作HTTP常用参数

示例:拉取并录制 FLV 直播流。

$ ffmpeg -i http://www.abc.com/live.flv -c copy -f flv output.flv

示例:拉取 TS 直播流流录制为 FLV。

$ ffmpeg -i http://www.abc.com/live.ts -c copy -f flv output.flv

示例:拉取 HLS 直播流流录制为 FLV。

$ ffmpeg -i http://www.abc.com/live.m3u8 -c copy -f flv output.flv

2、ffplay 命令行工具

ffplay 是基于 SDL 与 ffmpeg 库实现的一个播放器,可以使用它来播放原始的 YUV/PCM 数据、编码后的 H.264/H.265 等数据,封装好的 MP4/M4A 等数据,或是流媒体数据。

1)播放原始声音数据

$ ffplay -f <格式名> -ac <声道数> -ar <采样率> -i <文件路径>

其中,-f 表示 PCM 格式,可以用 ffmpeg -formats | grep PCM 命令查看当前支持的格式。

示例:

$ ffplay -f f32le -ac 1 -ar 48000 -i input.pcm

2)播放原始图像数据

$ ffplay -f <文件格式> -pixel_format <像素格式> -video_size <视频尺寸> -i <文件路径>

其中,-pixel_format 表示像素格式,可以用 ffplay -pix_fmts 命令开查看当前支持的格式。

示例:

$ ffplay -f rawvideo -pixel_format yuv420p -video_size 1280x720 -i input.yuv

3)播放编码数据

使用 ffplay 播放编码后的视频或音频文件如下所示:

$ ffplay -i <文件路径>

示例:

$ ffplay -i input.h264

4)播放封装数据

使用 ffplay 播放封装好的视频或音频文件如下所示:

$ ffplay -i <文件路径>

示例:

$ ffplay -i input.mp4

不过,这里还有一些可能会用到的功能可以关注一下:

4.1)播放控制

在播放音频或视频时,使用下列键盘按键可以进行播放控制:

  • w,切换播放模式,比如在音频波形图、音频频谱图、视频画面之间切换。
  • s,步进模式,每按一次就播放下一帧图像。
  • right,快进 10 s。
  • left,快退 10 s。
  • up,快退 1 min。
  • down,快退 1 min。
  • space,暂停。
  • esc,退出。

4.2)循环播放

通过 -loop 指定循环次数。

$ ffplay -loop <循环播放次数> -i <文件路径>

4.3)播放某一路音频或视频

通过 -ast-vst 分别指定音频流和视频流编号。

$ ffplay -ast <音频流编号> -i <文件路径>$ ffplay -vst <视频流编号> -i <文件路径>

如果不存在对应编号的音频流或视频流,则静音或没有画面。

4.4)设置音视频同步方式

通过 -sync 指定音视频同步方式。

$ ffplay -sync <同步方式> -i <文件路径>

其中同步方式有 3 种,包括:

  • audio,以音频时钟为基准。
  • video,以视频时钟为基准。
  • ext,已外部时钟为基准。

3、ffprobe 命令行工具

ffprobe 是 FFmpeg 源码编译后生成的一个可执行程序。ffprobe 是一个很强大的多媒体分析工具,它可以从媒体文件或媒体流中获得音视频及媒体容器的参数信息。

1)查看媒体封装信息

使用 -show_format 来查看媒体封装信息。

$ ffprobe -show_format <文件路径>

下面是输出信息示例及字段含义说明:

[FORMAT]filename=http://www.example.com/1.flvnb_streams=2nb_programs=0format_name=flvformat_long_name=FLV (Flash Video)start_time=4088.213000duration=0.000000size=N/Abit_rate=N/Aprobe_score=100TAG:fileSize=0TAG:audiochannels=2TAG:encoder=xxx[/FORMAT]
  • filename:文件名。
  • nb_streams:封装的流的数量,对应 AVFormatContext->nb_streams
  • nb_programs:对应 AVFormatContext->nb_programs
  • format_name:封装格式,对应 AVFormatContext->iformat->name
  • format_long_name:封装格式完整名,对应 AVFormatContext->iformat->long_name
  • start_time:开始时间,对应 AVFormatContext->start_time,基于 AV_TIME_BASE_Q,单位为秒。
  • duration:时长,对应 AVFormatContext->duration,基于 AV_TIME_BASE_Q,单位为秒。
  • size:大小,对应 avio_size(AVFormatContext->pb),单位字节。
  • bit_rate:码率,对应 AVFormatContext->bit_rate
  • probe_score:表示输入媒体文件的格式与其实际数据格式的匹配度,匹配度高则得分高(比如:1.mp4 确实是 mp4 格式),匹配度低则得分低(比如:1.mp4 其实是 wav 的格式)。对应 AVFormatContext->probe_score
  • TAG:*:TAG 是从 metadata dump 处理的信息。

2)查看媒体流信息

使用 -show_streams 来查看媒体流信息。

$ ffprobe -show_streams <文件路径>

下面是输出信息示例及字段含义说明:

[STREAM]index=0codec_name=h264codec_long_name=H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10profile=Highcodec_type=videocodec_time_base=1/30codec_tag_string=[0][0][0][0]codec_tag=0x0000width=720height=1280coded_width=720coded_height=1280has_b_frames=1sample_aspect_ratio=N/Adisplay_aspect_ratio=N/Apix_fmt=yuv420plevel=31color_range=unknowncolor_space=unknowncolor_transfer=unknowncolor_primaries=unknownchroma_location=leftfield_order=progressivetimecode=N/Arefs=1is_avc=truenal_length_size=4id=N/Ar_frame_rate=15/1avg_frame_rate=15/1time_base=1/1000start_pts=1030start_time=1.030000duration_ts=N/Aduration=N/Abit_rate=N/Amax_bit_rate=N/Abits_per_raw_sample=8nb_frames=N/Anb_read_frames=N/Anb_read_packets=N/ADISPOSITION:default=0DISPOSITION:dub=0DISPOSITION:original=0DISPOSITION:comment=0DISPOSITION:lyrics=0DISPOSITION:karaoke=0DISPOSITION:forced=0DISPOSITION:hearing_impaired=0DISPOSITION:visual_impaired=0DISPOSITION:clean_effects=0DISPOSITION:attached_pic=0DISPOSITION:timed_thumbnails=0[/STREAM][STREAM]index=1codec_name=aaccodec_long_name=AAC (Advanced Audio Coding)profile=LCcodec_type=audiocodec_time_base=1/48000codec_tag_string=[0][0][0][0]codec_tag=0x0000sample_fmt=fltpsample_rate=48000channels=2channel_layout=stereobits_per_sample=0id=N/Ar_frame_rate=0/0avg_frame_rate=0/0time_base=1/1000start_pts=55start_time=0.055000duration_ts=N/Aduration=N/Abit_rate=N/Amax_bit_rate=N/Abits_per_raw_sample=N/Anb_frames=N/Anb_read_frames=N/Anb_read_packets=N/ADISPOSITION:default=0DISPOSITION:dub=0DISPOSITION:original=0DISPOSITION:comment=0DISPOSITION:lyrics=0DISPOSITION:karaoke=0DISPOSITION:forced=0DISPOSITION:hearing_impaired=0DISPOSITION:visual_impaired=0DISPOSITION:clean_effects=0DISPOSITION:attached_pic=0DISPOSITION:timed_thumbnails=0[/STREAM]

视频流:

  • index:当前流的索引号,对应 AVStream->index

  • codec_name:解码器名称,对应 AVCodecDescriptor *cd = avcodec_descriptor_get(AVStream->codecpar->codec_id); cd->name

  • codec_long_name:解码器全名,对应 cd->long_name

  • profile:编码等级,通过 avcodec_profile_name(AVStream->codecpar->codec_id, AVStream->codecpar->profile) 获得。

  • codec_type:流类型,即 av_get_media_type_string(AVStream->codecpar->codec_type)

  • codec_time_base:编码的时间戳计算基础单位,对应 AVStream->codec->time_base

  • codec_tag_string:编码器标签描述,对应 av_fourcc2str(AVStream->codecpar->codec_tag)

  • codec_tag:对应 AVStream->codecpar->codec_tag

  • width:有效区域的宽度,对应 AVStream->codecpar->width

  • height:有效区域的高度,对应 AVStream->codecpar->height

  • coded_width:视频帧宽度,可能与上面的宽度不同,因为有一些编码器要求帧的宽或高是某个数的倍数,所以如果输入的视频帧的宽或高不符合对应的规则时,则需要做填充,这里的 coded_width 就是填充后的宽度,在解码时需要用到这个参数来做对应的裁剪。对应 AVStream->codec->coded_width

  • coded_height:视频帧高度,可能与上面的高度不同,对应 AVStream->codec->coded_height

  • has_b_frames:是否包含 B 帧。

  • sample_aspect_ratio:简称 SAR,指的是图像采集时,横向采集点数与纵向采集点数的比例。FFmpeg提供了多个 SAR:AVStream->sample_aspect_ratioAVStream->codecpar->sample_aspect_ratioAVFrame->sample_aspect_ratio,通过 av_guess_sample_aspect_ratio 获取最终的 SAR。

  • display_aspect_ratio:简称 DAR,指的是真正展示的图像宽高比,在渲染视频时,必须根据这个比例进行缩放。通过 av_reduce 计算得到,PAR * SAR = DAR,其中 PAR 是 Pixel Aspect Ratio,表示单个像素的宽高比,大多数情况像素宽高比为 1:1,也就是一个正方形像素,如果不是 1:1,则该像素可以理解为长方形像素。

  • pix_fmt:像素格式,对应 av_get_pix_fmt_name(AVStream->codecpar->format)

  • level:编码参数,对应AVStream->codecpar->level

  • color_range:额外的色彩空间特征,对应 av_color_range_name(AVStream->codecpar->color_range)AVCOL_RANGE_MPEG 对应 TV,AVCOL_RANGE_JPEG 对应 PC。

  • color_space:YUV 彩色空间类型,对应 av_color_space_name(AVStream->codecpar->color_space)

  • color_transfer:颜色传输特性,对应 av_color_transfer_name(AVStream->codecpar->color_trc)

  • color_primaries:对应 av_color_primaries_name(AVStream->codecpar->color_primaries)

  • chroma_location:色度样品的位置,对应 av_chroma_location_name(AVStream->codecpar->chroma_location)

  • field_order:交错视频中字段的顺序,对应 AVStream->codecpar->field_order

  • timecode:通过 av_timecode_make_mpeg_tc_string 处理 AVStream->codec->timecode_frame_start 获得。

  • refs:参考帧数量,即 AVStream->codec->refs

  • is_avc:是否 AVC。

  • nal_length_size:表示用几个字节表示 NALU 的长度。

  • id

  • r_frame_rate:当前流的基本帧率,这个值仅是一个猜测,对应于 AVStream->r_frame_rate

  • avg_frame_rate:平均帧率,对应于 AVStream->avg_frame_rate

  • time_base:AVStream 的时间基准,即 AVStream->time_base

  • start_pts:流开始的 PTS 时间戳,基于 time_base,即 AVStream->start_time

  • start_time:转换 start_pts * time_base 之后的开始时间,单位秒。

  • duration_ts:流时长,基于 time_base,即 AVStream->duration

  • duration:转换 duration_ts * time_base 之后的时长,单位秒。

  • bit_rate:码率,即 AVStream->codecpar->bit_rate

  • max_bit_rate:最大码率,即 AVStream->codec->rc_max_rate

  • bits_per_raw_sample:每个采样或像素的比特数,即 AVStream->codec->bits_per_raw_sample

  • nb_frames:视频流中的帧数,即 AVStream->nb_frames

  • nb_read_frames:略。

  • nb_read_packets:略。

  • TAG:*:对应 AVStream->metadata 中的信息。

  • TAG:rotate:逆时针的旋转角度(相当于正常视频的逆时针旋转角度)。

  • side_data:在视频流中,有时候我们还会看到 side_data 数据,对应 AVStream->side_data,示例如下:

[SIDE_DATA]// side_data 数据类型,Display Matrix 表示一个 3*3 的矩阵,这个矩阵需要应用到解码后的视频帧上,才能正确展示:side_data_type=Display Matrixdisplaymatrix=00000000:   0 65536    000000001: -65536  0    000000002:   0  0 1073741824// 顺时针旋转 90 度还原视频rotation=-90[/SIDE_DATA]

音频流:

  • sample_fmt:采样格式,通过 av_get_sample_fmt_name(AVStream->codecpar->format) 获取。
  • sample_rate:采样率,即 AVStream->codecpar->sample_rate
  • channels:声道数,即 AVStream->codecpar->channels
  • channel_layout:声道类型,与 channels 是相对应,通过 av_bprint_channel_layout 获取,比如:mono 表示单声道,stereo 表示多声道。

3)查看媒体数据包信息

使用 -show_streams 来查看媒体数据包信息。

$ ffprobe -show_packets <文件路径>

下面是输出信息示例及字段含义说明:

[PACKET]codec_type=audiostream_index=0pts=1690083pts_time=1690.083000dts=1690083dts_time=1690.083000duration=23duration_time=0.023000convergence_duration=N/Aconvergence_duration_time=N/Asize=470pos=2757652flags=K_[/PACKET][PACKET]codec_type=videostream_index=1pts=1690232pts_time=1690.232000dts=1690099dts_time=1690.099000duration=33duration_time=0.033000convergence_duration=N/Aconvergence_duration_time=N/Asize=11253pos=2758139flags=__[/PACKET]
  • codec_type:帧类型。audio 表示音频帧,video 表示视频帧。
  • stream_index:当前帧所属流的索引,对应于 AVStream->index
  • pts:帧的展示时间戳,即 AVPacket->pts,基于 AVStream->time_base 时间基准。
  • pts_time:转换 pts * time_base 之后的时长,单位秒。
  • dts:帧的解码时间戳,即 AVPacket->dts,基于 AVStream->time_base 时间基准。
  • dts_time:转换 dts * time_base 之后的时长,单位秒。
  • duration:当前帧的时长,等于下一帧的 pts 减去当前帧 pts,即 AVPacket->duration,基于 AVStream->time_base 时间基准。
  • duration_time:转换 duration * time_base 之后的时长,单位秒。
  • convergence_duration:略。
  • convergence_duration_time:略。
  • size:当前帧的大小。
  • pos:当前帧的位置,等于上一帧的 pos 加上当前帧的 size。
  • flags:略。

4)查看媒体帧信息

使用 -show_frames 来查看媒体帧信息。

$ ffprobe -show_frames <文件路径>

下面是输出信息示例及字段含义说明:

[FRAME]media_type=videostream_index=1key_frame=0pkt_pts=2084699pkt_pts_time=2084.699000pkt_dts=2084699pkt_dts_time=2084.699000best_effort_timestamp=2084699best_effort_timestamp_time=2084.699000pkt_duration=33pkt_duration_time=0.033000pkt_pos=3751477pkt_size=2665width=720height=1280pix_fmt=yuv420psample_aspect_ratio=N/Apict_type=Bcoded_picture_number=334display_picture_number=0interlaced_frame=0top_field_first=0repeat_pict=0color_range=unknowncolor_space=unknowncolor_primaries=unknowncolor_transfer=unknownchroma_location=left[/FRAME][FRAME]media_type=audiostream_index=0key_frame=1pkt_pts=2084707pkt_pts_time=2084.707000pkt_dts=2084707pkt_dts_time=2084.707000best_effort_timestamp=2084707best_effort_timestamp_time=2084.707000pkt_duration=23pkt_duration_time=0.023000pkt_pos=3775354pkt_size=472sample_fmt=fltpnb_samples=1024channels=2channel_layout=stereo[/FRAME]

视频帧:

  • media_type=:帧类型,即 av_get_media_type_string(AVStream->codecpar->codec_type)
  • stream_index:当前帧所属流的索引,对应于 AVStream->index
  • key_frame:是否关键帧(IDR)。
  • pkt_pts:帧的展示时间戳,即 AVFrame->pts,基于 AVStream->time_base 时间基准。
  • pkt_pts_time:转换 pkt_pts * time_base 之后的时长,单位秒。
  • pkt_dts:帧的解码时间戳,即 AVFrame->dts,基于 AVStream->time_base 时间基准。
  • pkt_dts_time:转换 pkt_dts * time_base 之后的时长,单位秒。
  • best_effort_timestamp:帧时间戳,基本与 pts 相同,如果当前 pts 存在不合理值,会尝试进行一系列校准来得到这个更合理的值,对应 AVFrame->best_effort_timestamp,基于 AVStream->time_base 时间基准。
  • best_effort_timestamp_time:转换 best_effort_timestamp * time_base 之后的时长,单位秒。
  • pkt_duration:对应的 AVPacket 的帧时长,即 AVFrame->pkt_duration,基于 AVStream->time_base 时间基准。
  • pkt_duration_time:转换 pkt_duration * time_base 之后的时长,单位秒。
  • pkt_pos:从最后一个已输入解码器的 AVPacket 重新排序的位置,即 AVFrame->pkt_pos
  • pkt_size:对应的 AVPacket 的帧大小,即 AVFrame->pkt_size
  • width:旋转之前的帧宽度,即 AVFrame->width
  • height:旋转之前的帧高度,即 AVFrame->height
  • pix_fmt:像素格式,对应 av_get_pix_fmt_name(AVFrame->format)
  • sample_aspect_ratio:简称 SAR,指的是图像采集时,横向采集点数与纵向采集点数的比例。FFmpeg提供了多个 SAR:AVStream->sample_aspect_ratioAVStream->codecpar->sample_aspect_ratioAVFrame->sample_aspect_ratio,通过 av_guess_sample_aspect_ratio 获取最终的 SAR。
  • pict_type:视频帧的图片类型,即 av_get_picture_type_char(frame->pict_type)
  • coded_picture_number:帧在比特流中的编号,即 AVFrame->coded_picture_number
  • display_picture_number:帧的显示编号,即 AVFrame->display_picture_number
  • interlaced_frame:视频帧内容是否是交错的,即 AVFrame->interlaced_frame
  • top_field_first:若视频帧内容是交错的,表示首先展示的顶部域,即 AVFrame->top_field_first
  • repeat_pict:当解码时,这个信号表明视频帧必须延迟多少。extra_delay = repeat_pict / (2*fps),即 AVFrame->repeat_pict
  • color_range:额外的色彩空间特征,即 av_color_range_name(AVFrame->color_range)AVCOL_RANGE_MPEG 对应 TV,AVCOL_RANGE_JPEG 对应 PC。
  • color_space:YUV 彩色空间类型,即 av_color_space_name(AVFrame->colorspace)
  • color_primaries:即 av_color_primaries_name(AVFrame->color_primaries)
  • color_transfer:颜色传输特性,即 av_color_transfer_name(AVFrame->color_trc)
  • chroma_location:色度样品的位置,即 av_chroma_location_name(AVFrame->chroma_location)

音频帧:

  • sample_fmt:采样格式,通过 av_get_sample_fmt_name(AVFrame->format) 获取。
  • sample_rate:采样率,即 AVFrame->sample_rate
  • channels:声道数,即 AVFrame->channels
  • channel_layout:声道类型,与 channels 是相对应,通过 av_bprint_channel_layout 获取,比如:mono 表示单声道,stereo 表示多声道。

本文参考

FFmpeg 之 ffprobe

《FFmpeg 从入门到精通》

(通过上文的介绍,我们了解了 ffmpeg、ffplay、ffprobe 等常用的命令用法,这对我们平时的音视频开发工作非常有用。我们将在后面继续探讨其他好用的音视频工具,敬请期待)

推荐阅读

《音频编码:PCM、AAC》
《视频编码:H.264》
《视频编码:H.265》
《视频编码:H.266》
《MP4 格式》
《FLV 格式》
《M3U8 格式》

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容