设备端SDK(Linux)文档
更新时间:2019-06-11 18:07:07
功能描述
摄像头直播: 支持RTMP推流,当前视频支持H264,音频支持G711a以及AAC_LC格式.
存储卡录像查看: 将存储在SD卡等外存中的录像文件推到服务端,支持seek到指定位置操作.
语音对讲: 与App端建立双向语音通道,设备端采集录音并实时发送至App端,同时接收到App端发送的语音进行播放.
拍照: 抓拍当前摄像头画面并上传至云端.
上报事件:上报带图片的事件给云端。
使用说明
设备端资源要求
- 内存占用
直播 (1Mbps码流) |
点播 (1Mbps码流) |
信令通道(MQTT) | 图片上传 | 其他 |
---|---|---|---|---|
360KB (如果是同时启动两路码流需360KB*2) |
360KB (如果是同时启动两路码流需360KB*2) |
50KB | 50KB + 图片大小 | 150KB |
- ROM占用
Link Kit SDK | LinkVisual SDK |
---|---|
650KB | 2000KB |
软件版本要求
LinkVisual SDK使用C++,要求系统支持C++11特性。
快速体验
提供了Ubuntu16.04 x86_64环境下编译的虚拟设备端Demo程序,点击下载LinkVisual SDK Demo:link_visual_ipc_v1.0.0
安装Ubuntu16.04。快速体验的编译环境是64位主机上的Ubuntu16.04, 在其它Linux版本上尚未验证过, 推荐安装与阿里一致的发行版以避免碰到兼容性方面的问题。
解压文件,在文件夹目录下创建build目录,最终目录结构如下。
. ├── build ├── CMakeLists.txt ├── compile.md ├── samples └── sdk
参考
compile.md
指引编译Demo,编译后在build目录下生成名为link_visual_demo
的可执行程序。执行如下命令运行Demo,其中三元组需替换为自己创建的产品的设备三元组。
$ ./link_visual_demo -p test_product_key -n test_device_name -s test_device_secret
API列表
- SDK生命周期及版本号接口
SDK初始化 | lv_init |
---|---|
SDK停止 | lv_destroy |
SDK版本信息打印 | lv_get_version |
- Link Kit物模型消息注入接口
物模型的服务类消息注入 | linkkit_adapter_tsl_service |
---|---|
Link Kit SDK对接完成后,将Link Kit的物模型服务类消息调用该接口传递给LinkVisual SDK。请参考LinkVisual SDK Demo中的linkkit_adapter.cpp
示例。
- 直播及点播服务接口
直播 | 设备存储录像点播 | |
---|---|---|
通知服务已开启 | lv_start_push_streaming_cb | lv_start_push_streaming_cb |
通知服务已结束 | lv_stop_push_streaming_cb | lv_stop_push_streaming_cb |
推送视音频配置参数 | lv_stream_send_config | lv_stream_send_config |
推送视频数据 | lv_stream_send_video | lv_stream_send_video |
推送音频数据 | lv_stream_send_audio | lv_stream_send_audio |
推流过程中命令控制(暂停等) | lv_on_push_streaming_cmd_cb | lv_on_push_streaming_cmd_cb |
查询 | 无 | lv_query_storage_record_cb |
- 图片服务接口
图片上传 | lv_post_alarm_image |
---|---|
通知上传图片 | lv_trigger_pic_capture_cb |
- 语音对讲服务接口
通知开启服务 | lv_start_voice_intercom_cb |
---|---|
通知结束服务 | lv_stop_voice_intercom_cb |
开启服务 | lv_voice_intercom_start_service |
停止服务 | lv_voice_intercom_stop_service |
发送音频 | lv_voice_intercom_send_audio |
接收音频 | lv_voice_intercom_receive_data_cb |
接收音频参数配置 | lv_voice_intercom_receive_metadata_cb |
附录:API详情
- SDK初始化
/**
@brief SDK初始化
@param [IN] config: SDK配置参数集合
@return lv_error_e
*/
int lv_init(const lv_config_s *config);
其中, 结构体lv_config_s用于定义包括三元组等基础信息
/* 配置参数结构体 */
typedef struct lv_config_s {
/* 三元组信息 */
char product_key[PRODUCT_KEY_LEN + 1];
char device_name[DEVICE_NAME_LEN + 1];
char device_secret[DEVICE_SECRET_LEN + 1];
/* SDK的日志配置 */
lv_log_level_e log_level;
lv_log_destination log_dest;
char log_dest_file[LOG_DEST_FILE_LEN + 1];
/* 音视频推流服务 */
lv_start_push_streaming_cb start_push_streaming_cb;
lv_stop_push_streaming_cb stop_push_streaming_cb;
lv_on_push_streaming_cmd_cb on_push_streaming_cmd_cb;
/* 语音对讲服务 */
lv_start_voice_intercom_cb start_voice_intercom_cb;
lv_stop_voice_intercom_cb stop_voice_intercom_cb;
lv_voice_intercom_receive_metadata_cb voice_intercom_receive_metadata_cb;
lv_voice_intercom_receive_data_cb voice_intercom_receive_data_cb;
/* 存储录像查询命令 */
lv_query_storage_record_cb query_storage_record_cb;
/* 触发设备抓图 */
lv_trigger_pic_capture_cb trigger_pic_capture_cb;
/* 触发设备录像 */
lv_trigger_record_cb trigger_record_cb;
} lv_config_s;
- SDK销毁
/**
* @brief SDK销毁
*
* @param [IN] void
*
* @return lv_error_e
*/
int lv_destroy(void);
- SDK版本信息打印
/**
* @brief 获取SDK版本信息
*
*/
void lv_get_version(void);
- Link Kit物模型服务类消息注入
/**
* @brief linkkit适配器,将物模型中的服务类消息注入该函数中,由LinkVisual代为处理
*
* @param [IN] lv_linkkit_adapter_tsl_service_s: 服务类消息结构体入参
*
* @return lv_error_e
*/
int linkkit_adapter_tsl_service(const lv_linkkit_adapter_tsl_service_s *in);
- 通知服务开启
/**
* @brief 通知设备开始推流
*
* @param [IN] service_id: 推流服务ID
* @param [IN] type: 推流服务的类型
* @param [IN] param: 可变参数,根据type会有不同
* type == LV_STREAM_CMD_LIVE,param->pre_time为预录时间,单位:s
* type == LV_STREAM_CMD_STORAGE_RECORD_BY_FILE,param->file_name为请求播放的录像文件名
*
* @retval < 0 : Fail.LV_STREAM_CMD_STORAGE_RECORD_BY_FILE
* @retval 0 : Success.
*
* @notice: type == LV_STREAM_CMD_LIVE时,需要调用lv_stream_start_service()来开启服务,
* 并调用lv_stream_send_video()/lv_stream_send_audio()直接开始推流;
* type == LV_STREAM_CMD_STOARGE_RECORD_BY_FILE或type == LV_STREAM_CMD_STORAGE_RECORD_BY_TIME时,
* 需要调用lv_stream_start_service()来开启服务,
* 并等待lv_on_push_streaming_cmd_cb()中的消息通知,当lv_on_push_streaming_cmd_cb()中通知LV_STORAGE_RECORD_START时,
* 调用lv_stream_send_video()/lv_stream_send_audio()开始推流
* @see lv_stream_start_service() lv_on_push_streaming_cmd_cb()
*/
typedef int (*lv_start_push_streaming_cb)(int service_id, lv_stream_type_e type, const lv_stream_param_s *param);
- 通知服务停止
/**
* @brief 通知设备停止推流
*
* @param [IN] service_id: 推流服务ID
*
* @retval < 0 : Fail.
* @retval 0 : Success.
*/
typedef int (*lv_stop_push_streaming_cb)(int service_id);
- 推流过程中控制命令
/**
* @brief 推送直播/存储录像流的过程中,需要支持的命令
*
* @param [IN] service_id: 推流服务ID
* @param [IN] cmd: 命令类型
* @param [IN] timestamp: 时间戳参数,单位为秒
* cmd == LV_STORAGE_RECORD_SEEK时可用,其他命令无意义
*
* @retval < 0 : Fail.
* @retval 0 : Success.
*/
typedef int (*lv_on_push_streaming_cmd_cb)(int service_id, lv_on_push_streaming_cmd_type_e cmd, double timestamp);
- 推送音视频参数配置
/**
* @brief 在发送实际音视频数据前发送音视频相关配置,用于直播推流和存储录像播放
*
* @param [IN] service_id: 服务ID,来自回调 lv_start_push_streaming_cb
* @param [IN] bitrate_kbps: 目标码率,单位为kbps,0~8000
* @param [IN] duration: 回放的文件长度,直播置为0
* @param [IN] video_param: 视频的相关参数配置
* @param [IN] audio_param: 音频的相关参数配置
*
* @return lv_error_e
* @see lv_start_push_streaming_cb()
*/
int lv_stream_send_config(int service_id,
unsigned int bitrate_kbps,
double duration,
const lv_video_param_s *video_param,
const lv_audio_param_s *audio_param);
- 推送视频数据
/**
* @brief 发送视频数据
*
* @param [IN] service_id: 服务ID
* @param [IN] buffer: 视频数据指针
* @param [IN] buffer_len: 视频数据长度
* @param [IN] key_frame: 视频帧是否为关键帧
* @param [IN] timestamp_ms: 视频帧时间戳,单位:ms
*
* @return lv_error_e
*/
int lv_stream_send_video(int service_id,
unsigned char* buffer,
unsigned int buffer_len,
bool key_frame,
unsigned int timestamp_ms);
- 推送音频数据
/**
* @brief 发送音频数据
*
* @param [IN] service_id: 服务ID
* @param [IN] buffer: 音频数据指针
* @param [IN] buffer_len: 音频数据长度
* @param [IN] timestamp_ms: 音频帧时间戳,单位:ms
*
* @return lv_error_e
*/
int lv_stream_send_audio(int service_id,
unsigned char* buffer,
unsigned int buffer_len,
unsigned int timestamp_ms);
- 录像列表查询
/**
* @brief 查询存储录像列表
*
* @param [IN] start_time : 查询的开始时间,UTC时间,秒数
* @param [IN] stop_time : 查询的结束时间,UTC时间,秒数
* @param [IN] num : 录像查询的数量
* @param [IN] id : 该次查询的会话标识符,需要回传到on_complete
* @param [IN] on_complete : 返回录像列表的函数,目前仅支持同步调用,否则会超时;
* num返回实际所查询到的数量,id回传,lv_query_storage_record_response_s里放置录像列表信息。
*
* @return void
*/
typedef void (*lv_query_storage_record_cb)(unsigned int start_time,
unsigned int stop_time,
int num,
const char *id,
int (*on_complete)(int num, const char *id,
const lv_query_storage_record_response_s *response));
- 上传图片
/**
* @brief 报警事件图片上传
*
* @param [IN] buffer: 事件图片数据指针
* @param [IN] buffer_len: 事件图片数据长度
* @param [IN] type: 事件类型,lv_event_type_e
* @param [IN] id: 当type=LV_TRIGGER_PIC时,需要回传lv_trigger_pic_capture_cb中的id,其他为空
*
* @return lv_error_e
* @see lv_trigger_pic_capture_cb()
*/
int lv_post_alarm_image(const char* buffer,
int buffer_len,
lv_event_type_e type,
const char *id);
- 通知上传图片
/**
* @brief 触发设备抓图
*
* @param [IN] id: 触发ID,需回传
*
* @retval < 0 : Fail.
* @retval 0 : Success.
* @see lv_post_alarm_image()
*/
typedef int (*lv_trigger_pic_capture_cb)(const char *id);
- 通知开启语音对讲服务
/**
* @brief 通知设备开始语音对讲服务
*
* @param [IN] service_id: 语音对讲服务ID
* @param [IN] audio_param: 设备接收到的音频数据的参数
*
* @retval < 0 : Fail.
* @retval 0 : Success.
*/
typedef int (*lv_start_voice_intercom_cb)(int service_id, const lv_audio_param_s *audio_param);
- 通知停止语音对讲服务
/**
* @brief 通知设备停止语音对讲服务
*
* @param [IN] service_id: 语音对讲服务ID
*
* @retval < 0 : Fail.
* @retval 0 : Success.
*/
typedef int (*lv_stop_voice_intercom_cb)(int service_id);
- 开启语音对讲服务
/**
* @brief 开始语音对讲服务
*
* @param [IN] service_id: 服务ID
* @param [IN] audio_param: 对讲音频的相关参数配置
*
* @return lv_error_e
* @see lv_start_voice_intercom_cb()
*/
int lv_voice_intercom_start_service(int service_id, const lv_audio_param_s *audio_param);
- 停止语音对讲服务
/**
* @brief 停止语音对讲服务
*
* @param [IN] service_id: 服务ID
*
* @return lv_error_e
* @see lv_stop_voice_intercom_cb()
*/
int lv_voice_intercom_stop_service(int service_id);
- 推送语音对讲的音频数据
/**
* @brief 发送语音对讲的音频数据
*
* @param [IN] service_id: 服务ID
* @param [IN] buffer: 音频数据指针
* @param [IN] buffer_len: 音频数据长度
*
* @return lv_error_e
*/
int lv_voice_intercom_send_audio(int service_id, const char* buffer, int buffer_len);
- 接收语音对讲的音频参数配置
/**
* @brief 语音对讲服务,设备端接收的语音数据的格式
*
* @param [IN] service_id: 语音对讲服务ID
* @param [IN] audio_param: 设备接收的语音数据的格式
*
* @retval < 0 : Fail.
* @retval 0 : Success.
*/
typedef int (*lv_voice_intercom_receive_metadata_cb)(int service_id, const lv_audio_param_s *audio_param);
- 接收语音对讲音频数据
/**
* @brief 接收到语音数据
*
* @param [IN] buffer: 语音数据指针
* @param [IN] buffer_len: 语音数据大小
*
* @return void
*/
typedef void (*lv_voice_intercom_receive_data_cb)(const char *buffer, unsigned int buffer_len);