浅显易懂 FFmpeg学习(02)— QT+FFmpeg解码本地视频(上篇)


前言

  本篇,作者将分享如何在QT环境下,使用FFmpeg函数库解码本地视频(上篇)—— 结构体含义。


一、FFmpeg解码流程

  • 下图为解码流程图,黄色部分为解码所调用函数,绿色部分为解码所需要的参数(结构体)。
    在这里插入图片描述

二、参数(结构体)含义

1.AVFormatContext

  • AVFormatContext为FFmpeg中的封装格式上下文,定义如下。
	AVFormatContext *formatContext = avformat_alloc_context();
  • AVFormatContext是一个贯穿于解码全过程的结构体,很多FFmpeg函数都要使用它作为参数。
  • 在解码情况下,AVFormatContext结构体内几个主要变量及其作用,如下所示。
1)AVIOContext *pb:输入数据的缓存
	
	(2unsigned int nb_streams:视音频流的个数
	
	(3)AVStream **streams:视音频流
	
	(4char filename[1024]:文件名
	
	(5int64_t duration:时长(单位:微秒us,转换为秒需要除以1000000)
	
	(6int 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结构体中的主要变量如下,大部分是编码的时候使用的,而不是解码。
1enum AVMediaType codec_type:编解码器的类型(视频,音频...)
	
	(2struct AVCodec  *codec:采用的解码器AVCodec(H.264,MPEG2...)
	
	(3int bit_rate:平均比特率
	
	(4uint8_t *extradata; int extradata_size:针对特定编码器包含的附加信息(例如对于H.264解码器来说,存储SPS,PPS等)
	
	(5)AVRational time_base:根据该参数,可以把PTS转化为实际的时间(单位为秒s)
	
	(6int width, height:如果是视频的话,代表宽和高
	
	(7int refs:运动估计参考帧的个数(H.264的话会有多帧,MPEG2这类的一般就没有了)
	
	(8int sample_rate:采样率(音频)
	
	(9int channels:声道数(音频)
	
	(10enum AVSampleFormat sample_fmt:采样格式
	
	(11int profile:型(H.264里面就有,其他编码标准应该也有)
	
	(12int level:级(和profile差不太多)

3.AVCodec

  • AVCodec是存储编解码器信息的结构体,定义如下。
	//通过解码器查找函数得到
	AVCodec *codec = avcodec_find_decoder(this->codecContext->codec_id);
  • AVCodec结构体中的主要变量如下。
1const char *name:编解码器的名字,比较短
	
	(2const char *long_name:编解码器的名字,全称,比较长
	
	(3enum AVMediaType type:指明了类型,是视频,音频,还是字幕
	
	(4enum AVCodecID id:ID,不重复
	
	(5const AVRational *supported_framerates:支持的帧率(仅视频)
	
	(6const enum AVPixelFormat *pix_fmts:支持的像素格式(仅视频)
	
	(7const int *supported_samplerates:支持的采样率(仅音频)
	
	(8const enum AVSampleFormat *sample_fmts:支持的采样格式(仅音频)
	
	(9const uint64_t *channel_layouts:支持的声道数(仅音频)
	
	(10int priv_data_size:私有数据的大小

4.AVPacket

  • AVPacket是存储压缩编码数据相关信息的结构体,定义如下。
	AVPacket *packet = av_packet_alloc();
  • AVPacket结构体中的主要变量如下。
1uint8_t *data:压缩编码的数据
	
	(2int   size:data的大小
	
	(3int64_t pts:显示时间戳
	
	(4int64_t dts:解码时间戳
	
	(5int stream_index:标识该AVPacket所属的视频/音频流。

5.AVFrame

  • AVFrame结构体一般用于存储原始数据(即非压缩数据,对视频来说是YUV,RGB,对音频来说是PCM)
	AVFrame *frame = av_frame_alloc();
  • AVFrame结构体中的主要变量如下。
1uint8_t *data[AV_NUM_DATA_POINTERS]:解码后原始数据(对视频来说是YUV,RGB,对音频来说是PCM)
	
	(2int linesize[AV_NUM_DATA_POINTERS]:data中“一行”数据的大小。注意:未必等于图像的宽,一般大于图像的宽。
	
	(3int width, height:视频帧宽和高(1920x1080,1280x720...)
	
	(4int nb_samples:音频的一个AVFrame中可能包含多个音频帧,在此标记包含了几个
	
	(5int format:解码后原始数据类型(YUV420,YUV422,RGB24...)
	
	(6int key_frame:是否是关键帧
	
	(7enum AVPictureType pict_type:帧类型(I,B,P...)
	
	(8)AVRational sample_aspect_ratio:宽高比(16:94:3...)
	
	(9int64_t pts:显示时间戳
	
	(10int coded_picture_number:编码帧序号
	
	(11int display_picture_number:显示帧序号
	
	(12int8_t *qscale_table:QP表
	
	(13uint8_t *mbskip_table:跳过宏块表
	
	(14int16_t (*motion_val[2])[2]:运动矢量表
	
	(15uint32_t *mb_type:宏块类型表
	
	(16short *dct_coeff:DCT系数
	
	(17int8_t *ref_index[2]:运动估计参考帧列表(貌似H.264这种比较新的标准才会涉及到多参考帧)
	
	(18int interlaced_frame:是否是隔行扫描
	
	(19uint8_t motion_subsample_log2:一个宏块中的运动矢量采样个数,取log的

三、FFmpeg参考资料

版权声明:本文部分内容,参考CSDN博主「雷霄骅」原创文章整理而成,供学习参考使用。
博客地址:https://blog.csdn.net/leixiaohua1020?type=blog


总结

   以上就是浅显易懂 FFmpeg学习(02)— QT+FFmpeg解码本地视频(上篇)的所有内容,希望大家阅读后都能有所收获!原创不易,转载请标明出处,若文章出现有误之处,欢迎读者留言指正批评!

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_59134387/article/details/127217363