本文以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数据及其大小相关推荐

  1. ffmpeg实战教程(一)Mp4,mkv等格式解码为h264和yuv数据

    FFmpeg有非常强大的功能包括视频采集功能.视频格式转换.视频抓图.给视频加水印等.而网上对这些功能的使用大多是基于命令行的.这不利于我们深入学习定制化ffmpeg,今后我将写一系列的用代码实现这些 ...

  2. ffmpeg api解码音频,得到pcm数据

    ffmpeg api解码音频,得到pcm数据,程序如下: extern "C" { #include "libavutil/avutil.h" #include ...

  3. php将视频流逐帧转图片,ffmpeg sdk解码视频帧后保存成BMP或JPG的方法

    ffmpeg解码视频的例子可以看官方自带的encode_decode.c. 官方解码保存成ppm,这里接下来保存成BMP或JPG. 原理: 保存BMP是解码成功后,从YUV420转成RGB24,然后构 ...

  4. JPEG数据转YUV数据应用实例

    在很多USB摄像头中,质量好点的可以输出很多种数据格式,也有一些只能设置MJPEG模式输出JPEG格式数据,比如我从师弟那顺过来的这颗,哈哈便宜没好货.JPEG数据如果是作为本地存储是没有什么问题的, ...

  5. ffmpeg 采集摄像头yuv数据

    本文讲述在linux下,如何使用ffmpeg采集摄像头yuv数据,并保存为文件. 分为4个部分进行讲解 需要的软硬件环境 使用ffmpeg命令采集yuv数据. 使用ffmpeg代码采集yuv数据. 查 ...

  6. 从零实现简易播放器:4.ffmpeg 解码视频为yuv数据-使用avcodec_send_packet与avcodec_receive_frame

    ffmpeg 解码视频为yuv数据 作者:史正 邮箱:shizheng163@126.com 如有错误还请及时指正 如果有错误的描述给您带来不便还请见谅 如需交流请发送邮件,欢迎联系 csdn : h ...

  7. 运用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 ...

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

    本文以H264视频流为例,讲解解码流数据的步骤. 为突出重点,本文只专注于讨论解码视频流数据,不涉及其它(如开发环境的配置等).如果您需要这方面的信息,请和我联系. 准备变量 定义AVCodecCon ...

  9. SDL_UpdateTexture+ffmpeg播放YUV数据程序异常崩溃:VM Regions Near 0x113e3d000:MALLOC_LARGE

    异常代码: #include <iostream> #include <map> #include <pthread.h>extern "C" ...

最新文章

  1. RxSwift 案例学习(一)
  2. 《程序员代码面试指南》第二章 链表问题 在单链表和双链表中删除倒数第K个节点...
  3. USACO1.1 Broken Necklace (beads)
  4. UML 对象模型图阅读指南 (转)
  5. 小心DataAdapter陷阱
  6. Python对象类型
  7. JAVA基础知识需要注意的细节
  8. gson json转map_Java 中几种常用 JSON 库性能比较
  9. linux 分区 flags,linux磁盘分区
  10. 安装时间大于30秒_“跑步是最没用的减肥方式,必须跑30分钟以上才有用”
  11. 需求工程:加强监理,规避风险(转载)续三
  12. mysql执行计划id相同_MySQL|MySQL执行计划
  13. 1.7.05:输出亲朋字符串
  14. 虚拟机 Ubuntu 联网设置
  15. bert之我见-attention
  16. 海上风电运维船未来前景如何?甲板船之家帮你解开疑问
  17. 兴趣学水彩?业余练习也要准备的画画工具看这里
  18. APP开发工具Appcan、apicloud、HBuilder 剖析
  19. 国内可以为程序员提供兼职的平台有哪些?
  20. Linux ffmpeg 一键安装

热门文章

  1. Iaas,Paas,Saas三者的区别联系是什么?
  2. nuget 包管理器
  3. 【转】微服务架构下分布式事务方案
  4. 一步步编写操作系统 45 linux的elf可执行文件中的段和节
  5. 由浅到深理解ROS(3)-命名空间
  6. 数据结构 - 多路搜索树(2-3树、b树、b+树、b*树)
  7. 【Python CheckiO 题解】Absolute Sorting
  8. 有关不蒜子访问统计无法显示的解决方法
  9. REVERSE-PRACTICE-CTFSHOW-8
  10. 【CodeForces - 144B 】Meeting (暴力枚举,水题,计算几何)