前面,我们已经了解了怎么在android app上打开关闭和扫描,搜索wifi,现在,我来写一下怎么通过连接wifi来使app获取到IPCamera摄像头的视频。

一、通过URL获取视频的地址

二、创建输入流

三、解析图片

首先,我是通过抓包软件来抓取IPCamera摄像头的视频流,然后将其分包解析为一张一张的图片,再将其显示在界面上。由于我抓到的有GET /videostream.cgi?rate=0 HTTP/1.1 这样的字眼,所以可以知道,我所使用的是HTTP协议的摄像头。然后根据Referer: 后面的地址,可以推断出URL应为http://192.168.10.1/videostream.cgi?user=admin&pwd=&resolution=32&rate=1,主要是注意修改地址后面为/videostream.cgi,user和pwd是这个网页登入的账号和密码,就可以开始创建URL连接了。代码如下:

URL url;
url = new URL("http://192.168.10.1/videostream.cgi?user=admin&pwd=&resolution=32&rate=1");
URLConnection conn = url.openConnection();
conn.connect();

接下来,开始创建输入输出流。

 InputStream input = conn.getInputStream();
BufferedInputStream in=new BufferedInputStream(input);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

然后就可以开始分包接收到的图片了。

int readLength;
String flag = "Content-Length:", flag1 = "\r\n";
while (true) {
//当输入流有数据时,则创建byte数组
if (in.available() != -1) {
byte buffer[] = new byte[1024];
//把读到的字节数给 readLength
readLength = in.read(buffer, 0, 1024); //让readLength读满
while (readLength < 1024) {
readlength = in.read(buffer, readLength - 1, 1024 - readLength);
readLength = readLength + readlength;
} if (readLength > 0) {
strData = new String(buffer);
//标记"Content-Length: "的起始位置
int index = strData.indexOf(flag);
//标记"\r\n"的位置,注意是"Content-Length: "之后的第一个位置
int index1 = strData.indexOf(flag1, index); if (index1 != -1 || index1 - (index + flag.length()) > 0 || index != -1) {
String len;
len = strData.substring(index + flag.length(), index1);
//计算本次streamLength的长度
streamLength = Integer.parseInt(len.trim());
} if (streamLength > 0) {
if ((index1 + 4) < readLength) {
outputStream.write(buffer, index1 + 4, readLength - index1 - 4);
streamLength = streamLength - readLength + index1 + 4;
}
//将剩下读取的视频流存储到buffer1
byte[] buffer1 = new byte[streamLength];
int length = 0;
while (length < streamLength) {
if (in.available() != -1) {
//Thread.sleep(50);
length += in.read(buffer1, length, streamLength - length);
}
else{
Thread.sleep(150); }
}
outputStream.write(buffer1, 0, streamLength);
byte[] data = outputStream.toByteArray();
BitmapFactory.Options op = new BitmapFactory.Options();
op.inSampleSize = 2;
bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, op);
if (bitmap != null) {
//remoteSurfaceView.setImageBitmap(bitmap);
handler.sendEmptyMessage(MSG_ONE);
} outputStream.reset(); } }
} else {
Thread.sleep(300);
}
}

然后,通过handler来更新UI。

private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case MSG_ONE:
remoteSurfaceView.setImageBitmap(bitmap);
break;
default:
break;
}
}
};

这样,就可以显示IPCamera的视屏画面了,但是,在我的app界面上,视频始终不能一直播放下去,总是在看到几分钟的画面之后就停下了,具体原因我还没有搞清楚,也有可能是摄像头设备的问题,希望知道的高手可以解答一下。

