使用FFMPEG SDK解码流数据获得YUV数据及其大小

本文以H264视频流为例,讲解解码流数据的步骤。

为突出重点,本文只专注于讨论解码视频流数据,不涉及其它(如开发环境的配置等)。如果您需要这方面的信息,请和我联系。

准备变量
定义AVCodecContext。如果您使用类,可以定义成类成员。我这里定义成全局变量。

static AVCodecContext * g_pCodecCtx = NULL;

定义一个AVFrame,AVFrame描述一个多媒体帧。解码后的数据将被放在其中。

static AVFrame * g_pavfFrame = NULL;

初始化解码器
现在开始初始化您的解码器。我把整个初始化过程包在了一个函数里,除非您有更好的主意,我建议您也这么做。函数长得象这样:

BOOL H264_Init()

{

}

初始化libavcodec,MMPEG要求,这个函数一定要第一个被调用:

avcodec_init();

挂上所有的codec。也许只挂一个H264的codec就行,我没试过:

av_register_all();

得到H264的解码器:

AVCodec * pCodec = avcodec_find_decoder(CODEC_ID_H264);

创建一个AVCodecContext,并用默认值初始化:

g_pCodecCtx = avcodec_alloc_context();

更改g_pCodecCtx的一些成员变量的值,您应该从解码方得到这些变量值:

g_pCodecCtx->time_base.num = 1; //这两行:一秒钟25帧

g_pCodecCtx->time_base.den = 25;

g_pCodecCtx->bit_rate = 0; //初始化为0

g_pCodecCtx->frame_number = 1; //每包一个视频帧

g_pCodecCtx->codec_type = CODEC_TYPE_VIDEO;

g_pCodecCtx->width = 704; //这两行:视频的宽度和高度

g_pCodecCtx->height = 576;

打开codec。如果打开成功的话,分配AVFrame:

if(avcodec_open(g_pCodecCtx, pCodec) >= 0)

{

g_pavfFrame = avcodec_alloc_frame();// Allocate video frame

}

列出完整的初始化解码库的代码:

image

解码
如果您只要求解成YUV 420I数据,只需一次调用就可以了:

avcodec_decode_video(g_pCodecCtx, g_pavfFrame, (int *)&nGot, (unsigned __int8 *)pSrcData, dwDataLen);

这里,nGot用来返回解码成功与否,avcodec_decode_video调用完成后,如果nGot不等于0,则表示解码成功,否则未解出视频帧。

pSrcData是待解的H264编码的一段数据流,dwDataLen表示该段数据流的长度,单位是byte。

解码后的视频帧(YUV数据)被存入g_pavfFrame,g_pavfFrame->data[0]、g_pavfFrame->data[1]、g_pavfFrame->data[2]即是YUV数据。下面的示例代码把YUV数据压在了一块内存里,排列方式为:

YY

YY

U

V

该函数有返回值:如果解码成功,则返回本次解码使用的码流字节数,否则返回0。为简单起见,我这里假设pSrcData只包含一个视频帧。

同样,出于模块化的要求和代码维护的方便,我把解码动作也包在了一个函数里:

BOOL H264_Decode(const PBYTE pSrcData, const DWORD dwDataLen, PBYTE pDeData, int * pnWidth, int * pnHeight)

pSrcData – 待解码数据

dwDataLen – 待解码数据字节数

pDeData – 用来返回解码后的YUV数据

pnWidth, pnHeight – 用来返回视频的长度和宽度

下面列出完整的代码:

image

释放解码器

image
以上其实已经完成了本文的任务,但从负责任的角度,要善始善终嘛。

释放的过程没什么好说的,一看就明白。同样,我也把它们包在了一个函数里:

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/gwinner/archive/2010/04/08/5462855.aspx

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/455570.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于Python3.7和Python3.6中元组类型数据内存存储问题

关于Python3.7和Python3.6中元组类型数据内存存储问题 小编最近发现了一个瑕疵 当定义一个元组类型的变量后,若在程序后面再定义一个元组变量,这两个元组的内容相同,那么在不同的版本中会出现不同的结果 在Python3.6版本中,解释器将在内存中开辟两个内存空间分别存储两个元组的…

shell 删除了hdfs 文件_从零开始学大数据(三) Shell操作HDFS文件系统-中

1、格式化[rootmaster sbin]# hdfs namenode -format2、命令hdfs dfsadmin查看(hdfs dfsadmin -report)[rootmaster ~]# hdfs dfsadmin -report安全模式#获取安全模式状态[rootmaster ~]# hdfs dfsadmin -safemode get#进入安全状态[rootmaster ~]# hdfs dfsadmin -safemode en…

计算机硬件

计算机硬件 一、为什么要学习计算机基础 程序员编程的本质就是让计算机去工作,而编程语言就是程序员与计算机沟通的介质。程序员要想让计算机工作,就要知道计算机能干什么、是怎么样的一个完成过程,这也是我们必须学习计算机基础的原因。 …

当编程作为一种爱好

一、当编程作为一种爱好,时刻关心一段代码如何实现。 二、当把工具操作得足够熟悉,闭眼即能达到代码述写的规范。 三、程序呀,如果爱上你是我的错,我打算一错到底。转载于:https://www.cnblogs.com/spiriter88/p/6913539.html

Python中的函数概述

1.python中函数概述 概念 模块化编程的思想 有组织,可共享(重复使用,实现特定的功能的代码块) 提高程序的可维护性,提高开发效率,提高代码的重用性定义一个函数 1.语法:def 函数名称(形参列表):函数体/代码块return 返回值 2.定义参数介绍 def :关键字 用于函数的定义,函数的…

铁路售票系统_铁路资讯:复兴号动车、智能京张高铁…中国最高端铁路装备看这里...

