如何从DJI Professional 3相机流式传输实时视频?

时间:2017-04-16 00:49:19

标签: android c++ ffmpeg dji-sdk libstreaming

我必须在我的C ++应用程序中获取DJI Phantom 3相机的直播视频,以便在OpenCV中进行计算机视觉处理。

首先,我尝试通过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非常陌生,所以不知道如何做到这一点。

总结一下,这是正确的做法吗?有人有更好的主意吗?提前致谢

2 个答案:

答案 0 :(得分:1)

我打算下几件事。好吧,大部分是一件事。通常需要在发送之前处理创建分段视频分组。 h264的IDR对于udp流媒体来说太大了。

在端点之间具有可靠的COM链接,您可以添加一种方法,将单个可能较大的数据包输入转换为一个或多个小数据包输出。

大于1000字节的数据包需要分成几个h264 NALU类型28。可以在STAP-A类型24s中发送小且具有相同时间戳的分组。通常,您可以在stap-a中找到带内sps / pps。

一旦你有了IDR和大片的分组器,你就可以在接收器上写下depacketizor然后你应该得到清晰的解码图片。

有关如何制作28s类型的信息,请参阅h264 RTP规范。

答案 1 :(得分:0)

经过很长一段时间,我终于开发出一个可以正确播放DJI无人机相机的系统

https://github.com/raullalves/DJI-Drone-Camera-Streaming