前面,我们已经了解了怎么在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. 前端笔记之React(三)使用动态样式表&antd&React脚手架&props实战

    一.使用动态样式表 1.1 LESS使用 全局安装Less npm install -g less 创建1.less文件,然后可以用lessc命令来编译这个文件: lessc 1.less 1.css ...

  2. Linux CentOS删除或重命名文件夹和文件的办法

    Linux.CentOS操作系统下如何删除和重命名文件夹呢?办法如下: 一.Linux.CentOS下重命名文件和文件夹 mv:move 用移动文件命令就可以了,因为linux系统没有专门的重命名命令 ...

  3. RobotFramework + HTTP接口自动化实现

    一.          什么是自动化测试? 1.      定义 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程,也可以说是软件测试的一种技术手段. 2.      常见工具 Appium ...

  4. 基于modelform和ajax的注册

    forms文件 创建ModelForm组件 from django import forms from crm import models from django.core.exceptions im ...

  5. .Net知识大全(个人整理)

    .Net知识大全 本章内容适用于对.NET有一定基础的或者是想通过本文章对.NET基础知识记不清楚的朋友,可以通过本文章进行回顾. 面试的时候可能也会遇到相应的题目,建议面试前进行回顾!!! 1.NE ...

  6. Java实现异步调用

    一.创建线程 @Test public void test0() throws Exception { System.out.println("main函数开始执行"); Thre ...

  7. python接口自动化(三十一)--html测试报告通过邮件发出去——下(详解)

    简介 本篇总结了 QQ (SSL)邮箱和 163(非SSL) 邮箱发送邮件,专治各种不行,总之看完这篇以后麻麻再也不用担心我的邮件收不到了.以下代码兼容 python2 和 python3,运行无异常 ...

  8. Java是如何实现平台无关性的

    相信对于很多Java开发来说,在刚刚接触Java语言的时候,就听说过Java是一门跨平台的语言,Java是平台无关性的,这也是Java语言可以迅速崛起并风光无限的一个重要原因.那么,到底什么是平台无关 ...

  9. Linux查看空间大小的命令

    在linux中,常用查看空间大小的命令有df.du,下面依次介绍一下. df 命令是linux系统上以磁盘分区为单位来查看文件系统的命令,后面可以加上不同的参数来查看磁盘的剩余空间信息.Linux d ...

  10. [USACO09OCT]Invasion of the Milkweed】乳草的侵占-C++

    Farmer John一直努力让他的草地充满鲜美多汁的而又健康的牧草.可惜天不从人愿,他在植物大战人类中败下阵来.邪恶的乳草已经在他的农场的西北部份占领了一片立足之地. 草地像往常一样,被分割成一个高 ...