基于Android的MJPEG网络摄像机设计 - 中国一卡通网
用户名密码 [免费注册] [找回密码] 推广技巧 发布求购 建商铺  发产品  会员体制比较  
 

基于Android的MJPEG网络摄像机设计

来源:中国一卡通网  作者:不详  发布时间:2012-04-27 10:16:28  字体:[ ]

关键字:ARM9处理器  Linux操作系统  摄像机  

摘   要:针对智能家居场景需求,设计了基于ARM9处理器Linux操作系统的网络摄像机。深入研究了MJPEG视频压缩算法,阐述了算法实现过程,并设计出基于Android操作系统的3G手机网络摄像机客户端软件。本系统通过实地安装与测试达到了预期效果,突破了传统网络摄像机客户端固定地域的限制,有良好的应用前景。


  编码后的数据还须通过Huffman编码来压缩,Huffman编码的最大特点是使出现频率较高的数字小于8位,而出现频率低的数字大于8位,这使得数据大幅压缩。

  到此数据的压缩过程结束,对压缩后的数据按照JPEG文件格式要求进行保存,加上文件开始标记Start Of Image = FFD8,文件结束标记End Of Image = FFD9,量化表标记Define Quantization Table = FFDB,霍夫曼编码表标记Ddfine Huffman Table = FFC4,帧开始标记Start Of Frame = FFC0等标记,再加上图片识别信息字节标记就最终形成完整的可用于传输或存储的JPEG帧图像,通过套接字接口不间断地发送JPEG图像即形成MJPEG视频流。

  为提高CPU效率,减少进程间切换产生的开销,将压缩算法函数集成到单一线程里。JPEG核心压缩编码函数MCUcode实现如下:

  uint8_t *MCUcode(S_JPEG_ENCODER_STRUCTURE * enc,uint32_t image_format, uint8_t * output_ptr) {

  DCT(enc﹥Y1);//DCT离散余弦变换函数

  quantization(enc,enc﹥Y1, enc﹥ILqt);//量化函数,亮度量化表量化并按照zigzag排列存储

  output_ptr = huffman(enc, COMPONENT_Y, output_ptr);//霍夫曼编码函数

  DCT(enc﹥Y2)……

  DCT(enc﹥Y3)……

  DCT(enc﹥Y4)……

  DCT(enc﹥CB);//DCT离散余弦变换函数

  quantization(enc,enc﹥CB, enc﹥ICqt);//量化函数,色度量化表量化

  output_ptr=huffman(enc, COMPONENT_CB, output_ptr);//色度霍夫曼编码函数

  DCT(enc﹥CR)……

  return output_ptr;

  }

  其中Y1、Y2、Y3、Y4对应水平排列的4像素亮度值,CB、CR是水平排列以2像素为1单位像素的色度值。

  3 Android客户端设计

  Android是Google公司推出的针对移动设备的操作系统,底层采用Linux内核,应用程序采用类Java语言编写,并运行于类JVM虚拟机的Dalvik虚拟机之上。该系统具有开放源码免费授权的优势,功能完善和成熟,已获得厂商的广泛支持和大量市场份额。eclipse IDE开发环境友善,因此选用Android系统作为物联网摄像机客户端开发平台。

  Android程序一般由多个Activity、Intent、Content Provider、Service等程序框架组成[4],其中最基础的是Activity活动类,该类相当于软件运行时的一个页面,在页面之上可添加各种控件,如button按键、ImageView图片、Text boxes、Lists列表等。除此以外还负责监听系统事件,负责启动其他的Activity类。在多个Activity类之间跳转就需要用到Intent类,Intent类有两个重要部分:动作和动作对应的数据。常用的动作有MAIN、VIEW、PICK、EDIT等,动作数据则以URI形式表示。通过Intent类还能传递参数,作用类似链条串起Activity类,Activity类跳转图如图5所示。

 

  图5 Activity类跳转图

  解析视频流须先由网络获取数据流,实现的方法代码如下:

  public static VideoInputStream read(String url) {

  HttpResponse res;

  DefaultHttpClient httpclient=new DefaultHttpClient();//http客户端

  try {

  resource=httpclient.execute(new HttpGet(URI.create(url)));

  return new VideoInputStream(resource.getEntity().getContent());

  ……

  }}//从响应中获取消息实体内容

  对已获取的数据流按照JPEG标准文件头分段,实现的方法代码如下:

  public Bitmap readFrame() throws IOException {

  mark(FRAME_MAX_LENGTH);//在数据流中设置标记,调用mark方法

  int headerLength=getStart(this, START_MARKER);//计算文件头长度

  reset();//reset方法重置数据流指向最后一个标志位置

  byte[] header=new byte[headerLength];

  readFully(header);

  try {

  ContentLength=countContentLength(header);//计算数据内容长度

  }

  catch (NumberFormatException nfe) {

  ContentLength=getEnd(this, END_MARKER);

  }

  byte[] frameData=new byte[ContentLength];//存取帧字节数据

  skipBytes(headerLength);//跳过文件头字节

  readFully(frameData);

  return BitmapFactory.decodeStream(new ByteArrayInputStream(frameData));

  }

  需要注意的是,在AndroidManifest.xml文件中需加上语句,表示程序拥有网络的完整访问权限。获取每帧数据后继承Android SDK中提供的view.SurfaceView类与graphics.Canvas类,将收到的完整帧图像按队列顺序不间断地显示在视窗框架类中,对人眼视觉帧率超过5 fps时即有视频效果,到25 fps即是电影流畅度。对于定点定位监控,经过测试出于节省带宽费用考虑设定5 fps即能满足基本需求,10 fps是较为合理参数。将编译后应用程序安装到手机中,Android实时监控截图如图6所示。 



  图6 Android实时监控截图

  结语

  本文描述了网络摄像机的软件设计与MJPEG算法原理,结合Android移动技术,开发了整套系统;并实际应用于验证系统,取得了良好结果。期望在后续工作中涉足图像识别算法、物体追踪算法、人体行为侦测算法等图像领域,使网络摄像机变得更智能。

更多

新闻投稿合作邮箱:yktchina-admin@163.com    字体[ ] [收藏] [进入论坛]

推荐文章

论坛热帖