相机码流
概述
为帮助开发者更灵活进行无人机的飞行控制,开发者通过使用 PSDK 提供的 API 即可获取 Autel Robotics 无人机相机的码流数据,结合图像识别算法,开发出满足特定使用场景需求的应用程序。
基础概念
相机码流
为满足开发者使用 PSDK 开发的应用程序对获取相机码流的功能,PSDK 提供了获取相机码流的功能,支持获取 1 号云台相机 H.264 码流。
说明
- 由于获取 1 号云台上相机码流的回调函数在各自独立的线程中运行,OpenCV 的 imshow 模块仅支持在一个线程中运行,因此仅支持开发者获取 1 号云台相机 H.264 码流。
- 获取相机码流后,请安装 FFmpeg 等解码器解码。
- 有关 H.264 标准码流的相关参考请参见 H.264 码流标准 。
分辨率和帧频
PSDK 支持开发者获取无人机上 1 号云台上相机的码流,开发者或用户可根据实际的使用需求挂载不同型号的相机,根据相机的型号以及相机的工作模式,指定帧速率,获取所需的码流。
- 拍照模式:
- 相机模式:支持获取分辨率为960 × 720(720p)的图像。
- 视频模式:支持获取分辨率1280 × 720(720p)的视频。
说明:
- 获取主相机码流的帧速率均为 30 fps。
相机 H.264 码流
获取无人机上相机 H.264 码流的流程如下所示:
- 使用获取相机 H.264 码流的功能前,请开发者根据实际的使用需要先实现
UAVLiveView_H264Callback
函数,用于获取并处理相机 H.264 码流。 - 调用
UAV_LiveView_StartH264Stream()
接口,指定所需获取码流的相机、接收相机 H.264 码流的回调函数和用户信息。 - 开启无人机和用户负载设备,运行使用基于 PSDK 开发的应用程序,此时无人机将会向用户负载设备推送 H.264 码流。
- 用户的负载设备接收到 H.264 码流的数据后,将触发(作为入参传入开发者设置的回调函数中)基于 PSDK 开发的应用程序。
- 开发者根据实际需求设计的函数
UAVLiveView_H264Callback
在获取相机 H.264 码流后,将对所获得的 H.264 码流执行存储、解码及转发等相应的操作。
使用获取相机 H.264 码流的功能
1. 开始获取相机 H.264 码流
控制应用程序接收指定相机的 H.264 码流。
/**
* @brief Start the camera H264 stream from the specified position.
* @param position: Camera position for the H264 stream output.
* @param source: sub-camera source for the H264 stream output.
* @param callback: Callback function in a callback thread when a new h264 frame is received
*/
T_UAVReturnCode UAV_LiveView_StartH264Stream(int32_t payload_id, E_UAVLiveViewCameraSource source, UAV_LiveView_H264Callback callback);
2. 停止获取 H.264 码流
控制应用程序停止接收相机的 H.264 码流。
/**
* @brief Stop the Camera H264 Stream from the specified position.
* @param position: Camera position for the H264 stream output.
* @param source: sub-camera source for the H264 stream output.
*/
T_UAVReturnCode UAV_LiveView_StopH264Stream(int32_t payload_id, E_UAVLiveViewCameraSource source);
3. 保存或处理 H.264 码流
基于 PSDK 开发的应用程序获取 H.264 码流后,开发者即可对所获取的 H.264 码流执行所需的操作。
/**
* @brief Liveview camera h264 stream callback.
*/
typedef void (*UAVLiveView_H264Callback)(int32_t payload_id, const uint8_t *buf, uint32_t len);
static void UAV_LiveView_H264StreamCallback(int32_t payload_id, const uint8_t *buf, uint32_t len)
{
LOG_INFO("camera id: {}, len: {}", payload_id, len);
if(nullptr != s_fp)
fwrite((const void *)buf, 1, len, s_fp);
fsync(fileno(s_fp));
}
说明
- 开发者获取指定相机的 H.264 码流后,使用
ffplay -flags2 showall xxx.h264
命令即可播放所获取的 H.264 文件。- 借助 PSDK 提供的 Sample 获取 H.264 码流数据,并将接收到的 H.264 码流数据以 H.264 文件的形式记录在本地,该文件名为
userData
。- 使用
Sample camera-stream-callback-sample
和camera-stream-poll-sample
可借助 FFMpeg 对 H.264 码流解码。开发者可借助 Sample 实现所需的功能。
常见问题
解码器解码时出现错误
受计算平台算力的制约,基于 PSDK 开发的应用程序在编解码时可能会出现如下问题:
- 解码速度较慢:解码器在解码第一帧时需要一段时间。
- 帧丢失:计算平台算力不足。
- 使用 FFmpeg 解码时出现报错:请在 Ubuntu 16.04 上尝试解码,且确认运行解码器的应用程序正确安装了 RNDIS、USB 及网口驱动,确保应用程序能够正确识别 EVO Max 系列多旋翼无人机。
GDR 编码格式的 H.264 码流有时出现 I 帧
在 Autel Enterprise 中切换镜头画面时,相机的 H.264 码流会插入 I 帧帮助 Autel Enterprise 图传画面进行画面构建,因此在 H.264 码流中会出现 I 帧,不影响 GDR 格式的解码过程。