2017-04-16 15 views
0

私はC++アプリケーションでDJI Phantom 3カメラからライブストリームビデオを入手して、OpenCVでコンピュータビジョン処理を行う必要があります。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でテストしましたが、avcodec_send_packetavcodec_receive_frameを使ってデコードするために、私のUDPデータでAVPacketを割り当てることができませんでした。私のUDP通信はRTSPのようなストリームではなかったので、そのソースに関する情報を得ることができるので、AVCodecContextにも問題がありました。したがって、どのように問題を解決しようとしていたのかを変えなければなりませんでした。

はその後、私はデータをOpenCVのvideoCaptureを使用して簡単に私の最後のC++アプリケーションで得ることができRTSPストリーム接続、のようなものを作成し、Wowza ServerにAndroidのビデオカメラをストリーミングする関連付けることが可能なlibstreamingを見つけました。ただし、libstreamingは独自のsurfaceViewを使用します。言い換えれば、libstreaming surfaceViewとDJI DroneのvideoSurfaceをリンクする必要があります。私はAndroidには本当に新しいので、それを行う方法の手掛かりはありません。

合計すると、正しいアプローチですか?誰か良いアイデアがありますか?事前に感謝

答えて

1

私はいくつかのことを賭けに行くよ。まあ、大部分は1つです。通常は、フラグメント化されたビデオパケットを送信する前に作成する必要があります。 h264のIDRはudpストリーミングには大きすぎます。

エンドポイント間に堅固なCOMリンクがある場合は、1つの大きなパケット入力を1つ以上の小さなパケット出力に変換する方法を追加できます。

おそらく1000バイトを超えるパケットは、いくつかのh264 NALUタイプ28に分割する必要があります。小さいタイムスタンプを持つパケットは、STAP-Aタイプ24で送信できます。典型的には、inband sps/ppsはstap-aで見つけることができます。

IDRと大スライス用のパケッタイザーを作成したら、受信者にdepacketizorを書き留めて、解読されたピクチャをクリアにする必要があります。

タイプ28の作成方法については、h264 RTPの仕様を参照してください。

関連する問題