设备端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);

results matching ""

    No results matching ""