기사 디렉토리
머리말
이 기사에서 저자는 FFmpeg 함수 라이브러리를 사용하여 QT 환경에서 로컬 비디오를 디코딩하는 방법(1부) - 구조의 의미를 공유합니다.
1. FFmpeg 디코딩 프로세스
- 아래 그림은 복호화 순서도이며, 노란색 부분은 복호화에 의해 호출되는 함수, 녹색 부분은 복호화에 필요한 파라미터(구조체)입니다.
2. 파라미터의 의미(구조)
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.AV코덱
- 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.AV패킷
- 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.AV프레임
- 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的
3. FFmpeg 참조 자료
저작권 진술: 이 기사 내용의 일부는 참조 및 사용을 위해 CSDN 블로거 "Lei Xiaohua"의 원본 기사를 참조하여 편집되었습니다.
블로그 주소: https://blog.csdn.net/leixiaohua1020?type=blog .
요약하다
위 내용은 이해하기 쉬운 FFmpeg 학습(02) - QT+FFmpeg 디코딩 로컬 비디오(1부)의 모든 내용입니다. 읽으신 후 모두가 무언가를 얻을 수 있기를 바랍니다! 독창성은 쉽지 않습니다. 재인쇄를 위해 출처를 표시해 주시고, 기사에 오류가 있는 경우 독자가 메시지를 남겨 수정 및 비판을 환영합니다!