2017-04-16 23 views
0

爲了在OpenCV中完成計算機視覺處理,我必須從我的C++應用程序中獲取來自DJI Phantom 3相機的實時流視頻。如何使用DJI Professional 3相機傳輸實時視頻?

首先,我試圖通過UDP套接字發送H264原始數據,這裏面回調:

 mReceivedVideoDataCallBack = new CameraReceivedVideoDataCallback() { 

     @Override 
     public void onResult(byte[] videoBuffer, int size) { 
      //Here, I call a method from a class I created, that sends the buffer through UDP 
      if (gravar_trigger) controleVideo.enviarFrame(videoBuffer, size); 

      if (mCodecManager != null) mCodecManager.sendDataToDecoder(videoBuffer, size); 

     } 

    }; 

上述通信效果很好。但是,我無法在我的C++桌面應用程序中解碼UDP H264數據。我已經使用FFmpeg lib進行了測試,但無法使用我的UDP數據分配AVPacket,以便使用avcodec_send_packetavcodec_receive_frame進行解碼。我也有AVCodecContext的問題,因爲我的UDP通信不是像RTSP這樣的流,它可以獲取有關其源的信息。因此,我必須改變我試圖解決問題的方式。

然後,我發現libstreaming,其中可以關聯到Android攝像機流到Wowza Server,創造一些像RTSP流連接,其中數據可以在我最後的C++應用程序輕鬆地使用OpenCV的videoCapture獲得。但是,libstreaming使用它自己的surfaceView。換句話說,我必須將libstreaming surfaceView與DJI Drone的videoSurface聯繫起來。我對Android非常陌生,所以不知道如何去做。

綜上所述,這是正確的做法嗎?有人有更好的主意?在此先感謝

回答

1

我打賭下幾件事情。那麼,主要是一件事。通常需要在發送碎片視頻數據包之前處理它們。 hd64的IDR對於udp流式傳輸來說太大了。

在端點之間有一個牢固的com鏈接,您可以添加一個方法,將單個潛在的大數據包輸入轉換爲一個或多個小數據包輸出。

大於1000字節的數據包需要拆分成幾個h264 NALU類型28。小型且具有相同時間戳的數據包可以以STAP-A類型24發送。通常,您可以在stap-a中找到帶內sps/pps。

一旦你有IDRs和大片的packetizer,寫你depacketizor在接收器,然後你應該得到清晰的解碼圖片。

請參閱h264 RTP規格瞭解如何製作28型。

相關問題