主要是通过av_parser_parse2拿到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);  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
第一个参数:

eg:

AVCodecParserContext *parser = NULL;

if (avcodec_open(c, codec) < 0) {
        fprintf(stderr, "could not open codec\n");
        exit(1);
    }

/* the codec gives us the frame size, in samples */
    parser = av_parser_init(c->codec_id);
    parser->flags |= PARSER_FLAG_ONCE;//在打开解码器后初始化parase
1
2
3
4
5
6
7
8
9
10
另一种用法:

AVStream *st = s->streams[stream_index];

len = av_parser_parse2(st->parser, st->codec,
                               &out_pkt.data, &out_pkt.size, data, size,
                               pkt->pts, pkt->dts, pkt->pos);
1
2
3
4
5
第二个参数:正常的AVCodecContext

第三个参数:初始化后的avpkt的avpkt.data

第四个参数:初始化后的avpkt的avpkt.size

第五个参数:一次接收的数据包

第六个参数:本次接收数据包的长度

第七个参数:pts,没有的话,可以在声明后直接用int pts,单单h264的话直接挂上pts即可

第八个参数:dts,同上

第九个参数:接收数据 
其中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()。 
“纯净”的解码器中,通过avcodec_decode_video2()成功解码第一帧之后,才能获取到宽高等信息 
解析出来的数据,可通过下面的方法判断帧类型: 
AVCodecParserContext->pict_type :AV_PICTURE_TYPE_I,AV_PICTURE_TYPE_P
--------------------- 
作者:书弋江山 
来源:CSDN 
原文:https://blog.csdn.net/bobbob32/article/details/78480819 
版权声明:本文为博主原创文章,转载请附上博文链接!

FFmpeg编解码常用函数ffmpeg av_parser_parse2()函数相关推荐

  1. FFmpeg编解码常用API和数据结构

    一.简述 本文主要介绍FFmpeg 编程中用到的基础知识,包含常见音视频概念,常用API函数,常用结构体,解封装流程,解复用器流程以及注册等. 二.常见音视频概念 容器/文件( Conainer/Fi ...

  2. ffmpeg 编解码 码率设置问题 CBR 、VBR

    之前都是利用硬件进行视频流的编解码 最近 在利用ffmpeg 编解码在CPU上进行软解软编码 之前别的硬件平台设置码率和vbr cbr的时候 提供了接口直接设置一下就可以 但是ffmpeg这里 并没有 ...

  3. ffmpeg解复用编解码 常用API大全给出详细中文解释

    int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags); 将你给出的条目设置进入你给到的 p ...

  4. ffmpeg编解码应用

    http://blog.csdn.net/shendan00/article/details/18839793 1命令语法 使用语法 ffmpeg[[options][`-i' input_file] ...

  5. iOS视频编解码常用库比较

    主流跨平台媒体库ffmpeg,live555,MobileVLCKit简介 库名 简介 需要的能力 官网链接 ffmpeg FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计 ...

  6. ffmpeg编解码详细过程

    1. 注册所有容器格式和CODEC:av_register_all() 2. 打开文件:av_open_input_file() 3. 从文件中提取流信息:av_find_stream_info() ...

  7. 视频直播流程以及ffmpeg编解码流程

    去年最流行的非视频直播莫属,出现了几百家的直播平台,毕竟自己也是在直播平台做开发的,然后就写一篇关于直播的文章.这里只说流程,具体的实现就不说了,应付面试应该还是可以的. 先上一张简单的流程图: 上面 ...

  8. ffmpeg 编解码流程

    去年最流行的非视频直播莫属,出现了几百家的直播平台,毕竟自己也是在直播平台做开发的,然后就写一篇关于直播的文章.这里只说流程,具体的实现就不说了,应付面试应该还是可以的. 先上一张简单的流程图: 上面 ...

  9. 【FFmpeg】FFmpeg编解码H264产生马赛克、伪影的解决方法

    1.问题描述 使用FFmpeg编码H264,再解码显示时,产生马赛克:有时是在画面静止时,静止时间越长,马赛克.伪影越多:有时是在画面切入切出时:有时是在网络带宽不够时 2.原因分析 2.1 丢帧 网 ...

  10. FFmpeg编解码处理1-转码全流程简介

    https://www.cnblogs.com/leisure_chn/p/10584901.html

最新文章

  1. mono和monodevelop源码编译安装
  2. CoreCLR源码探索(八) JIT的工作原理(详解篇)
  3. 前端学习(2704):重读vue电商网站25之保存token
  4. 【a202】【9208】输油管道问题
  5. 高中python公开课怎么上好_Python公开课 - Requests高级功能
  6. idea中的maven使用
  7. ros buntu安装手册_超详细 ROS安装教程
  8. 人工智能行业现状与未来发展趋势
  9. SPSS软件中常见的统计分析方法有哪些
  10. 如何在Ubuntu MATE 18.04中安装GNOME 3?
  11. 【WIFI专题】Wifi 2.4G及5G频段各信道的中心频率及主要国家的分布情况
  12. 免费web服务器Tomcat
  13. 雷电模拟器忘记锁屏密码
  14. 第十六周学习周报(20180618-20180624)
  15. php个人空间源码,PHP安装 - 牛牛牛大棚的个人空间 - OSCHINA - 中文开源技术交流社区...
  16. 朋友圈装逼高考证图片怎么在线生成制作,高考证怎么写上自己的名字?
  17. 计算机编程专业有哪些好的大学?
  18. vue 组件,props 属性 ,Vue 生命周期
  19. 188 武士风度的牛(bfs)
  20. 手绘视频系列目录与总结

热门文章

  1. HDU 2577 How to Type (DP,经典)
  2. 合并查找到的文件,至新的文件中
  3. C++类与对象实验(六)
  4. 操作Visual Studio 2010中的SQL Server数据库比较工具
  5. poj 3694 Network (无向图的 割边 lca )
  6. 利用 Google API 调用谷歌地图 演示1
  7. 挣脱浏览器的束缚(6) - AJAX也跨域名
  8. 10_10_安卓加linux命令,Linux 新手必知必会的 10 条 Linux 基本命令
  9. Spring Boot + Spring Data JPA项目配置多数据源
  10. CentOS 7 根目录分区扩容