Obtener flujo de vídeo IP Cam en Android (MJEPG)

Actualmente estoy haciendo un proyecto AndAR en grupo de 3. Soy la persona que está a cargo de la transmisión de vídeo en el teléfono Android. Tengo una cámara D-Link DCS-920 IP y descubrí que usa codec MJPEG para la transmisión de video en vivo y el servidor web usa Jview para ver la transmisión en vivo. Por lo que sé MJPG no es un tipo de archivo compatible para Android OS por lo que he salido con una idea, en lugar de utilizar ImageView, uso WebView para transmitir el video. He implementado un concepto muy simple y funciona! Pero el problema es que la tasa de actualización es terrible. Consigo la imagen video (por ejemplo: http://192.168.1.10/image.jpg ) para ver en el WebView e implementar un contador de tiempo para controlar la tarifa de refresco (supuesto para fijarla a 30fps, que se refresca cada 33ms) pero él sólo puede ir hasta 500ms intervalo, cualquier intervalo inferior me doy cuenta de que no será más suave, a veces la imagen no carga y la conexión es inestable (por ejemplo, se redujo). ¿Podría ser esto estoy refrescando a un ritmo más rápido de lo que puede recibir? Pero más en el servidor web Jview no tiene ningún problema! estaba tratando de encontrar el código fuente para el jview, pero no tengo esperanza. De todos modos aquí está el código que he escrito

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

¿Hay de todos modos puedo obtener la secuencia de vídeo por al menos 15fps / tienen una velocidad de actualización más rápida? ¿Hay algo como MJPEG visor / código fuente que puedo utilizar para mostrar estas imágenes?

aquí está la captura de pantalla de la aplicación http://s945.photobucket.com/albums/ad295/kevinybh/?action=view&current=video.jpg (no hay suficientes puntos para publicar imágenes) 🙁

Sólo necesito hacer el flujo de video alrededor de 15-30 fps. cualquier sugerencia / ayuda sería apreciada muy profundamente 🙂 ¡Gracias!

En lugar de un Arduino puede utilizar un PI de frambuesa, debe tener suficiente potencia de CPU para controlar el vehículo y convertir el flujo de vídeo al mismo tiempo. Seguro, necesitarás transferir todo tu software Arduino a Frambuesa …

MJPEG es una manera terriblemente ineficaz de entregar vídeo en movimiento a un dispositivo móvil, porque cada cuadro se comprime como su propia imagen independiente. Para una aplicación que no necesita vídeo (alguien preguntó acerca de una cámara viendo las líneas de espera la semana pasada) su solución de empujar un marco estático cada segundo o algo así suena bien.

Si necesitas video de movimiento, te recomendaría hacer la transcodificación en tu servidor web desde MJPEG a un formato de video compatible que utiliza la compresión de marco a cuadro. Esto resultará en mucho menos datos a empujar, tanto por la conexión 3g del usuario como desde su servidor a todos sus clientes. Sólo necesitará ejecutar un motor de transcodificación para dar soporte a todos los clientes, y podrá usar el mismo para los dispositivos Android y iPhone, aunque también puede tener una salida de mayor resolución para tablets y PC si la salida de la cámara es lo suficientemente bueno como para justificarlo.

En android, si decodificamos un jpeg por CPU, costará 40-100ms. Si queremos jugar mjpeg a 15-30fps, necesitamos descodificador de jpeg de hardware.

Había una útil anterior SO discusión y esta gran con código . ¿Podría intentar y háganos saber si eso funciona para usted.

Puede utilizar la clase MjpegView para mostrar el flujo mjpeg directamente. https://code.google.com/p/android-camera-axis/source/browse/trunk/serealisation/src/de/mjpegsample/MjpegView/MjpegView.java?r=33

Tendrás que implementar algunas AsyncTasks en esta clase para funcionar bien.

Buena suerte

  • Android - Cómo iniciar la grabación de vídeo automáticamente cuando se llama a la cámara intención
  • Android - vídeo de la cámara verticalmente volteado
  • Estabilización de video en tiempo real
  • Cómo seleccionar el video de la galería y recortar / cambiar el tamaño, al igual que el recorte de imágenes en android
  • WebView y HTML5 <video>
  • ¿Acelerando el cifrado?
  • ¿Cómo grabar video con superposición animada en Android?
  • Gesto del usuario necesario para iniciar la reproducción en el reproductor HTML5 de Android
  • Archivo de vídeo sdk cut / trim de Android
  • Actividad de código abierto de Android para que el usuario seleccione / cree un medio?
  • Cómo activar FullScreen con VideoView Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.