av_parser_parse2()拿到AVPaket数据,将一个个AVPaket数据解析组成完整的一帧未解码的压缩数据;
跟av_read_frame类似。
输入必须是只包含视频编码数据“裸流”(例如H.264、HEVC码流文件),而不能是包含封装格式的媒体数据(例如AVI、MKV、MP4)。
av_parser_init():初始化AVCodecParserContext。其参数是codec_id,所以同时只能解析一种
AVCodecParser用于解析输入的数据流并把它们分成一帧一帧的压缩编码数据。核心函数是av_parser_parse2():
av_parser_parse2():解析数据获得一个Packet, 从输入的数据流中分离出一帧一帧的压缩编码数据。
/**
* 解析一个数据包。
*
* @param s 解析器上下文。
* @param avctx 编解码器上下文。
* @param poutbuf 设置为指向解析缓冲区的指针,如果尚未完成则为 NULL。
* @param poutbuf_size 设置为解析缓冲区的大小,如果尚未完成则为零。
* @param buf 输入缓冲区。
* @param buf_size 输入长度,信号EOF,这应该是0(这样可以输出最后一帧)。
* @param pts 输入演示时间戳。
* @param dts 输入解码时间戳。
* @param pos 输入字节在流中的位置。
* @return 使用的输入比特流的字节数。
* Example:
* @code
* while(in_len){
* len = av_parser_parse2(myparser, AVCodecContext, &data, &size,
* in_data, in_len,
* pts, dts, pos);
* in_data += len;
* in_len -= len;
*
* if(size)
* decode_frame(data, size);
* }
* @endcode
*/
int av_parser_parse2(AVCodecParserContext *s,
AVCodecContext *avctx,
uint8_t **poutbuf, int *poutbuf_size,
const uint8_t *buf, int buf_size,
int64_t pts, int64_t dts,
int64_t pos);
其中poutbuf指向解析后输出的压缩编码数据帧,buf指向输入的压缩编码数据。如果函数执行完后输出数据为空(poutbuf_size为0),则代表解析还没有完成,还需要再次调用av_parser_parse2()解析一部分数据才可以得到解析后的数据帧。当函数执行完后输出数据不为空的时候,代表解析完成,可以将poutbuf中的这帧数据取出来做后续处理。
数据结构初始化流程:
avformat_open_input()会调用avformat_new_stream()创建AVStream;
avformat_new_stream()中又会调用avcodec_alloc_context3()创建AVCodecContext
av_read_frame():获取媒体的一帧压缩编码数据。其中调用了av_parser_parse2()。(注:av_read_frame()属于外部接口,由上层程序主动调用)
“纯净”的解码器中,通过avcodec_decode_video2()(注:此接口在ffmpeg3.0之后已经被遗弃掉了)成功解码第一帧之后,才能获取到宽高等信息
解析出来的数据,可通过下面的方法判断帧类型:
AVCodecParserContext->pict_type :AV_PICTURE_TYPE_I,AV_PICTURE_TYPE_P
https://blog.csdn.net/wqwqh/article/details/90713396?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163452208016780265458183%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=163452208016780265458183&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allbaidu_landing_v2~default-4-90713396.first_rank_v2_pc_rank_v29&utm_term=av_parser_parse2&spm=1018.2226.3001.4187