2017-04-16 123 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型。

相关问题