Skip to main content

相机码流

概述

为帮助开发者更灵活进行无人机的飞行控制,开发者通过使用 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 码流的流程如下所示:

  1. 使用获取相机 H.264 码流的功能前,请开发者根据实际的使用需要先实现 UAVLiveView_H264Callback 函数,用于获取并处理相机 H.264 码流。
  2. 调用 UAV_LiveView_StartH264Stream() 接口,指定所需获取码流的相机、接收相机 H.264 码流的回调函数和用户信息。
  3. 开启无人机和用户负载设备,运行使用基于 PSDK 开发的应用程序,此时无人机将会向用户负载设备推送 H.264 码流。
  4. 用户的负载设备接收到 H.264 码流的数据后,将触发(作为入参传入开发者设置的回调函数中)基于 PSDK 开发的应用程序。
  5. 开发者根据实际需求设计的函数 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-samplecamera-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 格式的解码过程。