使用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
}
列出完整的初始化解码库的代码:
解码
如果您只要求解成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 – 用来返回视频的长度和宽度
下面列出完整的代码:
释放解码器
以上其实已经完成了本文的任务,但从负责任的角度,要善始善终嘛。
释放的过程没什么好说的,一看就明白。同样,我也把它们包在了一个函数里:
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/gwinner/archive/2010/04/08/5462855.aspx
使用FFMPEG SDK解码流数据获得YUV数据及其大小相关推荐
- ffmpeg实战教程(一)Mp4,mkv等格式解码为h264和yuv数据
FFmpeg有非常强大的功能包括视频采集功能.视频格式转换.视频抓图.给视频加水印等.而网上对这些功能的使用大多是基于命令行的.这不利于我们深入学习定制化ffmpeg,今后我将写一系列的用代码实现这些 ...
- ffmpeg api解码音频,得到pcm数据
ffmpeg api解码音频,得到pcm数据,程序如下: extern "C" { #include "libavutil/avutil.h" #include ...
- php将视频流逐帧转图片,ffmpeg sdk解码视频帧后保存成BMP或JPG的方法
ffmpeg解码视频的例子可以看官方自带的encode_decode.c. 官方解码保存成ppm,这里接下来保存成BMP或JPG. 原理: 保存BMP是解码成功后,从YUV420转成RGB24,然后构 ...
- JPEG数据转YUV数据应用实例
在很多USB摄像头中,质量好点的可以输出很多种数据格式,也有一些只能设置MJPEG模式输出JPEG格式数据,比如我从师弟那顺过来的这颗,哈哈便宜没好货.JPEG数据如果是作为本地存储是没有什么问题的, ...
- ffmpeg 采集摄像头yuv数据
本文讲述在linux下,如何使用ffmpeg采集摄像头yuv数据,并保存为文件. 分为4个部分进行讲解 需要的软硬件环境 使用ffmpeg命令采集yuv数据. 使用ffmpeg代码采集yuv数据. 查 ...
- 从零实现简易播放器:4.ffmpeg 解码视频为yuv数据-使用avcodec_send_packet与avcodec_receive_frame
ffmpeg 解码视频为yuv数据 作者:史正 邮箱:shizheng163@126.com 如有错误还请及时指正 如果有错误的描述给您带来不便还请见谅 如需交流请发送邮件,欢迎联系 csdn : h ...
- 运用ffmpeg SDK解264码流(来源FFmpeg工程组)
Link:http://www.ffmpeg.com.cn/index.php/%E8%BF%90%E7%94%A8SDK%E8%A7%A3264%E7%A0%81%E6%B5%81 运用SDK解26 ...
- 本文以H264视频流为例,讲解解码流数据的步骤。
本文以H264视频流为例,讲解解码流数据的步骤. 为突出重点,本文只专注于讨论解码视频流数据,不涉及其它(如开发环境的配置等).如果您需要这方面的信息,请和我联系. 准备变量 定义AVCodecCon ...
- SDL_UpdateTexture+ffmpeg播放YUV数据程序异常崩溃:VM Regions Near 0x113e3d000:MALLOC_LARGE
异常代码: #include <iostream> #include <map> #include <pthread.h>extern "C" ...
最新文章
- RxSwift 案例学习(一)
- 《程序员代码面试指南》第二章 链表问题 在单链表和双链表中删除倒数第K个节点...
- USACO1.1 Broken Necklace (beads)
- UML 对象模型图阅读指南 (转)
- 小心DataAdapter陷阱
- Python对象类型
- JAVA基础知识需要注意的细节
- gson json转map_Java 中几种常用 JSON 库性能比较
- linux 分区 flags,linux磁盘分区
- 安装时间大于30秒_“跑步是最没用的减肥方式,必须跑30分钟以上才有用”
- 需求工程:加强监理,规避风险(转载)续三
- mysql执行计划id相同_MySQL|MySQL执行计划
- 1.7.05:输出亲朋字符串
- 虚拟机 Ubuntu 联网设置
- bert之我见-attention
- 海上风电运维船未来前景如何?甲板船之家帮你解开疑问
- 兴趣学水彩?业余练习也要准备的画画工具看这里
- APP开发工具Appcan、apicloud、HBuilder 剖析
- 国内可以为程序员提供兼职的平台有哪些?
- Linux ffmpeg 一键安装