今天上午,两年一度的中国国际现代化铁路技术装备展在京开展,会期3天,将集中展示路网建设、客货运输、经营管理、工程建造、技术装备、旅客服务等铁路行业各领域的先进产品及技术。展会现场智能京张:将首次实现时速350公里自动驾驶…

H.264的NALU,RTP封包说明(转自牛人)

H.264 RTP payload 格式 H.264 视频 RTP 负载格式 1. 网络抽象层单元类型 (NALU) NALU 头由一个字节组成, 它的语法如下: --------------- |0|1|2|3|4|5|6|7| -------- |F|NRI| Type | --------------- F: 1 个比特.forbidden_zero_bit. 在 H.264 规…

CentOS下安装MySQL报安装文件conflicts错误:

2019独角兽企业重金招聘Python工程师标准>>> 第一:报这个错误,说明已经安装或相关文件已经存在,把已经存在的文件卸载了就可以了: rpm -e --nodeps mysql-libs-5.1.* 转载于:https://my.oschina.net/u/3197158/blog/1…

inc指令是什么意思_西门子PLC一些指令

指令(英文全称意思)∶指令含义1、LD ( Load装载):动合触点2、LDN (Load Not不装载):动断触点3、A(And与动合):用于动合触点串联4、AN (And Not与动断):用于动断触点串联5、o(Or 或动合):用于动合触点并联6、ON(Or Not 或动断):用于动断触点并联7、(Out输出):用于线圈输出8、OLD…

python核心,内建函数,高阶函数

晨测 global和nonlocal区别 写一个递归的阶乘回顾 1.global和nonlocal 关键字 2.函数的递归 1.查找规律 2.设置退出条件 3.性能 3.闭包 外函数中定义一个内函数 外函数的返回值是内函数的引用 内函数引用外函数的变量,未来外函数执行完毕,不会释放被内函数引用变量 4.总结 1.…

对h.264压缩视频码流中i帧的提取(firstime)

这个问题要说清楚还是有点复杂:首先判断 NALU 类型是否是 5,如果是,那么以后连续出现的 NALU 类型为 5 的 NALU 就属于 IDR 帧(一种特殊的 I 帧);如果 NALU 不是 5,则要进一步判断 slice_type 是…

hadoop fs 运维常用的几个命令

FS Shell调用文件系统(FS)Shell命令应使用 bin/hadoop fs <args>的形式。 所有的的FS shell命令使用URI路径作为参数。URI格式是scheme://authority/path。对HDFS文件系统&#xff0c;scheme是hdfs&#xff0c;对本地文件系统&#xff0c;scheme是file。其中scheme和auth…

touchesEnded不响应

为什么80%的码农都做不了架构师&#xff1f;>>> http://blog.csdn.net/assholeu/article/details/16363241 touchesEnded不响应主要存在以下几种情况 case 1 : userInteractionEnabled 部分控件如UIImageView&#xff0c;userInteractionEnabled默认为NO&#xff0…

python request对四类参数的处理_如何处理Djang中同一参数具有多个变量的request.GET...

在Django视图中&#xff0c;您可以访问request.GET[variablename]&#xff0c;因此在您的视图中&#xff0c;您可以执行如下操作&#xff1a;myvar request.GET[myvar] 实际的request.GET[myvar]对象类型是&#xff1a; 现在&#xff0c;如果要传递具有相同参数名的多个变量&a…

nonlocal和global关键字

回顾: 1. Python的函数的概述函数定义函数调用2. Python函数中参数的类型和返回值形参和实参形参类型:普通参数: 实参的传递的顺序和个数和形参一直关键字参数: 指定传递的实参被特定形参接收默认参数: 形参中设定当前参数的默认值可以不传递设定了默认参数的实参不定长参数:一…

小波在图像视频压缩领域中的应用分析【转贴】

到目前为止&#xff0c;小波的最多应用一直是数字图像压缩。它们是新JPEG2000数字图像标准的核心。使用小波变换的优势主要有如下几个方面。 1、基于小波变换的方法能有效地保留原始图像的细节和边缘&#xff0c;重建图像时不会造成“振铃”效应。 2、基于小波变换的方法采用…

iOS开发人员不容错过的10大工具

内容简介 1、iOS简介 2、iOS开发十大实用工具之开发环境 3、iOS开发十大实用工具之图标设计 4、iOS开发十大实用工具之原型设计 5、iOS开发十大实用工具之演示工具 6、iOS开发十大实用工具之视频制作 7、iOS开发十大实用工具之分析工具 iOS简介 说起iOS&#xff0c;自然不必多介…

博弈论之Nim游戏

OI里&#xff0c;博弈论就是两个聪明绝顶的人玩不公平的游戏。 Nim游戏是组合游戏(Combinatorial Games)的一种&#xff0c;属于“Impartial Combinatorial Games”&#xff08;以下简称ICG&#xff09;。 通常的Nim游戏的定义是这样的&#xff1a;有若干堆石子&#xff0c;每堆…

python标准库sys_Python标准库之Sys模块使用详解

sys 模块提供了许多函数和变量来处理 Python 运行时环境的不同部分. 处理命令行参数 在解释器启动后, argv 列表包含了传递给脚本的所有参数, 列表的第一个元素为脚本自身的名称. 使用sys模块获得脚本的参数 复制代码代码如下: print "script name is", sys.argv[0] …

python3.7知识点汇总

Python3.7从零开始学 —|进入Python3.7的精彩世界 —|---|Python起源 —|---|—|Python作者简介 —|---|—|---|Guido von Rossum&#xff0c;荷兰人。1982年&#xff0c;Guido从阿姆斯特丹大学获得了数学和计算机硕士学位。1989年&#xff0c;他创立了Python语言。 —|---|—|…