Android开发——通过wifi接收IPCamera视频流
前面,我们已经了解了怎么在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视频流的更多相关文章
- Android 开发 创建WiFi、WiFi热点 ---开发集合
WIFI 权限 <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> < ...
- android开发-获取wifi列表
近期博主在学frangment框架,因此想着想着就想通过listfragment完毕对wifi列表的获取. 好! 如今就不说废话了. 一.wifi的基础知识 在Android的官方文档中定义了例如以下 ...
- android开发连接wifi addNetwork 返回-1
如下代码:(注释掉的是会返回-1的代码,未注释的是能够正常连接wifi的代码) // public WifiConfiguration CreateWifiInfo(String SSID, Stri ...
- 马上搞定Android平台的Wi-Fi Direct开发
导语 移动互联网时代,很多用户趋向于将大量的资料保存在移动设备上.但在给用户带来便利的同时引发了一个新的问题——保存在移动设备上的资料该怎样共享出去?到了思考时间,普通青年这样想:折腾什么劲啊,直接用 ...
- Android开发—智能家居系列】(二):用手机对WIFI模块进行配置
在实际开发中,我开发的这款APP是用来连接温控器,并对温控器进行控制的.有图为证,哈哈. 上一篇文章[Android开发—智能家居系列](一):智能家居原理的文末总结中写到: 手机APP控制智能温控器 ...
- android开发获取网络状态,wifi,wap,2g,3g.工具类(一)
android开发获取网络状态整理: package com.gzcivil.utils; import android.content.Context; import android.net.Con ...
- Android开发权威指南(第2版)新书发布
<Android 开发权威指南(第二版)>是畅销书<Android开发权威指南>的升级版,内容更新超过80%,是一本全面介绍Android应用开发的专著,拥有45 章精彩内容供 ...
- Android开发常用权限设置
加在AndroidManifest.xml 文件中manifest标签以内,application以外 例如:<!--网络权限 --> <uses-permission androi ...
- android开发,权限获取
转:http://blog.csdn.net/yawinstake/article/details/6748897 访问登记属性 android.permission.ACCESS_CHECKIN_P ...
随机推荐
- java线程的简单实用
1.start(): 先来看看Java API中对于该方法的介绍: 使该线程开始执行:Java 虚拟机调用该线程的 run 方法. 结果是两个线程并发地运行:当前线程(从调用返回给 start 方法) ...
- Visual Studio模板代码注释小技巧分享
在日常开发过程中,难免有这样一种需求:就是你所建的每一个类文件或者接口文件都需要标注下作者姓名以及类的用途.如果我们每次创建文件的时候都需要写一遍这些信息是很烦神的.还好Visual Studio给我 ...
- Map集合的4种遍历方式
import java.util.HashMap;import java.util.Iterator;import java.util.Map; public class TestMap { p ...
- shell写的俄罗斯方块
共享一下. #!/bin/bash # Tetris Game # xhchen<[email]xhchen@winbond.com.tw[/email]> #APP declaratio ...
- Python连载20-偏函数&zip函数&enumerate函数
一. 偏函数 二. #先举个例子 #把字符串转换为十进制数字 int(') #help(int),int函数中有一个参数base代表把它转换某个进制的数字 #把八进制的字符串转换为十进制 eight ...
- 第七章 手动部署Fisco Bcos 区块链并完成新增群组,在原有群组中新增机构
鉴于笔者以前各大博客教程都有很多人提问,早期建立一个技术交流群,里面技术体系可能比较杂,想了解相关区块链开发,技术提问,请加QQ群:538327407 目标 1.新增群组搭建完整联盟链 2.根据群组新 ...
- 你确定你会写 Dockerfile 吗?
如今 GitHub 仓库中已经包含了成千上万的 Dockerfile,但并不是所有的 Dockerfile 都是高效的.本文将从五个方面来介绍 Dockerfile 的最佳实践,以此来帮助大家编写更优 ...
- JAVA UUID 生成唯一密钥(可随机选择长度)
/** * 获得指定数目的UUID * @param number int 需要获得的UUID数量 * @return String[] UUID数组 */ ...
- cocopods新建或者更新远端库主要操作步骤
1.搭建远程仓库(私有或者公有项目): 2.使用sourceTree拉去远程仓库: 3.打开拉去的项目仓库Finder,构建pod lib项目:pod lib create AFNetworking( ...
- 在xcode中新建项目使用Image.xcassets时不显示自定义图片
这个很简单,先在Images.xcassets中设置一个LaunchImage,然后再项目设置的general-->App Icons and Launch Images-->Launch ...