3

我正在开发一个 android 应用程序来监控一些 IP 摄像机。我正在使用MjpegView 类来流式传输视频。

我有三个相机。

    - 摄像头 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,而 Camera 1(运行良好的那个)返回更高的值(在 66 和 68 之间)。

我希望这可以让某人了解这里发生的事情......

4

2 回答 2

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)));

是的,终于它起作用了

于 2013-02-05T14:14:34.273 回答
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)));
于 2015-10-15T03:04:41.220 回答