FFmpeg学习笔记之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, 从输入的数据流中分离出一帧一帧的压缩编码数据。
/** * 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()相关推荐
- ffmpeg学习笔记
对于每一个刚開始学习的人,刚開始接触ffmpeg时,想必会有三个问题最为关心,即ffmpeg是什么?能干什么?怎么開始学习?本人前段时间開始接触ffmpeg,在刚開始学习过程中.这三个问 ...
- FFmpeg学习笔记之ffplay流程分析
背景说明 FFmpeg是一个开源,免费,跨平台的视频和音频流方案,它提供了一套完整的录制.转换以及流化音视频的解决方案.而ffplay是有ffmpeg官方提供的一个基于ffmpeg的简单播放器.学习f ...
- ffmpeg学习笔记-native原生绘制
上次已将ffmpeg的动态库编译出来了,并且使用了ffmpeg的转码功能,成功将mp4格式视频转化为yuv视频,这篇文章基于上次测试的demo,使用surfaceview显示解码完成的像素数据 布局设 ...
- ffmpeg学习笔记之创建音频解码器失败 avcodec_open2() 返回值为-22
目录 前言 解决过程 总结分析 前言 由于项目需求,需要开发一个私有播放器,所以就无法使用ffmpeg通用的取流接口:avformat_open_input()(埋下祸根)其中遇上了一个坑在创建音频解 ...
- (FFMpeg学习笔记):FFmpeg下载、ffmpeg.exe与ffplay.exe的基本使用
参考视频:https://www.bilibili.com/video/BV1gE411f7WT?t=3293 目录 背景 基本的DOS命令 FFmpeg命令行工具的获取 ffmpeg.exe的使用 ...
- FFmpeg学习笔记汇总
第1章 FFmpeg简介 1.1 FFmpeg定义 FFmpeg既是一款音视频编解码工具,同时也是一组音视频编解码开发套件,作为编解码开发套件,它为开发者提供了丰富的音视频处理的调用接口. FFmpe ...
- 【FFmpeg学习笔记一】FFmpeg简介
Fmpeg简介 一.FFmpeg简介 二.FFmpeg函数库 三.FFmpeg用例 四.相关链接 一.FFmpeg简介 FFmpeg是一款自由软件,核心功能就是音视频编解码,其中的"FF&q ...
- FFmpeg学习笔记(三):逐行扫描转换为隔行扫描的实现----tinterlace简介
网上关于视频去交错(deinterlace)的资料比较多,但是关于加交错(大多数论文里面写的是reinterlace或者re-interlace,但FFmpeg中目前提供的是tinterlace)的资 ...
- 34.FFmpeg学习笔记 - ffplay源码解读2之数据结构
本篇分析一下ffplay的数据结构. (1)VideoState VideoState结构体,正如名字的含义,管理了一些全局的播放状态. typedef struct VideoState {SDL_ ...
最新文章
- python字典转字符串后里面的冒号还在吗_Python字典、字符串及列表的相互转换
- python 统计一个列表中每个值的出现次数
- LeetCode() Remove duplicates from sorted list II
- Redis的高级特性哨兵
- 【对讲机的那点事】公网对讲机选择物联网卡常见问题
- python listbox输入内容自动换行_python中的图像界面设计(二)
- mac下日期、时间戳互转
- 算法面试:栈实现队列的方案
- 关于Spring注解开发教程,打包全送你
- makefile中 = ,:=,+=有怎么区别?
- c++/cli 之数据库操作
- paip.c++ qt 图片处理 检测损坏的图片
- 【元胞自动机】基于matlab元胞自动机短消息网络病毒传播仿真【含Matlab源码 1289期】
- android studio线性渐变,使用Kotlin实现文字渐变TextView的代码
- windows下文件路径太深,删除解决方案
- Android 自定义仪表盘
- 游戏开发技术帖:光线追踪技术的误点和难点
- 计算机操作系统的最基本特性,操作系统有哪几大特征?其最基本的特征是什么?...
- 微信支付的分账功能介绍
- 【数据库设计】学籍管理的数据库系统
热门文章
- 2020年10月 | IE浏览器无法重装 | IE浏览器打不开 | 计算机上安装了更新的 Internet Explorer 版本。
- 现在出纳记账手写还是用计算机,出纳会计记账(银行存款日记账,现金帐)必须是用手写的吗?能否电脑上有什么软体直接电脑输入呢?...
- 百度小程序api怎么提交?Python推送代码免费分享给大家
- 命令win7 64安装mysql_Win7 64位安装MySQL及配置使用教程
- oracle函数max,oracle max()函数和min()函数
- MSCKF 源码解析 一
- VMware虚拟机安装Mac OS X Lion正式版教程
- 知乎-如何进入BAT2
- 基于USB总线的无线网卡驱动程序
- 总结常用的Javafx功能及用法(上)