尝试在Android中流式传输IP摄像头的黑屏

时间:2013-02-04 21:23:14

标签: android streaming mjpeg ip-camera

我正在开发一款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运行应用程序时发现了一些奇怪的东西。 我在调用方法MjpegView时在MjpegInputStream.readMjpegFrame类中捕获异常。 更深入地看,我注意到方法getEndOfSeqeunce总是返回1,而相机1(运行良好的那个)返回更高的值(66到68之间)。

我希望这能让人知道这里发生了什么......

2 个答案:

答案 0 :(得分: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 :(得分: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)));