web-dev-qa-db-ja.com

Android(MJPEG)でIP Camビデオストリームを取得しています

私は現在、グループ3のAndARプロジェクトを行っています。Android電話にビデオストリーミングを担当するのは私です。私はD-Link DCS-920 IPカメラを手に入れました。ライブビデオストリームにMJPEGコーデックを使用し、ウェブサーバーがJviewを使用してライブストリームを表示していることがわかりました。私の知る限り、MJPGはAndroid OSでサポートされているファイルタイプではないため、 ImageViewを使用する代わりに、アイデアを思いついたのですが、WebViewを使用してビデオをストリーミングしています。非常にシンプルなコンセプトを実装し、それが機能します!しかし、問題は、リフレッシュレートがひどいことです。ビデオ画像(たとえば:http://192.168.1.10/image.jpg)WebViewで表示し、リフレッシュレートを制御するためのタイマーを実装します(これを30fpsに設定し、33msごとにリフレッシュします)。ただし、最大で500msの間隔にしかできません。より滑らかな場合、画像が読み込まれず、接続が不安定になる(例:落ちる)。これは私が受け取ることができるよりも速い速度でリフレッシュしていますか?しかし、WebサーバーのJviewでは問題ありません。 jviewのソースコードを見つけようとしていましたが、希望はありません。とにかくここに私が書いたコードがあります

package org.example.test;

import Java.util.Timer;
import Java.util.TimerTask;

import Android.app.Activity;
import Android.os.Bundle;
import Android.view.View;
import Android.webkit.WebView;
import Android.widget.Button;
import Android.widget.EditText;

public class Webview extends Activity {

public WebView webView;
public Timer autoUpdate;
public String url;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);    

        webView = (WebView) findViewById(R.id.webview);
        webView.getSettings();
        final EditText urlText = (EditText) findViewById(R.id.urlText);

        //Buttons//////////////////------------
        final Button connectB = (Button)findViewById(R.id.connectButton);
        connectB.setOnClickListener(new View.OnClickListener() {
         public void onClick(View v) {
            //Actions goes here
          url = urlText.getText().toString();
          webView.loadUrl(url);
          timerSetup();
         }
        });
        final Button exitB = (Button)findViewById(R.id.exitButton);
     exitB.setOnClickListener(new View.OnClickListener() {
      public void onClick(View v) {
       //Actions goes here
       finish();
      }
     });
   }

    //refresh timer//////////////-----------------
    public void timerSetup(){
     autoUpdate = new Timer();
     autoUpdate.schedule(new TimerTask() {
      @Override
      public void run() {
       runOnUiThread(new Runnable() {
        @Override
     public void run() {
         //Actions goes here
         webView.loadUrl(url);
        }
       });
      }
     }, 0, 500);//refresh rate time interval (ms)
    }
}

とにかく、少なくとも15fpsでビデオストリームを取り込むことができますか?これらの画像を表示するために使用できるMJPEGビューアー/ソースコードなどはありますか?

これがアプリのスクリーンショットです http://s945.photobucket.com/albums/ad295/kevinybh/?action=view&current=video.jpg (写真を投稿するにはポイントが足りません):(

ビデオストリームを約15〜30 fpsにする必要があります。任意の提案/ヘルプは非常に深く感謝されます:)ありがとう!

15
Kevin

Arduinoの代わりにRaspberry Piを使用できます。これには、車両を制御し、同時にビデオストリームを変換するのに十分なCPUパワーが必要です。もちろん、ArduinoソフトウェアをすべてRaspberryに移植する必要があります...

1
Marco

MjpegViewクラスを使用して、mjpegストリームを直接表示できます。 https://code.google.com/p/Android-camera-axis/source/browse/trunk/serealisation/src/de/mjpegsample/MjpegView/MjpegView.java?r=

正常に動作するには、このクラスにいくつかのAsyncTaskを実装する必要があります。

幸運を

0
robpf

Androidでは、CPUでjpegをデコードすると、40〜100ミリ秒かかります。 mjpegを15〜30fpsで再生するには、ハードウェアjpegデコーダーが必要です。

0
xufan

各フレームは独自の独立した画像として圧縮されるため、MJPEGはモバイルデバイスにモーションビデオを配信するのに非常に非効率的な方法です。ビデオを必要としないアプリケーション(先週誰かが待ち行列を監視しているカメラについて尋ねていた)の場合、静的フレームを毎秒程度プッシュするソリューションは良さそうです。

モーションビデオが必要な場合は、MJPEGからフレーム間圧縮を利用するサポートされているビデオ形式にウェブサーバーでトランスコーディングすることをお勧めします。これにより、ユーザーの3g接続とサーバーからすべてのクライアントへのプッシュのデータ量が大幅に減少します。すべてのクライアントをサポートするには、1つのトランスコーディングエンジンを実行するだけで済みます。Android&iphoneデバイスでも同じものを使用できますが、より高い解像度も必要になる場合があります。カメラ出力がそれを正当化するのに十分良い場合は、タブレットとPCの出力。

0
Chris Stratton

便利な 前のSOディスカッション とこれ コード付きの素晴らしいもの がありました。それがうまくいくかどうか、試してみてお知らせください。

0
Walter K