如何从 DJI Professional 3 相机流式传输实时视频?
How to stream live video from DJI Professional 3 camera?
我必须在我的 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 库进行了测试,但无法使用我的 UDP 数据分配 AVPacket
,以便使用 avcodec_send_packet
和 avcodec_receive_frame
进行解码。 AVCodecContext
我也遇到了问题,因为我的 UDP 通信不是像 RTSP 那样的流,它可以在其中获取有关其源的信息。因此,我不得不改变我尝试解决问题的方式。
然后,我发现 libstreaming, in which can be associate to stream the android video camera to a Wowza Server,创建类似 RTSP 流连接的东西,可以使用 OpenCV videoCapture
在我最终的 C++ 应用程序中轻松获取数据。然而,libstreaming 使用它自己的 surfaceView
。换句话说,我将不得不 link libstreaming surfaceView
与 DJI 无人机的 videoSurface
。我是 Android 的新手,所以不知道如何操作。
综上所述,这是正确的做法吗?有人有更好的主意吗?提前致谢
我要打赌几件事。好吧,主要是一件事。人们通常需要在发送视频数据包之前处理创建碎片视频数据包的问题。 h264 的 IDR 对于 udp 流来说太大了。
在端点之间有一个可靠的 com link,您可以添加一种方法,将单个潜在的大数据包输入转换为一个或多个小数据包输出。
大于1000字节的数据包需要分成几个h264 NALU type 28s。较小且具有相同时间戳的数据包可以在 STAP-A 类型 24 中发送。通常,您可以在 stap-a.
中找到带内 sps/pps
一旦你有了用于 IDR 和大切片的分包器,将你的分包器写在接收器上,然后你应该得到清晰的解码图片。
请参阅 h264 RTP 规范,了解如何制作 28s 类型。
折腾了好久,终于开发出可以正确串流大疆无人机相机的系统
我必须在我的 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 库进行了测试,但无法使用我的 UDP 数据分配 AVPacket
,以便使用 avcodec_send_packet
和 avcodec_receive_frame
进行解码。 AVCodecContext
我也遇到了问题,因为我的 UDP 通信不是像 RTSP 那样的流,它可以在其中获取有关其源的信息。因此,我不得不改变我尝试解决问题的方式。
然后,我发现 libstreaming, in which can be associate to stream the android video camera to a Wowza Server,创建类似 RTSP 流连接的东西,可以使用 OpenCV videoCapture
在我最终的 C++ 应用程序中轻松获取数据。然而,libstreaming 使用它自己的 surfaceView
。换句话说,我将不得不 link libstreaming surfaceView
与 DJI 无人机的 videoSurface
。我是 Android 的新手,所以不知道如何操作。
综上所述,这是正确的做法吗?有人有更好的主意吗?提前致谢
我要打赌几件事。好吧,主要是一件事。人们通常需要在发送视频数据包之前处理创建碎片视频数据包的问题。 h264 的 IDR 对于 udp 流来说太大了。
在端点之间有一个可靠的 com link,您可以添加一种方法,将单个潜在的大数据包输入转换为一个或多个小数据包输出。
大于1000字节的数据包需要分成几个h264 NALU type 28s。较小且具有相同时间戳的数据包可以在 STAP-A 类型 24 中发送。通常,您可以在 stap-a.
中找到带内 sps/pps一旦你有了用于 IDR 和大切片的分包器,将你的分包器写在接收器上,然后你应该得到清晰的解码图片。
请参阅 h264 RTP 规范,了解如何制作 28s 类型。
折腾了好久,终于开发出可以正确串流大疆无人机相机的系统