Windows Phone 版的《IP摄像头》来了,跟Android版的一样易于使用!
下载地址 http://www.windowsphone.com/s?appid=8109efff-af2b-4835-92e0-a8aeb1cb534d
查看视频演示

《IP摄像头》是一个简单的应用程序,可以把你的手机变成无线IP摄像头并广播MJPEG格式的视频流,你可以使用支持MJPG视频流的浏览器(比如Chrome)或者《IP摄像头》这个APP本身查看。甚至通过《IP摄像头》这个APP把手机摄像头用于Skype,QQ的视频聊天。
特别的,如果你使用浏览器查看,你还可以通过浏览器直接控制手机摄像头的分辨率,对焦,闪光灯,甚至前后摄像头切换!当然,它还支持用户名和密码认证,默认情况下用户名和密码都是admin,您可以在设置里面进行修改。

今天编写了一个驱动程序IP Camera Bridge,可以把《IP摄像头》转发出的MJPG视频流给QQ等程序使用。先看下效果图:

使用IP摄像头进行QQ聊天

使用IP摄像头进行QQ聊天

 

操作很简单,手机上安装好《IP摄像头》后,再在PC端装好IP Camera Bridge

在MJPEG URL填入《IP摄像头》中提示的视频流地址,如果你有设置用户名和密码,再填上去即可,分辨率可以保持默认,或者通过手机上的《IP摄像头》切换!点击 确定,然后再打开QQ等软件,选择IP Camera Bridge Plus这个设备即可,即可!

我试过在使用的时候切换前后摄像头都没问题!把手机上的《IP摄像头》调在720p分辨率上,这样你可以使用“无线HD摄像头”跟好友聊天了!

 

要让Android在锁屏下继续运行,用如下的代码即可实现。

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag");
wl.acquire();
   ..screen will stay on during this section..
wl.release();

在实现IP摄像头锁屏下运行时,发现这个代码没效果,锁屏后程序还是会断开连接。程序是在onCreate中调用acquire()获得WakeLock的,而在onDestory中Release()掉,并且在xml中加入了相应权限,运行也没报错,按理说有效果才对。

跟踪程序后发现,每次锁屏onDestory都会被调用,所以WakeLock就给Release了。用onDestory和锁屏两个作为关键词谷歌了一下,发现这个是由于程序在横屏下锁屏后会被“竖屏”,然后如果Activity不加android:configChanges=”orientation”就会经历一次销毁再创建的过程……

参考如下  blog.csdn.net/terrantian/article/details/18670381

解决方法如下:

在对应的Activity加入android:configChanges=”orientation|screenSize”即可。最后实现了IP摄像头在锁屏下继续工作!

经过一个多星期的努力,IP摄像头5.3版终于诞生的,这个版本的网页端采用了全新的界面,感谢bootstrap,让它可以适配PC端到移动端浏览器来查看视频流。这个版本支持通过网页来控制手机摄像头的分辨率,拍照,闪光灯,对焦,甚至前后摄像头切换。最后,这个版本支持锁屏下广播视频流,按一下电源键,锁屏,屏幕关闭,更加省电!

献上一段演示视频:

锁屏下 IP摄像头 仍然在工作
锁屏下 IP摄像头 仍然在工作

网页端控制
网页端控制

新版变化
1.全新的浏览器查看页面,响应式布局,支持移动版Chrome
2.浏览器端支持摄像头控制,包括分辨率、闪光灯、对焦以及前后摄像头切换等
3.支持锁屏下使用,更加省电。按下电源键锁屏后程序将继续广播视频流。
4.支持浏览器端拍照,点击页面中的‘快照’按钮即可
5.改善程序稳定性以及代码速度优化

各大应用商店将陆续上线,请认准5.3版 IP摄像头 →→右边栏有下载链接:)

最近在更新《轻松编辑》《IP摄像头》的网页服务器部分时,遇到了两个String的问题。

第一个是获取String占用的内存字节数,自己想当然直接用length()函数取得了长度了,可到了socket发送数据的时候总是发送不完整(字符串中包含中文),后面Debug之后才发现length得到的是字符数,而不是内存中的字节数,一个中文在UTF8编码下要占用3个字节,自然得到的长度变短了,所以发送不完整。正确做法是getBytes(),再在返回的数组中取length。

第二个是截取String指定区间的子字符串,函数substring (int start, int end)。比如要取索引2到5这4个字符,直接substring (2, 5)……然后得到的是索引2到4三个字符组成的字符串,索引5的那个字符并没有出现,后面查了一下谷歌,才发现substring (int start, int end)返回的字符串不包含索引end的字符!!!所以正确的应该是substring (2, 6)。

发现了这两个特别注意的地方,就是不知道先前的代码有没出现过这两个错误。