码流订阅
概述
码流订阅功能支持订阅飞行器主摄和 FPV 相机 H.264 码流,支持指定订阅 540P、720P、720P High、1080P 和 1080P High 清晰度码流,通过实时获取的图传视频画面,能够进行实时 AI 处理。

使用码流订阅功能
码流订阅功能提供码流服务状态,和码流初始化、码流传输开始、码流传输停止、和相机源切换接口。
订阅码流服务状态
在云端进行直播配置,传输通道均衡,飞行器未连接,图传无信号等可导致码流状态变更,通过码流服务状态可以订阅到实时码流的可用状态
// filename: include/liveview.h
// 码流状态
using LiveviewStatus = uint32_t;
// 码流状态回调处理函数
using LiveviewStatusCallback =
std::function<void(const LiveviewStatus& status)>;
// 订阅码流状态接口
virtual ErrorCode SubscribeLiveviewStatus(const LiveviewStatusCallback& callback) = 0;
值 | LiveviewStatus.bit0 | LiveviewStatus.bit1 | LiveviewStatus.bit2 | LiveviewStatus.bit3 | LiveviewStatus.bit4 | LiveviewStatus.bit5 |
---|---|---|---|---|---|---|
0 | 码流清晰度自适应不可用 | 540P 码流清晰度不可用 | 720P 码流清晰度不可用 | 720P High 码流清晰度不可用 | 1080P 码流清晰度不可用 | 1080P High 码流清晰度不可用 |
1 | 码流清晰度自适应可用 | 540P 码流清晰度可用 | 720P 码流清晰度可用 | 720P High 码流清晰度可用 | 1080P 码流清晰度可用 | 1080P High 码流清晰度可用 |
初始化、开始、和结束订阅码流
// 码流订阅初始化
// 1. 实现回调处理函数
ErrorCode H264StreamHandleCallback(const uint8_t* buf, uint32_t len) {
// TODO: 实现收到的码流进行数据处理,buf 和 len 参数代表码流数据和长度。
return kOk;
}
// 2. 选项初始化: 订阅主摄, 码流质量 720p,码流回调处理函数 H264StreamHandleCallback
auto liveview = CreateLiveview();
Liveview::Option option = { Liveview::kCameraTypePayload, Liveview::kStreamQuality720p, H264StreamHandleCallback };
liveview->Init(option);
// 3. 开始码流传输
liveview->StartH264Stream();
// 可以通过以下接口切换码流相机镜头
liveview->SetCameraSource(CameraSource::kCameraSourceIR);
// 4. 结束码流订阅
liveview->StopH264Stream();
订阅码流初始化
码流订阅功能初始化后,确定订阅码流相机,码流质量和接收码流回调处理函数,边缘计算初始化和机场建立码流传输通道环境,调用该接口之后不应该重复调用进行初始化。接收码流回调函数:设置接收码流回调接口,在开始码流传输时,用于接收码流处理函数。返回 kOk 即为成功。返回其他值:
- kErrorInvalidArgument:参数无效,检查参数是否为合理的枚举值。
- kErrorParamGetFailure:无法获取相机配置参数,检查 CameraType 是否正确。
- kErrorSystemError:初始化连接失败,检查网卡是否可用,可从日志获取更多信息,联系技术支持。
接口函数说明:
参数 | 说明 |
相机类型 | 提供最多两路码流的订阅,分别为负载相机和 FPV。 |
码流质量 | 可订阅码流状态中显示可用的码流质量,最多五档可选择:540P,720P,720PHigh,1080P,1080PHigh。 |
注意:码流质量受其它因素影响比如直播配置均衡,图传信号等,虽然指定的码流质量,但并不总是可用订阅到指定的码流质量,开始码流传输优先使用指定的质量,如果当前码流质量不可用,会选择相邻档位的码流传输,应用层设计可考虑兼容码流质量进行业务处理。
/**
* @brief 初始化直播码流参数
*/
/**
* @brief 码流相机的类型
*/
enum CameraType {
/*! FPV 相机 */
kCameraTypeFpv = 0,
/*! 负载相机 */
kCameraTypePayload = 1,
};
struct Options {
/*! 订阅码流的相机类型 */
CameraType camera;
/*!
* 订阅码流的质量 , 注意:实际订阅到的码流质量并不一定相符,机场会根据当前实际情况返回最接近码流的码流质量
*/
StreamQuality quality;
/*! 接收码流的处理函数 */
H264StreamCallback callback;
};
* @brief 码流的质量
*/
enum StreamQuality {
/*! 码流质量 540p: 30fps, 960*540, bps 512*1024 */
kStreamQuality540p = 1,
/*! 码流质量 720p: 30fps, 1280*720, bps 1024*1024 */
kStreamQuality720p = 2,
/*! 码流质量 720pHigh: 30fps, 1280*720, bps 1024*1024 + 512*1024 */
kStreamQuality720pHigh = 3,
/*! 码流质量 1080p: 30fps, 1920*1080, bps 3*1024*1024 */
kStreamQuality1080p = 4,
/*! 码流质量 1080p: 30fps, 1920*1080, bps 8*1024*1024 */
kStreamQuality1080pHigh = 5,
};
/**
* @brief liveview camera H.264 stream callback
* @param buf: 接收的 H.264 码流数据
* @param len: 接收的 H.264 码流数据长度
*/
using H264StreamCallback =
std::function<ErrorCode(const uint8_t* buf, uint32_t len)>;
* @brief 初始化直播码流订阅 , 注意:对于某个相机,只能初始化一次
* @param option: 初始化码流配置
* @return Execution result
*/
virtual ErrorCode Init(const Options& option) = 0;
开始码流传输
在初始化成功后,调用该接口开始码流传输,开始成功后,通过初始化接口设置的回调处理函数可以收到码流传输的数据。返回 kOk 即为成功。返回其他值:
- kErrorInvalidArgument:参数内部校验不通过,从日志获取更多信息,联系技术支持。
- kErrorSystemError: 检查飞行器是否连接正常,网络连接是否正常。
- kErrorRemoteFailure:远端机场错误,检查机场是否有故障,从日志获取更多信息,联系技术支持。
- kErrorRequestTimeout:请求超时,检查网络连接是否正常。
注意:当码流状态中无可订阅码流时(比如飞行器没有上电、未正确对频),调用该接口将会阻塞等待可用,超时(5~10S)返回失败。码流传输开始后,SDK 不确保覆盖所有情况的码流传输中断的恢复,使用端可以结合码流回调是否接收到数据、订阅的码流状态,在码流中断后,再次调用该接口尝试恢复码流传输。
/**
* @brief 开始直播码流
* @return Execution result
*/
virtual ErrorCode StartH264Stream() = 0;
停止码流传输
在初始化成功后,调用该接口将停止远端码流传输。返回 kOk 即为成功。返回其他值:
kErrorRemoteFailure:远端机场错误,检查机场是否有故障,从日志获取更多信息,联系技术支持。
kErrorRequestTimeout:请求超时,检查网络连接是否正常。
/**
- @brief 停止直播码流
- @return Execution result */ virtual ErrorCode StopH264Stream() = 0;
设置负载相机码流源
通过该接口,码流订阅初始化 FPV、或负载相机 Liveview,都可以设置相机码流源。返回 kOk 即为指令发布成功,极少数情况下,并不能代表相机码流源切换成功,只能通过画面来检验结果是否生效。
/*
* @brief 负载相机的码流源
*/
enum CameraSource {
/*! 广角镜头 */
kCameraSourceWide = 1,
/*! 变焦镜头 */
kCameraSourceZoom = 2,
/*! 红外镜头 */
kCameraSourceIR = 3,
};
/**
* @brief 设置相机码流源
* @return Execution result
*/
virtual ErrorCode SetCameraSource(CameraSource source) = 0;