3

一部の IP カメラを監視するための Android アプリを開発しています。ビデオをストリーミングするためにMjpegView クラスを使用しています。

私は3台のカメラを持っています。

    - カメラ 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 の間) を返します。

これが誰かにここで何が起こっているかのアイデアを与えることができることを願っています...

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 に答える