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, 从输入的数据流中分离出一帧一帧的压缩编码数据。

/** * Parse a packet. * * @param s             parser context. * @param avctx         codec context. * @param poutbuf       set to pointer to parsed buffer or NULL if not yet finished. * @param poutbuf_size  set to size of parsed buffer or zero if not yet finished. * @param buf           input buffer. * @param buf_size      input length, to signal EOF, this should be 0 (so that the last frame can be output). * @param pts           input presentation timestamp. * @param dts           input decoding timestamp. * @param pos           input byte position in stream. * @return the number of bytes of the input bitstream used. * * 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/elesos/article/details/53509420

FFmpeg学习笔记之av_parser_parse2()相关推荐

  1. ffmpeg学习笔记

           对于每一个刚開始学习的人,刚開始接触ffmpeg时,想必会有三个问题最为关心,即ffmpeg是什么?能干什么?怎么開始学习?本人前段时间開始接触ffmpeg,在刚開始学习过程中.这三个问 ...

  2. FFmpeg学习笔记之ffplay流程分析

    背景说明 FFmpeg是一个开源,免费,跨平台的视频和音频流方案,它提供了一套完整的录制.转换以及流化音视频的解决方案.而ffplay是有ffmpeg官方提供的一个基于ffmpeg的简单播放器.学习f ...

  3. ffmpeg学习笔记-native原生绘制

    上次已将ffmpeg的动态库编译出来了,并且使用了ffmpeg的转码功能,成功将mp4格式视频转化为yuv视频,这篇文章基于上次测试的demo,使用surfaceview显示解码完成的像素数据 布局设 ...

  4. ffmpeg学习笔记之创建音频解码器失败 avcodec_open2() 返回值为-22

    目录 前言 解决过程 总结分析 前言 由于项目需求,需要开发一个私有播放器,所以就无法使用ffmpeg通用的取流接口:avformat_open_input()(埋下祸根)其中遇上了一个坑在创建音频解 ...

  5. (FFMpeg学习笔记):FFmpeg下载、ffmpeg.exe与ffplay.exe的基本使用

    参考视频:https://www.bilibili.com/video/BV1gE411f7WT?t=3293 目录 背景 基本的DOS命令 FFmpeg命令行工具的获取 ffmpeg.exe的使用 ...

  6. FFmpeg学习笔记汇总

    第1章 FFmpeg简介 1.1 FFmpeg定义 FFmpeg既是一款音视频编解码工具,同时也是一组音视频编解码开发套件,作为编解码开发套件,它为开发者提供了丰富的音视频处理的调用接口. FFmpe ...

  7. 【FFmpeg学习笔记一】FFmpeg简介

    Fmpeg简介 一.FFmpeg简介 二.FFmpeg函数库 三.FFmpeg用例 四.相关链接 一.FFmpeg简介 FFmpeg是一款自由软件,核心功能就是音视频编解码,其中的"FF&q ...

  8. FFmpeg学习笔记(三):逐行扫描转换为隔行扫描的实现----tinterlace简介

    网上关于视频去交错(deinterlace)的资料比较多,但是关于加交错(大多数论文里面写的是reinterlace或者re-interlace,但FFmpeg中目前提供的是tinterlace)的资 ...

  9. 34.FFmpeg学习笔记 - ffplay源码解读2之数据结构

    本篇分析一下ffplay的数据结构. (1)VideoState VideoState结构体,正如名字的含义,管理了一些全局的播放状态. typedef struct VideoState {SDL_ ...

最新文章

  1. python字典转字符串后里面的冒号还在吗_Python字典、字符串及列表的相互转换
  2. python 统计一个列表中每个值的出现次数
  3. LeetCode() Remove duplicates from sorted list II
  4. Redis的高级特性哨兵
  5. 【对讲机的那点事】公网对讲机选择物联网卡常见问题
  6. python listbox输入内容自动换行_python中的图像界面设计(二)
  7. mac下日期、时间戳互转
  8. 算法面试:栈实现队列的方案
  9. 关于Spring注解开发教程,打包全送你
  10. makefile中 = ,:=,+=有怎么区别?
  11. c++/cli 之数据库操作
  12. paip.c++ qt 图片处理 检测损坏的图片
  13. 【元胞自动机】基于matlab元胞自动机短消息网络病毒传播仿真【含Matlab源码 1289期】
  14. android studio线性渐变,使用Kotlin实现文字渐变TextView的代码
  15. windows下文件路径太深,删除解决方案
  16. Android 自定义仪表盘
  17. 游戏开发技术帖:光线追踪技术的误点和难点
  18. 计算机操作系统的最基本特性,操作系统有哪几大特征?其最基本的特征是什么?...
  19. 微信支付的分账功能介绍
  20. 【数据库设计】学籍管理的数据库系统

热门文章

  1. 2020年10月 | IE浏览器无法重装 | IE浏览器打不开 | 计算机上安装了更新的 Internet Explorer 版本。
  2. 现在出纳记账手写还是用计算机,出纳会计记账(银行存款日记账,现金帐)必须是用手写的吗?能否电脑上有什么软体直接电脑输入呢?...
  3. 百度小程序api怎么提交?Python推送代码免费分享给大家
  4. 命令win7 64安装mysql_Win7 64位安装MySQL及配置使用教程
  5. oracle函数max,oracle max()函数和min()函数
  6. MSCKF 源码解析 一
  7. VMware虚拟机安装Mac OS X Lion正式版教程
  8. 知乎-如何进入BAT2
  9. 基于USB总线的无线网卡驱动程序
  10. 总结常用的Javafx功能及用法(上)