本文以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 – 用来返回视频的长度和宽度

下面列出完整的代码:

  • 释放解码器

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

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

(抱歉的很,文章本来是用Word写的,代码块是一个个文本框,但贴到这里却变成了图片。)

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

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

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

  2. Android Socket 连接设备接收H264裸流数据并解码播放 Demo

    最近在做视频流相关的项目,发现 网上很少这方面的demo,很多都是长篇大论的理论知识,研究的太深,不利于小白快速 上手.所以我提炼了自己项目中这一块的内容,打包个小 demo ,只要 拿去稍作修改基本 ...

  3. Qt+FFmpeg播放RTSP H264视频流(1)- 在Qt项目加入FFmpeg库

    Qt FFmpeg播放RTSP H264视频流(1) QtCreator引入FFmpeg库 下载FFmpeg库 添加FFmpeg库到Qt项目 测试FFmpeg库是否能正常使用 QtCreator引入F ...

  4. live555直播h264视频流

    刚开始接触live555,在live555\testProgs中有很多很好的例子来讲解live555各方面的应用: 但是都是以文件形式给到服务器中,然后广播出来的,但是很多情况下我们是需要直播的,那就 ...

  5. php连接数据库比jdbc连接哪个好,MySQL_MySQL为例讲解JDBC数据库连接步骤,1、什么是JDBC?有什么作用? - phpStudy...

    MySQL为例讲解JDBC数据库连接步骤 1.什么是JDBC?有什么作用? Java Data Base Connectivity Java数据库连接协议 是一种用于执行SQL语句的Java API, ...

  6. 基于hi3531的live555直播h264视频流

    刚开始接触live555,在live555\testProgs中有很多很好的例子来讲解live555各方面的应用: 但是都是以文件形式给到服务器中,然后广播出来的,但是很多情况下我们是需要直播的,那就 ...

  7. OpenCV实时美颜摄像并生成H264视频流

    为什么美颜摄像这么简单的功能,OpenCV这个开源项目网上很少有代码呢?对于在windows平台下,生成h264视频流也比价麻烦,没有现成的api可以使用,需要借助MinGw编译libx264,或者f ...

  8. 操作系统之进程调度——优先权法和轮转法(附上样例讲解)

    操作系统之进程调度--优先权法和轮转法(附上样例讲解) 操作系统之银行家算法-详解流程及案例数据 操作系统之多线程编程-读者优先/写者优先详解 操作系统之存储管理--FIFO算法和LRU算法 操作系统 ...

  9. 优化算法求解复杂约束问题策略(以粒子群算法为例讲解求解复杂约束问题的多种策略)

    优化算法求解复杂约束问题策略(以粒子群算法为例讲解求解复杂约束问题的多种策略)python实现     整个代码文字讲解共17页 提示:专栏解锁后,可以查看该专栏所有文章. 文章目录 策略1:在位置更 ...

最新文章

  1. 【JUC系列】Future异步回调模式
  2. LightOJ - 1236 (唯一分解定理)
  3. 【Qt】简单QT文本编辑器
  4. [ZJOI2015] 幻想乡战略游戏(树链剖分 + 线段树二分 + 带权重心)
  5. leetcode 1030. 距离顺序排列矩阵单元格(bfs)
  6. tomcat优化-有改protocol 和 缓存 集群方案
  7. 思想是精神的种子,改造自己的内心世界
  8. WRF模式中eta层的设置以及分别对应的高度(转)
  9. python3安装与环境配置和pip的基本使用
  10. 2011华为上机试题-Java
  11. 最大后验估计_极大似然估计 V.S. 贝叶斯估计
  12. 打破多项存储世界记录,宏杉科技表示很淡定
  13. WEB应用log4j1.x升级到log4j2.17.1
  14. 酒精需要存放在防爆柜中吗?
  15. 宁夏新八景[之一]:古峡新韵
  16. 插件化基础(二)——加载插件资源
  17. 牛客网学习笔记——简单题们(二)
  18. vbscript能干什么
  19. 抖音矩阵系统,抖音矩阵系统,抖音SEO源码。
  20. 新人拍摄2299元婚纱照套餐最终花费13000元

热门文章

  1. 网站出现403 Forbidden
  2. tcp client.cs
  3. jquery实现的3D缩略图悬停效果
  4. angular 内容投影
  5. jquery Ajax请求本地json
  6. vc/vs开发的应用程序添加dump崩溃日志转
  7. 编写一个简单的spring MVC程序
  8. poj 1256 Anagram—next_permutation的神奇应用
  9. 使用URI设计松散耦合的Metro应用程序
  10. nodeJs 操作数据库