static AVCodec*codec;
static AVCodeCContext*c= NULL;
static struct SwsContext*img_convert_ctx;
AndroidBitmaPINfo info;
void*pixels;
(2)初始化流程
①注册解码器
avcodec_init();
av_register_all();
②初始化AVPacket、AVCodecContext、AVFrame
av_init_packet(&avpkt);
c=avcodec_alLOC_context();
picture=avcodec_alloc_frame();
其中,AVFrame是数据流在编解码过程中用来保存数据缓存的对象,从数据流中读取到的数据首先保存到AVPacket中。一个AVPacket最多只包含一个AVFrame,而一个AVFrame可以包含好几个AVPacket。AVCodecContext用于动态记录一个解码器的上下文信息。
③设置视频解码器
codec=avcodec_find_decoder(MPEG-4);
avcodec_open(c,codec);
④视频解码流程
视频解码流程如图4所示。图4中,AndroidBitmap_getinfo用于获取Android平台Bitmap对象的大小,AndroidBitmap_ lockpixels函数是对Bitmap进行加锁、互斥使用资源。如果AVPacket包中存在未解码完的数据,则调用函数avcodec_decode_ video2进行解码;若解码出一帧后需要调用函数sws_scale进行格式转换。视频数据解码完后颜色空间为YUV,需转换成RGB颜色空间。最后调用fill_bitmap函数进行数据填充及进行Bitmap的解锁和资源的释放。
视频显示采用Android平台的ImageView控件进行显示。解码线程接收到视频数据后,通过JNI调用,调用动态库中的视频解码接口函数进行解码,每解码完一帧后通过消息通知主线程进行显示图像的更新,这样就达到了视频数据动态显示的效果。
3 实现效果
Android平台在i.MX51 EVK平台上移植成功后,串口中Android 操作系统启动信息如图5所示。 从图中的启动信息可以看出,Android平台移植成功,启动信息也包含有CPU信息、内核版本、大小、加载地址、Android文件系统版本等信息。
该软件开发完成后,在Android工程的bin下生成apk文件,并复制apk文件到SD卡中,在Android系统中安装该软件,使用门口机进行拨号,编码后的音视频数据通过网线进行传输。
本文将Android手机操作系统应用于i.MX51 EVK平台,并在该平台上提出了可视对讲的设计方案,分别进行了通信流程、应用协议、功能模块等设计,最后实现了系统的设计方案。但由于视频是使用软件解码,运行效率有待提高,且语音对讲部分回声消除存在问题,有待进一步研究。