第一章 音视频-FFmpeg解码流程和对应结构参数意义
第一章 音视频-FFmpeg解码流程和对应结构参数意
第二章 音视频-FFmpeg对应解析格式说明
第三章 音视频-FFmpeg对应AVFrame解码处理思路和用途
第四章 音视频-FFmpeg实现播放器思维
第五章 音视频-FFmpeg实现播放器解封装、读AVPacket包
第六章 音视频-FFmpeg实现播放器解码和对应数据处理
媒体文件FFmpeg对应格式
正常媒体文件常用flv、mp4等,对应第一步解封装,查看封装是什么,然后找到对应的流,通过流判断音视频进行解码。
FFmpeg解码步骤
avformat_open_input
是 FFmpeg 库中的一个函数,它的主要作用是打开一个多媒体文件并且将其解析成一个AVFormatContext
结构。这个结构包含了媒体文件的元数据信息,比如媒体流的数量、编解码器信息、时长、格式等等。通过调用avformat_open_input
函数,你可以打开音视频文件、图像序列等多种格式的文件,然后就可以使用 FFmpeg 库的其他函数来对文件进行解码、编码、处理等操作。avformat_find_stream_info
函数是 FFmpeg 库中的一个重要函数,它的作用是在打开的媒体文件中获取流信息。在调用avformat_open_input
打开一个媒体文件之后,通常需要调用avformat_find_stream_info
来读取文件中的流信息,并且会试解码,包括视频流、音频流、字幕流等。这个函数会分析媒体文件中的所有流,并且将这些流的详细信息填充到AVStream
结构体中,比如流的编解码器、时长、码率、分辨率等信息。av_read_frame
函数是 FFmpeg 库中用于读取媒体文件中的一帧数据的函数。它的作用是从已经打开的媒体文件中读取下一帧的数据,并且将这些数据填充到AVPacket
结构体中。
FFmpeg对应结构体说明
AVFormatContext结构体
AVFormatContext
结构体在 FFmpeg 中是一个非常重要的结构体,它包含了对媒体文件进行操作所需的各种信息。以下是 AVFormatContext
结构体中的一些重要参数及其说明:
-
iformat/ oformat: 输入(input)/输出(output)的格式(
AVInputFormat
/AVOutputFormat
)。这些成员变量指向输入或输出的格式,用于表示媒体文件的容器格式(如 AVI、MP4 等)。 -
pb: I/O 上下文(
AVIOContext
)。指向用于读写媒体文件的 I/O 上下文,负责实际的文件 I/O 操作。 -
streams: 媒体流数组(
AVStream *streams[MAX_STREAMS]
)。指向一个数组,包含了媒体文件中的所有流(视频、音频、字幕等)。 -
nb_streams: 媒体流的数量(
int nb_streams
)。表示媒体文件中流的数量。 -
duration: 媒体文件的时长(
int64_t duration
)。以微秒为单位表示的媒体文件的总时长。 -
start_time: 媒体文件的起始时间(
int64_t start_time
)。以微秒为单位表示的媒体文件的起始时间。 -
bit_rate: 媒体文件的比特率(
int64_t bit_rate
)。表示媒体文件的平均比特率。 -
filename: 媒体文件名(
char filename[1024]
)。存储打开的媒体文件的文件名。 -
metadata: 元数据(
AVDictionary *metadata
)。指向一个字典,存储了媒体文件的元数据信息,比如标题、作者、日期等。 -
streams:一个指针数组,包含了该媒体文件中所有的流。每个元素都是一个指向
AVStream
结构体的指针。
这些是 AVFormatContext
结构体中的一些重要参数及其说明,这些参数包含了媒体文件的基本信息、流信息等,为媒体文件的读取、解析、解码等操作提供了必要的信息。
AVStream结构体
AVStream
结构体在 FFmpeg 中用于表示媒体流(视频流、音频流、字幕流等)的信息。以下是 AVStream
结构体中一些重要参数的说明:
-
index:
int index
: 流的索引,表示在AVFormatContext
中的流数组中的位置。
-
id:
int id
: 流的唯一标识符,用于识别流。
-
codecpar:
AVCodecParameters *codecpar
: 指向一个AVCodecParameters
结构体的指针,包含了流的编解码器参数信息,比如编码格式、分辨率、帧率等。
-
time_base:
AVRational time_base
: 表示流中时间单位的分数,用于将时间戳转换为时间值。例如,如果time_base
为(1, 1000)
,则时间戳单位为毫秒。
-
start_time:
int64_t start_time
: 流的起始时间,以AV_TIME_BASE
为单位。
-
duration:
int64_t duration
: 流的时长,以AV_TIME_BASE
为单位。
-
nb_frames:
int nb_frames
: 流中帧的数量。
-
disposition:
int disposition
: 表示流的属性,比如是否是主音频流、主视频流、是否包含字幕等。
-
metadata:
AVDictionary *metadata
: 元数据字典,存储了流的元数据信息,比如标题、语言、编码器名称等。
-
avg_frame_rate:
AVRational avg_frame_rate
: 流中平均帧率。
- r_frame_rate:
AVRational r_frame_rate
: 流中原始帧率。
- codec_info_nb_frames:
int64_t codec_info_nb_frames
: 编解码器提供的帧数量信息。
- priv_data:
void *priv_data
: 指向流的私有数据,用于存储特定于流的信息。
AVCodec结构体
AVCodec
结构体在 FFmpeg 中用于表示编解码器的信息。以下是 AVCodec
结构体中一些重要参数的说明:
-
name:
const char *name
: 编解码器的名称。这是一个字符串,用于标识编解码器的类型,比如 “h264”、“aac” 等。
-
long_name:
const char *long_name
: 编解码器的长名称。提供了更详细的描述,比如 “H.264”、“Advanced Audio Coding” 等。
-
type:
enum AVMediaType type
: 编解码器的类型。这是一个枚举值,表示编解码器所处理的媒体类型,比如视频、音频、字幕等。
-
id:
enum AVCodecID id
: 编解码器的唯一标识符。这是一个枚举值,表示编解码器的具体类型,比如 H.264、AAC、MP3 等。
-
capabilities:
int capabilities
: 编解码器的能力标志。这个参数指示了编解码器所支持的功能,比如是否支持硬件加速、是否支持多线程编解码等。
-
supported_framerates:
const AVRational *supported_framerates
: 编解码器支持的帧率。这是一个指向 AVRational 结构体数组的指针,表示编解码器能够处理的帧率范围。
-
supported_samplerates:
const int *supported_samplerates
: 编解码器支持的采样率。这是一个整数数组,表示编解码器能够处理的音频采样率范围。
-
pix_fmts:
const enum AVPixelFormat *pix_fmts
: 编解码器支持的像素格式。这是一个枚举值数组,表示编解码器能够处理的像素格式范围。
-
sample_fmts:
const enum AVSampleFormat *sample_fmts
: 编解码器支持的采样格式。这是一个枚举值数组,表示编解码器能够处理的音频采样格式范围。
-
priv_class:
const AVClass *priv_class
: 指向私有类的指针,用于访问编解码器的私有选项。
- profiles:
const struct AVProfile *profiles
: 编解码器支持的配置文件。这是一个指向 AVProfile 结构体数组的指针,表示编解码器支持的不同配置文件。
- wrapper_name:
const char *wrapper_name
: 编解码器所使用的包装器(wrapper)名称。
AVPacket结构体
AVPacket
结构体在 FFmpeg 中用于表示编码后的数据包。以下是 AVPacket
结构体中一些重要参数的说明:
-
buf:
AVBufferRef *buf
: 指向数据包的缓冲区引用。这个参数指示了存储编码数据的缓冲区。
-
pts:
int64_t pts
: 指定数据包的显示时间戳(Presentation Time Stamp)。这是一个以AV_TIME_BASE
为单位的时间戳,用于指示数据包应该在播放器中显示的时间。
-
dts:
int64_t dts
: 指定数据包的解码时间戳(Decode Time Stamp)。这是一个以AV_TIME_BASE
为单位的时间戳,用于指示数据包在解码时应该被解码的时间。
-
duration:
int64_t duration
: 数据包的时长。表示数据包的持续时间,以AV_TIME_BASE
为单位。
-
pos:
int64_t pos
: 数据包在媒体文件中的位置。用于指示数据包在文件中的偏移量,以字节为单位。
-
size:
int size
: 数据包的大小。表示数据包中编码数据的字节数。
-
stream_index:
int stream_index
: 数据包所属的流的索引。指示数据包属于AVFormatContext
中流数组中的哪一个流。
-
flags:
int flags
: 数据包的标志。这个参数包含了一些标志位,表示数据包的一些属性,比如是否为关键帧等。
-
side_data:
AVPacketSideData *side_data
: 指向附加数据(Side Data)的指针。这个参数用于存储与数据包相关的额外信息,比如编解码器的配置信息、裁剪信息等。
-
side_data_elems:
int side_data_elems
: 附加数据的数量。表示side_data
数组中的附加数据的数量。
- duration_count:
int duration_count
: 数据包的时长计数。用于指示duration
字段中的时间单位数量。
AVPacket
结构体中的这些参数提供了对编码数据包的基本描述和特性,帮助应用程序进行音视频数据的编码、解码和处理。
AVFrame结构体
AVFrame
结构体在 FFmpeg 中用于表示解码后的音视频帧数据。以下是 AVFrame
结构体中一些重要参数的说明:
-
data:
uint8_t *data[AV_NUM_DATA_POINTERS]
: 数据指针数组。这个数组用于存储指向帧数据的指针,每个元素对应一个数据平面。
-
linesize:
int linesize[AV_NUM_DATA_POINTERS]
: 数据行大小数组。这个数组存储了每个数据平面的行大小(以字节为单位)。
-
extended_data:
uint8_t **extended_data
: 扩展数据指针。指向一个指针数组,用于访问帧数据的每个数据平面的指针。
-
width:
int width
: 帧的宽度(像素数)。
-
height:
int height
: 帧的高度(像素数)。
-
format:
int format
: 像素格式。表示帧数据的像素格式,如 YUV420、RGB24 等。
-
pts:
int64_t pts
: 显示时间戳(Presentation Time Stamp)。指示帧应该在播放器中显示的时间。
-
pkt_pts:
int64_t pkt_pts
: 数据包的显示时间戳。指示生成该帧的数据包的显示时间戳。
-
pkt_dts:
int64_t pkt_dts
: 数据包的解码时间戳。指示生成该帧的数据包的解码时间戳。
-
key_frame:
int key_frame
: 关键帧标志。指示该帧是否为关键帧。
- sample_aspect_ratio:
AVRational sample_aspect_ratio
: 采样纵横比。表示帧的采样纵横比,用于指示像素的宽高比。
- opaque:
void *opaque
: 不透明数据。用于存储一些不透明的私有数据。
- quality:
int quality
: 图像质量。表示帧的图像质量,一般用于视频编码。
- coded_picture_number:
int coded_picture_number
: 编码图像编号。指示编码器为该帧分配的编码图像编号。
- display_picture_number:
int display_picture_number
: 显示图像编号。指示编码器为该帧分配的显示图像编号。
AVFrame
结构体中的这些参数提供了对解码后的音视频帧数据的描述和特性,用于进行音视频数据的解码、处理和显示。