我正在开发一个Android应用来监视某些IP摄像机.
我正在使用MjpegView Class播放视频.
我有三个相机.
-摄像头1:我在互联网上找到的公用摄像头,没有用户名/密码.
-摄像机2:一台公共摄像机,但这需要用户名/密码.
-相机3:我最终将在我的应用中使用的相机.它还将要求提供凭据.
我主要活动中的代码如下:
public class MainActivity extends Activity {
private MjpegView mv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Camera 1
String URL = "http://216.62.222.101/mjpg/video.mjpg";
//Camera 2
// String URL = "http://user:user@iprobocam.marmitek.com/cgi/mjpg/mjpg.cgi";
//Camera 3
// String URL = "http://MyIp:MyPort/mjpg/video.mjpg";
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
mv = new MjpegView(this);
setContentView(mv);
mv.setSource(MjpegInputStream.read(URL));
mv.setDisplayMode(MjpegView.SIZE_BEST_FIT);
mv.showFps(true);
}
public void onPause() {
super.onPause();
mv.stopPlayback();
}
我可以毫无问题地串流相机1.当我使用2号或3号摄像机运行该应用程序时,没有错误也没有警告,但我得到最多的是黑屏.我认为身份验证有问题,但是如果将其从相机中删除,则会得到相同的结果,即黑屏.
使其中一些可以工作但其他不工作的摄像机之间有什么区别?
在此先感谢您的帮助.
-编辑-
使用相机2运行该应用程序时,我发现有些奇怪的地方.
当它调用方法MjpegInputStream.readMjpegFrame时,我在MjpegView类中捕获了一个异常.
更深入地看,我注意到方法getEndOfSeqeunce总是返回1,而Camera 1(运行良好的方法)返回更高的值(介于66和68之间).
我希望这可以使人们了解这里发生的事情…
解决方法:
终于我解决了!
我不知道为什么在我第一次尝试流传输此摄像机以删除身份验证时它不起作用.但是今天我又尝试了一次,现在可以了.
所以现在问题出在身份验证中.像在浏览器中一样,无法在URL中添加凭据.
我刚刚修改了MjpegInputStream以在HTTPClient中设置凭据:
DefaultHttpClient httpclient = new DefaultHttpClient();
httpclient.getCredentialsProvider().setCredentials(new AuthScope(host, AuthScope.ANY_PORT), new UsernamePasswordCredentials(username, password));
res = httpclient.execute(new HttpGet(URI.create(url)));
是的,终于可以了