文章目录
前言
本篇,作者将分享如何在QT环境下,使用FFmpeg函数库解码本地视频(上篇)—— 结构体含义。
一、FFmpeg解码流程
- 下图为解码流程图,黄色部分为解码所调用函数,绿色部分为解码所需要的参数(结构体)。
二、参数(结构体)含义
1.AVFormatContext
- AVFormatContext为FFmpeg中的封装格式上下文,定义如下。
AVFormatContext *formatContext = avformat_alloc_context();
- AVFormatContext是一个贯穿于解码全过程的结构体,很多FFmpeg函数都要使用它作为参数。
- 在解码情况下,AVFormatContext结构体内几个主要变量及其作用,如下所示。
(1)AVIOContext *pb:输入数据的缓存
(2)unsigned int nb_streams:视音频流的个数
(3)AVStream **streams:视音频流
(4)char filename[1024]:文件名
(5)int64_t duration:时长(单位:微秒us,转换为秒需要除以1000000)
(6)int bit_rate:比特率(单位bps,转换为kbps需要除以1000)
(7)AVDictionary *metadata:元数据
2.AVCodecContext
- AVCodecContext作为FFmpeg中的编解码器上下文时,定义如下。
/*
各参数含义如下:
formatContext:封装格式上下文
stream:音视频流,formatContext结构体中的变量之一
streamIndex:流索引,通过遍历音视频流得到的视频流索引或音频索引等
codec:解码器上下文,stream结构体的中的变量之一
*/
AVCodecContext *codecContext = this->formatContext->streams[this->streamIndex]->codec;
- AVCodecContext结构体中的主要变量如下,大部分是编码的时候使用的,而不是解码。
(1)enum AVMediaType codec_type:编解码器的类型(视频,音频...)
(2)struct AVCodec *codec:采用的解码器AVCodec(H.264,MPEG2...)
(3)int bit_rate:平均比特率
(4)uint8_t *extradata; int extradata_size:针对特定编码器包含的附加信息(例如对于H.264解码器来说,存储SPS,PPS等)
(5)AVRational time_base:根据该参数,可以把PTS转化为实际的时间(单位为秒s)
(6)int width, height:如果是视频的话,代表宽和高
(7)int refs:运动估计参考帧的个数(H.264的话会有多帧,MPEG2这类的一般就没有了)
(8)int sample_rate:采样率(音频)
(9)int channels:声道数(音频)
(10)enum AVSampleFormat sample_fmt:采样格式
(11)int profile:型(H.264里面就有,其他编码标准应该也有)
(12)int level:级(和profile差不太多)
3.AVCodec
- AVCodec是存储编解码器信息的结构体,定义如下。
//通过解码器查找函数得到
AVCodec *codec = avcodec_find_decoder(this->codecContext->codec_id);
- AVCodec结构体中的主要变量如下。
(1)const char *name:编解码器的名字,比较短
(2)const char *long_name:编解码器的名字,全称,比较长
(3)enum AVMediaType type:指明了类型,是视频,音频,还是字幕
(4)enum AVCodecID id:ID,不重复
(5)const AVRational *supported_framerates:支持的帧率(仅视频)
(6)const enum AVPixelFormat *pix_fmts:支持的像素格式(仅视频)
(7)const int *supported_samplerates:支持的采样率(仅音频)
(8)const enum AVSampleFormat *sample_fmts:支持的采样格式(仅音频)
(9)const uint64_t *channel_layouts:支持的声道数(仅音频)
(10)int priv_data_size:私有数据的大小
4.AVPacket
- AVPacket是存储压缩编码数据相关信息的结构体,定义如下。
AVPacket *packet = av_packet_alloc();
- AVPacket结构体中的主要变量如下。
(1)uint8_t *data:压缩编码的数据
(2)int size:data的大小
(3)int64_t pts:显示时间戳
(4)int64_t dts:解码时间戳
(5)int stream_index:标识该AVPacket所属的视频/音频流。
5.AVFrame
- AVFrame结构体一般用于存储原始数据(即非压缩数据,对视频来说是YUV,RGB,对音频来说是PCM)
AVFrame *frame = av_frame_alloc();
- AVFrame结构体中的主要变量如下。
(1)uint8_t *data[AV_NUM_DATA_POINTERS]:解码后原始数据(对视频来说是YUV,RGB,对音频来说是PCM)
(2)int linesize[AV_NUM_DATA_POINTERS]:data中“一行”数据的大小。注意:未必等于图像的宽,一般大于图像的宽。
(3)int width, height:视频帧宽和高(1920x1080,1280x720...)
(4)int nb_samples:音频的一个AVFrame中可能包含多个音频帧,在此标记包含了几个
(5)int format:解码后原始数据类型(YUV420,YUV422,RGB24...)
(6)int key_frame:是否是关键帧
(7)enum AVPictureType pict_type:帧类型(I,B,P...)
(8)AVRational sample_aspect_ratio:宽高比(16:9,4:3...)
(9)int64_t pts:显示时间戳
(10)int coded_picture_number:编码帧序号
(11)int display_picture_number:显示帧序号
(12)int8_t *qscale_table:QP表
(13)uint8_t *mbskip_table:跳过宏块表
(14)int16_t (*motion_val[2])[2]:运动矢量表
(15)uint32_t *mb_type:宏块类型表
(16)short *dct_coeff:DCT系数
(17)int8_t *ref_index[2]:运动估计参考帧列表(貌似H.264这种比较新的标准才会涉及到多参考帧)
(18)int interlaced_frame:是否是隔行扫描
(19)uint8_t motion_subsample_log2:一个宏块中的运动矢量采样个数,取log的
三、FFmpeg参考资料
版权声明:本文部分内容,参考CSDN博主「雷霄骅」原创文章整理而成,供学习参考使用。
博客地址:https://blog.csdn.net/leixiaohua1020?type=blog。
总结
以上就是浅显易懂 FFmpeg学习(02)— QT+FFmpeg解码本地视频(上篇)的所有内容,希望大家阅读后都能有所收获!原创不易,转载请标明出处,若文章出现有误之处,欢迎读者留言指正批评!