Decodificación de flujo de vídeo en Android de DJI drone

Hola me gustaría hacer algún procesamiento de imágenes con el uso de OpenCv en la secuencia de vídeo de DJI phantom 3 pro. Desafortunadamente para esto es necesario hacer su propio vídeo de decodificación. Sé que debe ser el trabajo con el uso de Media Codec clase Android, pero no sé cómo hacer. He visto algunos ejemplos para la decodificación de vídeo de archivo de vídeo, pero no pude modificar este código para mi objetivo. ¿Podría alguien mostrar algún ejemplo o tutorial cómo hacerlo? Gracias por la ayuda

mReceivedVideoDataCallBack = new DJIReceivedVideoDataCallBack(){ @Override public void onResult(byte[] videoBuffer, int size){ //recvData = true; //DJI methods for decoding //mDjiGLSurfaceView.setDataToDecoder(videoBuffer, size); } }; 

Este es el método que está enviando flujo de codificación desde el drone, y tengo que enviar para decodificar el videoBuffer y luego modificar a Mat para OpenCV.

Inicializar la devolución de video de este modo

 mReceivedVideoDataCallBack = new DJICamera.CameraReceivedVideoDataCallback() { @Override public void onResult(byte[] videoBuffer, int size) { if(mCodecManager != null){ // Send the raw H264 video data to codec manager for decoding mCodecManager.sendDataToDecoder(videoBuffer, size); }else { Log.e(TAG, "mCodecManager is null"); } } } 

Haga que su actividad implemente TextureView.SurfaceTextureListener y para el TextureView mVideoSurface llame a esta línea después de que se inicialice:

 mVideoSurface.setSurfaceTextureListener(this); 

Y luego implementar:

  @Override public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { Log.v(TAG, "onSurfaceTextureAvailable"); DJICamera camera = FPVDemoApplication.getCameraInstance(); if (mCodecManager == null && surface != null && camera != null) { //Normal init for the surface mCodecManager = new DJICodecManager(this, surface, width, height); Log.v(TAG, "Initialized CodecManager"); } } @Override public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { Log.v(TAG, "onSurfaceTextureSizeChanged"); } @Override public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { Log.v(TAG, "onSurfaceTextureDestroyed"); if (mCodecManager != null) { mCodecManager.cleanSurface(); mCodecManager = null; } return false; } @Override public void onSurfaceTextureUpdated(SurfaceTexture surface) { final Bitmap image = mVideoSurface.getBitmap(); //Do whatever you want with the bitmap image here on every frame } 

¡Espero que esto ayude!

  • Muestra una fuente de video de gstreamer en Google Cartón SurfaceTexture
  • Reproducir video local en la vista web
  • Aplicación de falla en la fusión de videoclips MP4
  • Android: dibuja el video de YouTube en SurfaceTexture
  • ¿Cómo puedo reproducir video html5 en línea en un WebView?
  • La reproducción de vídeo proporciona pantalla en negro pero con sonido
  • Inserción de un vídeo en MediaStore
  • Cómo actualizar Youtube Player View onItemClickListener () en un ListView
  • Cómo transmitir vídeo desde Internet a través de nanoHTTPd a VideoView
  • 06-16 12: 05: 46.802: E / chromium (15693): No se puede seleccionar el dispositivo de audio
  • Android: Reproducción y grabación simultánea de vídeo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.