Android开发——通过wifi接收IPCamera视频流的更多相关文章

  1. Android 开发 创建WiFi、WiFi热点 ---开发集合

    WIFI 权限 <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> < ...

  2. android开发-获取wifi列表

    近期博主在学frangment框架,因此想着想着就想通过listfragment完毕对wifi列表的获取. 好! 如今就不说废话了. 一.wifi的基础知识 在Android的官方文档中定义了例如以下 ...

  3. android开发连接wifi addNetwork 返回-1

    如下代码:(注释掉的是会返回-1的代码,未注释的是能够正常连接wifi的代码) // public WifiConfiguration CreateWifiInfo(String SSID, Stri ...

  4. 马上搞定Android平台的Wi-Fi Direct开发

    导语 移动互联网时代,很多用户趋向于将大量的资料保存在移动设备上.但在给用户带来便利的同时引发了一个新的问题——保存在移动设备上的资料该怎样共享出去?到了思考时间,普通青年这样想:折腾什么劲啊,直接用 ...

  5. Android开发—智能家居系列】(二):用手机对WIFI模块进行配置

    在实际开发中,我开发的这款APP是用来连接温控器,并对温控器进行控制的.有图为证,哈哈. 上一篇文章[Android开发—智能家居系列](一):智能家居原理的文末总结中写到: 手机APP控制智能温控器 ...

  6. android开发获取网络状态,wifi,wap,2g,3g.工具类(一)

    android开发获取网络状态整理: package com.gzcivil.utils; import android.content.Context; import android.net.Con ...

  7. Android开发权威指南(第2版)新书发布

    <Android 开发权威指南(第二版)>是畅销书<Android开发权威指南>的升级版,内容更新超过80%,是一本全面介绍Android应用开发的专著,拥有45 章精彩内容供 ...

  8. Android开发常用权限设置

    加在AndroidManifest.xml 文件中manifest标签以内,application以外 例如:<!--网络权限 --> <uses-permission androi ...

  9. android开发,权限获取

    转:http://blog.csdn.net/yawinstake/article/details/6748897 访问登记属性 android.permission.ACCESS_CHECKIN_P ...

随机推荐

  1. vue 开发webapp 手机返回键 退出问题

    vue 开发webapp 手机返回键 退出问题 mui进行手机物理键的监听 首先安装 vue-awesome-mui npm i vue-awesome-mui 在main.js注册 在index.h ...

  2. Storm —— 单机环境搭建

    1. 安装环境要求 you need to install Storm's dependencies on Nimbus and the worker machines. These are: Jav ...

  3. 关于Jvm类加载机制,这一篇就够了

    前言 一个月没更新了,这个月发生了太多的事情,导致更新的频率大大降低,不管怎样收拾心情,技术的研究不能落下! jvm作为每个java程序猿必须了解的知识,博主推荐一本书<深入理解Java虚拟机& ...

  4. SSM(四)Mybatis延迟加载

    1.概念 MyBatis中的延迟加载,也称为懒加载,是指在进行关联查询时,按照设置延迟加载规则推迟对关联对象的select查询.延迟加载可以有效的减少数据库压力. 2.关联对象的加载时机 ①.直接加载 ...

  5. ES5_05_Function扩展

    Function 构造器的语法: 注意: 参数 arg1 , arg2 , argN 被函数使用的参数的名称必须是合法命名的.参数名称是一个有效的JavaScript标识符的字符串,或者一个用逗号分隔 ...

  6. 【朝花夕拾】Android自定义View篇之(九)多点触控(下)实践出真知

    前言 在上一篇文章中,已经总结了MotionEvent以及多点触控相关的基础理论知识和常用的函数.本篇将通过实现单指拖动图片,多指拖动图片的实际案例来进行练习并实现一些效果,来理解前面的理论知识.要理 ...

  7. 关于sql 中delete, truncate,drop的理解与总结

    关于文章,本文是在网上查找资料整理而来,方便以后记忆 delete 命令删除的数据可以恢复, truncate 命令删除的数据是不可以恢复的,全删的那种 drop 命令删除的数据不可恢复,连表结构都删 ...

  8. CSU 1811: Tree Intersection(线段树启发式合并||map启发式合并)

    http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1811 题意:给出一棵树,每一个结点有一个颜色,然后依次删除树边,问每次删除树边之后,分开的两个 ...

  9. c++指针经典题目分析

    首先看一下题目,下列程序会在那一行崩溃,程序如下: #include<iostream> using namespace std; struct S{ int i; int *p; }; ...

  10. Oracle数据库---序列、索引、同义词

    --创建序列create sequence deptno_seqstart with 50increment by 10maxvalue 70cache 3; --为了方便演示,创建了一个和dept表 ...