Получение видеопотока IP Cam на Android (MJEPG)
В настоящее время я делаю проект 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 viewer/source code, которые я могу использовать для отображения этих изображений?
вот скриншот приложения
http://s945.photobucket.com/albums/ad295/kevinybh/?action=view¤t=video.jpg
(недостаточно очков для публикации фотографий): (
Мне просто нужно сделать видеопоток вокруг 15-30 кадров в секунду. любые предложения/помощь будут очень глубоко оценены:) Спасибо!
Ответы
Ответ 1
Вместо Arduino вы можете использовать PI малины, он должен обладать достаточной мощностью процессора для управления автомобилем и одновременного преобразования видеопотока. Конечно, вам нужно будет перенести все ваше программное обеспечение Arduino в малину...
Ответ 2
MJPEG - это ужасно неэффективный способ доставки видео на мобильное устройство, потому что каждый кадр сжимается, поскольку он является независимым изображением. Для приложения, которое не нуждается в видео (кто-то спрашивал о том, что камера просматривает очереди ожидания на прошлой неделе), ваше решение нажимать статический кадр каждую секунду или около того звучит хорошо.
Если вам требуется видеоролик, я бы порекомендовал вам транскодирование на вашем веб-сервере из MJPEG в поддерживаемый формат видео, который использует сжатие от кадра к кадру. Это приведет к гораздо меньшему количеству данных, которые будут подталкивать, как через подключение пользователя 3g, так и от вашего сервера ко всем своим клиентам. Вам нужно только запустить один движок транскодирования для поддержки всех клиентов - и вы сможете использовать тот же самый для устройств Android и iphone, хотя вы можете также иметь более высокое разрешение для планшетов и ПК, если выход вашей камеры достаточно для его оправдания.
Ответ 3
На андроиде, если мы декодируем jpeg от CPU, это будет стоить 40-100 мс. Если мы хотим играть в mjpeg до 15-30 кадров в секунду, нам нужен аппаратный декодер jpeg.
Ответ 4
Был полезный предыдущий SO обсуждение и этот отличный с кодом. Не могли бы вы попытаться сообщить нам, если это сработает для вас.
Ответ 5
Вы можете использовать класс MjpegView для непосредственного отображения потока mjpeg.
https://code.google.com/p/android-camera-axis/source/browse/trunk/serealisation/src/de/mjpegsample/MjpegView/MjpegView.java?r=33
Вам нужно будет реализовать некоторые AsyncTasks в этом классе, чтобы нормально работать.
Удачи.