新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于Android平台的可视对讲系统设计

基于Android平台的可视对讲系统设计

作者:时间:2013-01-22来源:网络收藏

(3)JNI接口函数

JNI接口函数编写在C语言文件中,与音视频解码源码一起打包生成动态链接库。在接口函数中声明4个无符号指针变量:decode指向待解码的数据、depcm指向解码后的数据、enpcm指向待编码的数据、encode指向编码后的数据。解码代码如下:

void Java_com_qsa_play_G711Decoder

(JNIEnv*env,jobject this,jbyteArray pcm,jbyteArray code,jint size,jint lawflag)

{

depcm=(unsigned char*)(*env)->

GetByteArrayElements(env,pcm,0);

decode=(unsigned char*)(*env)->

GetByteArrayElements(env,code,0);

G711Decoder(depcm,decode,size,lawflag);

(*env)->ReleaseByteArrayElements(env, pcm,

(jbyte)depcm,0);

(*env)->ReleaseByteArrayElements(env,code,(jbyte)

decode,0);

}

其中,depcm=(unsigned char*)(*env)->GetByteArrayElements(env,pcm,0)用来获取Java层传递的待解码字节数组的首地址,G711Decoder()函数实现音频解码,(*env)->ReleaseByteArrayElements(env,pcm, (jbyte)depcm,0)释放传递的数组成员,进行资源回收。

(4)使用NDK中ndk-build命令编译生成动态链接库

ndk-build命令是ndk命令工具集中的一个命令,与Linux下shell编程中的make命令相似,它会查找文件夹中的后缀为“.mk”的Makefile文件,根据该文件的依赖文件,将源文件编译成动态链接库。

2.3.2 视频编解码实现

视频的编解码流程与音频编解码流程基本相似,视频编解码调用的C库函数分别为avcodec_encode_video、avcodec_decode_video2。限于篇幅,在此重点介绍视频的解码及显示。

在解码视频数据前,要先做一系列的准备工作:

(1)给出主要的数据结构

static AVPacket avpkt;

static AVFrame*picture;

static AVFrame*pFrameRGB;

static AVCodec*codec;

static AVCodecContext*c= NULL;

static struct SwsContext*img_convert_ctx;

BitmapInfo 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中,Bitmap_getinfo用于获取AndroidBitmap对象的大小,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平台,并在该平台上提出了方案,分别进行了通信流程、应用协议、功能模块等,最后实现了系统的方案。但由于视频是使用软件解码,运行效率有待提高,且语音对讲部分回声消除存在问题,有待进一步研究。


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