0

我必须在我的 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 进行了测试,但无法AVPacket使用我的 UDP 数据分配 an ,以便使用avcodec_send_packetand进行解码avcodec_receive_frame。我也遇到了问题AVCodecContext,因为我的 UDP 通信不是像 RTSP 这样的流,它可以获取有关其来源的信息。因此,我不得不改变我试图解决问题的方式。

然后,我找到了 libstreaming,其中可以关联将 android 摄像机流式传输到Wowza Server,创建类似于 RTSP 流连接的东西,可以使用 OpenCV 在我的最终 C++ 应用程序中轻松获取数据videoCapture。但是,libstreaming 使用自己的surfaceView. 换句话说,我必须将 libstreamingsurfaceView与 DJI Drone 的videoSurface. 我对Android真的很陌生,所以不知道如何做到这一点。

总而言之,这是正确的方法吗?有人有更好的主意吗?提前致谢

4

2 回答 2

1

我要赌几件事。嗯,主要是一件事。通常需要在发送之前处理创建分段的视频数据包。h264 的 IDR 对于 udp 流来说太大了。

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

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

一旦你有一个用于 IDR 和大切片的分包器,在接收器上写下你的解包器,然后你应该得到清晰的解码图片。

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

于 2017-04-29T17:46:02.720 回答
0

折腾了好久,终于开发出一个可以正确串流大疆无人机摄像头的系统

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

于 2017-06-05T14:37:51.397 回答