2015-11-04 63 views
5

您好我想在DJI Phantom 3 pro的視頻流上使用OpenCv做一些圖像處理。不幸的是,這件事情有必要製作自己的解碼視頻。我知道它應該使用Media Codec Android類,但我不知道該怎麼做。我看到了一些從視頻文件解碼視頻的例子,但我無法修改此代碼以達到我的目的。有人可以展示一些例子或教程怎麼做?感謝您的幫助從DJI無人機解碼Android上的視頻流

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

這是方法,是從無人機發送編碼流,我需要發送用於解碼的videoBuffer,然後修改到墊子的OpenCV。

回答

2

初始化視頻回調這樣

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

讓您的活動實施TextureView.SurfaceTextureListener 併爲TextureView mVideoSurface稱此行是初始化後:

mVideoSurface.setSurfaceTextureListener(this); 

,然後執行:

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

希望這可以幫助!