asp简单网站开发,微信社区官网,工程建设服务平台,做楼房信息网站的作用本文以H264视频流为例#xff0c;讲解解码流数据的步骤。
为突出重点#xff0c;本文只专注于讨论解码视频流数据#xff0c;不涉及其它#xff08;如开发环境的配置等#xff09;。如果您需要这方面的信息#xff0c;请和我联系。
准备变量 定义AVCodecContext。如果您…本文以H264视频流为例讲解解码流数据的步骤。
为突出重点本文只专注于讨论解码视频流数据不涉及其它如开发环境的配置等。如果您需要这方面的信息请和我联系。
准备变量 定义AVCodecContext。如果您使用类可以定义成类成员。我这里定义成全局变量。
static AVCodecContext * g_pCodecCtx NULL;
定义一个AVFrameAVFrame描述一个多媒体帧。解码后的数据将被放在其中。
static AVFrame * g_pavfFrame NULL;
初始化解码器 现在开始初始化您的解码器。我把整个初始化过程包在了一个函数里除非您有更好的主意我建议您也这么做。函数长得象这样
BOOL H264_Init()
{
…
}
初始化libavcodecMMPEG要求这个函数一定要第一个被调用
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_pavfFrameg_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