2013-02-04 82 views
3

我正在开发一款android应用程序来监视某些IP摄像机。 我使用MjpegView Class来传输视频。尝试在android中流式传输IP摄像头时出现黑色屏幕

我有三个摄像头。

    - 相机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:[email protected]/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 的应用程序,我捕捉异常,在MjpegView类时,它调用的方法MjpegInputStream.readMjpegFrame。 更深入地看,我注意到方法getEndOfSeqeunce总是返回1,而摄像机1(效果很好的那个)返回更高的值(66和68之间)。

我希望这可以给别人这里发生了什么的想法...

回答

3

最后我解决它!

我不知道为什么它没有工作,我第一次尝试流式传输此相机删除身份验证。但今天我再次尝试,现在它可以工作。

所以现在问题出现在验证中。无法像在浏览器中那样在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))); 

是的,最后它的工作

1

这工作太多,如果你不想输入主机名。

CredentialsProvider provider = new BasicCredentialsProvider(); 
UsernamePasswordCredentials credentials = new UsernamePasswordCredentials("username", "password"); 
provider.setCredentials(AuthScope.ANY, credentials); 
DefaultHttpClient httpclient = new DefaultHttpClient(); 
httpclient.setCredentialsProvider(provider); 
res = httpclient.execute(new HttpGet(URI.create(url))); 
相关问题