Получение видеопотока IP Cam на Android (MJEPG) - PullRequest
15 голосов
/ 20 декабря 2010

В настоящее время я работаю над проектом AndAR в группе из 3 человек. Я отвечаю за потоковую передачу видео на телефон Android.Я приобрел IP-камеру D-Link DCS-920 и обнаружил, что она использует кодек MJPEG для потокового видео в реальном времени, а веб-сервер использует Jview для просмотра потокового видео.Насколько я знаю, MJPG не является поддерживаемым типом файлов для ОС Android, поэтому я выдвинул идею, что вместо использования ImageView я использую WebView для потоковой передачи видео.Я реализовал очень простую концепцию, и она работает!Но проблема в том, что частота обновления ужасна.Я получаю видеоизображение (например: http://192.168.1.10/image.jpg) для просмотра в WebView и внедряю таймер для управления частотой обновления (предполагается, что он установлен на 30 кадров в секунду, то есть обновление каждые 33 мс), но он может работать только с интервалом до 500 мс,любой более низкий интервал, который я заметил, не будет более плавным, иногда изображение не загружается, а соединение нестабильно (например, обрывается).Может ли это быть, я освежаю со скоростью быстрее, чем он может получить?Но на веб-сервере 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)
    }
}

Есть ли в любом случае, я могу получить видео поток по крайней мере 15 кадров в секунду / с более быстрой частотой обновления?Есть ли такая вещь, как просмотрщик MJPEG / исходный код, который я могу использовать для отображения этих изображений?

вот скриншот приложения http://s945.photobucket.com/albums/ad295/kevinybh/?action=view&current=video.jpg (недостаточно точек для публикации изображений): (

Мне просто нужно сделать видео поток около 15-30 кадров в секунду. Любые предложения / помощь будут очень благодарны :) Спасибо!

Ответы [ 5 ]

1 голос
/ 12 марта 2014

Вместо Arduino вы можете использовать Raspberry PI, у него должно быть достаточно мощности процессора, чтобы управлять транспортным средством и одновременно конвертировать видеопоток. Конечно, вам нужно перенести все программное обеспечение Arduino на Raspberry ...

0 голосов
/ 20 августа 2013

Вы можете использовать класс MjpegView для непосредственного отображения потока mjpeg. https://code.google.com/p/android-camera-axis/source/browse/trunk/serealisation/src/de/mjpegsample/MjpegView/MjpegView.java?r=33

Вам нужно будет реализовать несколько AsyncTasks для этого класса, чтобы он работал нормально.

Удачи

0 голосов
/ 19 октября 2011

На андроиде, если мы декодируем jpeg процессором, это будет стоить 40-100мс. Если мы хотим воспроизвести mjpeg до 15-30 кадров в секунду, нам нужен аппаратный декодер jpeg.

0 голосов
/ 03 марта 2012

Было полезное предыдущее обсуждение SO , и это отличное обсуждение с кодом .Не могли бы вы попробовать и дайте нам знать, если это работает для вас.

0 голосов
/ 20 декабря 2010

MJPEG - ужасно неэффективный способ доставки движущегося видео на мобильное устройство, поскольку каждый кадр сжимается как отдельная независимая картинка.Для приложения, которое не нуждается в видео (кто-то спрашивал о камере, просматривающей линии ожидания на прошлой неделе), ваше решение выдвигать статический кадр каждую секунду или около того звучит хорошо.

Если вам нужно видео, я бырекомендуем вам выполнить перекодировку на вашем веб-сервере из MJPEG в поддерживаемый формат видео, который использует межкадровое сжатие.Это приведет к гораздо меньшему количеству данных, передаваемых как по 3g-соединению пользователя, так и с вашего сервера всем его клиентам.Вам нужно всего лишь запустить один механизм транскодирования для поддержки всех клиентов - и вы сможете использовать его для устройств Android и iPhone, хотя вам может потребоваться выход с более высоким разрешением для планшетов и ПК, если ваша камера выводитдостаточно, чтобы оправдать это.

...