이해하기 쉬운 FFmpeg 학습(02) - QT+FFmpeg 디코딩 로컬 비디오(1부)


머리말

  이 기사에서 저자는 FFmpeg 함수 라이브러리를 사용하여 QT 환경에서 로컬 비디오를 디코딩하는 방법(1부) - 구조의 의미를 공유합니다.


1. FFmpeg 디코딩 프로세스

  • 아래 그림은 복호화 순서도이며, 노란색 부분은 복호화에 의해 호출되는 함수, 녹색 부분은 복호화에 필요한 파라미터(구조체)입니다.
    여기에 이미지 설명 삽입

2. 파라미터의 의미(구조)

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.AV코덱

  • 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.AV패킷

  • AVPacket은 압축된 인코딩 데이터와 관련된 정보를 저장하는 구조체로 다음과 같이 정의된다.
	AVPacket *packet = av_packet_alloc();
  • AVPacket 구조의 주요 변수는 다음과 같습니다.
1uint8_t *data:压缩编码的数据
	2int   size:data的大小
	3int64_t pts:显示时间戳
	4int64_t dts:解码时间戳
	5int stream_index:标识该AVPacket所属的视频/音频流。

5.AV프레임

  • 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的

3. FFmpeg 참조 자료

저작권 진술: 이 기사 내용의 일부는 참조 및 사용을 위해 CSDN 블로거 "Lei Xiaohua"의 원본 기사를 참조하여 편집되었습니다.
블로그 주소: https://blog.csdn.net/leixiaohua1020?type=blog .


요약하다

   위 내용은 이해하기 쉬운 FFmpeg 학습(02) - QT+FFmpeg 디코딩 로컬 비디오(1부)의 모든 내용입니다. 읽으신 후 모두가 무언가를 얻을 수 있기를 바랍니다! 독창성은 쉽지 않습니다. 재인쇄를 위해 출처를 표시해 주시고, 기사에 오류가 있는 경우 독자가 메시지를 남겨 수정 및 비판을 환영합니다!

여기에 이미지 설명 삽입

Supongo que te gusta

Origin blog.csdn.net/qq_59134387/article/details/127217363
Recomendado
Clasificación