2015-11-04 3 views
5

Hi Ich möchte einige Bildverarbeitung mit OpenCv auf Video-Stream von DJI Phantom 3 Pro tun. Leider ist für diese Sache ein eigenes Decoding-Video notwendig. Ich weiß, dass es mit der Verwendung von Media Codec Android Klasse arbeiten sollte, aber ich weiß nicht, wie es geht. Ich habe ein paar Beispiele zum Decodieren von Videos aus Videodateien gesehen, aber ich konnte diesen Code nicht für mein Ziel ändern. Könnte jemand ein Beispiel oder Tutorial zeigen? Vielen Dank für die HilfeDecoding Video Stream auf Android von DJI Drohne

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

Dies ist Methode, die Codierung Strom aus Drohne sendet, und ich brauche die videoBuffer für dekodieren zu senden und dann modifizieren für OpenCV auf Matte.

Antwort

2

Initialisieren der Video-Callback wie diese

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

Machen Sie Ihre Aktivität TextureView.SurfaceTextureListener und für die TextureView mVideoSurface diese Zeile nennen implementieren, nachdem es initialisiert wird:

mVideoSurface.setSurfaceTextureListener(this); 

und dann implementieren:

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

Hoffe das hilft!