av_parser_parse2

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值