本文共 1913 字,大约阅读时间需要 6 分钟。
本文以H264视频流为例,讲解解码流数据的步骤。
为突出重点,本文只专注于讨论解码视频流数据,不涉及其它(如开发环境的配置等)。如果您需要这方面的信息,请和我联系。
定义AVCodecContext。如果您使用类,可以定义成类成员。我这里定义成全局变量。
定义一个AVFrame,AVFrame描述一个多媒体帧。解码后的数据将被放在其中。
现在开始初始化您的解码器。我把整个初始化过程包在了一个函数里,除非您有更好的主意,我建议您也这么做。函数长得象这样:
BOOL H264_Init()
{
…
}
初始化libavcodec,MMPEG要求,这个函数一定要第一个被调用:
挂上所有的codec。也许只挂一个H264的codec就行,我没试过:
得到H264的解码器:
创建一个AVCodecContext,并用默认值初始化:
更改g_pCodecCtx的一些成员变量的值,您应该从解码方得到这些变量值:
打开codec。如果打开成功的话,分配AVFrame:
列出完整的初始化解码库的代码:
如果您只要求解成YUV 420I数据,只需一次调用就可以了:
这里,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只包含一个视频帧。
同样,出于模块化的要求和代码维护的方便,我把解码动作也包在了一个函数里:
下面列出完整的代码:
以上其实已经完成了本文的任务,但从负责任的角度,要善始善终嘛。
释放的过程没什么好说的,一看就明白。同样,我也把它们包在了一个函数里:
(抱歉的很,文章本来是用Word写的,代码块是一个个文本框,但贴到这里却变成了图片。)
转载地址:http://txgdo.baihongyu.com/