音视频能力

更新时间:2024-08-06 03:30:56下载pdf

本文主要介绍激光扫地机设备,视频实时预览及音频对讲等功能接入流程。

功能接入流程

激光扫地机的音视频业务,基本都涉及到网络、时间等基础业务。因此,正常的音视频业务需要等待 MQTT 上线并且同步到时间后,才启动音视频流服务。

采用激光扫地机 Demo 中的示例流程,顺序启动即可。参考下图:

初始化 SDKty_iot_sdk_init初始化媒体抽象层tuya_sdk_media_adapter_init初始化环形缓冲区tuya_media_ring_buffer_init注册音视频 P2P 事件回调tuya_media_av_event_init等待 MQTT 上线获取到云端时间初始化媒体流服务tuya_media_server_customize_init开始获取音视频流数据tuya_av_start

API

初始化媒体抽象层

/**
 * @brief Initialize Tuya SDK for media adapter
 * 
 * @param[in] p_media_adatper_info: TUYA_ROBOT_SDK_MEDIA_ADAPTER_S 
 * @param[in] p_media_infos: DEVICE_ROBOT_MEDIA_INFO_T 
 * @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h 
 */
OPERATE_RET tuya_sdk_media_adapter_init(TUYA_ROBOT_SDK_MEDIA_ADAPTER_S *p_media_adatper_info, DEVICE_ROBOT_MEDIA_INFO_T *p_media_infos);

以上接口是 App 传到设备端的音视频数据回调和设备获取快照数据传回 App 的回调注册,音视频编解码配置参数的输入。

初始化环形缓冲区

/**
 * @brief  Initialize media ring buffer
 * @param  [DEVICE_ROBOT_MEDIA_INFO_T] pMediaInfo 
 * @param  [INT_T] max_buffer_seconds: buffer timer 6~10S
 * @param  [INT_T] channel: media channel
 * @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h
 */
OPERATE_RET tuya_media_ring_buffer_init(CONST DEVICE_ROBOT_MEDIA_INFO_T *pMediaInfo, INT_T max_buffer_seconds, INT_T channel);

以上接口是针对特定视频通道的特定码流,执行初始化。该操作会执行缓存空间的创建与节点的初始化。关于环形缓存区其它接口的使用,参考 音视频环形缓存

注册音视频 P2P 事件回调

/**
 * @brief  Register audio and video P2P event callback
 * @param  [in] event_cb
 * @return [*]OPRT_OK on success. Others on error, please refer to tuya_error_code.h
 */
OPERATE_RET tuya_media_av_event_init(SWEEPER_AV_STREAM_EVENT_CB event_cb);

以上接口是音视频 P2P 事件注册回调,是将视频实时预览和音频对讲等事件传到设备端,让用户做出相应的业务处理。具体的事件,参考激光扫地机 Demo 中的 tuya_sweeper_av_event_cb 函数实现。

下面对部分事件做流程解释:

涂鸦 AppTuyaOS SDK业务开始(结束)播放视频/音频传递视频/音频事件提醒业务该事件已经执-开始(结束)语音对讲请求传递语音对讲事件提醒业务音频硬件做好-准备按日期查询本地视频信息请求传递查询日期事件查询到的对应信息发送数据开始(结束)回放音视频请求传递回放事件本地获取数据并解码发送数据涂鸦 AppTuyaOS SDK业务

初始化媒体流服务

/**
 * @brief  Initialize media streaming service
 * @param  [in] max_client_num   range: 0 to 5
 * @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h 
 */
OPERATE_RET tuya_media_server_customize_init(int max_client_num);

以上接口是初始化媒体流服务,目前支持的最大客户端数量为 5 路。

在音视频业务初始化时,您可以根据自己的硬件规格,来设定同时支持的连接路数(一般建议 3~5 路为宜)和可供音视频业务消耗的内存大小,二者是对应关系。若超过以上限制,新建连接会被强制关闭。

  • 最大连接路数设置方式:tuya_media_server_customize_init 时,设置参数 max_client_num
  • 最大内存资源设置方式:tuya_sdk_media_adapter_init 时,设置参数 TUYA_SDK_MEDIA_ADAPTER_S:max_stream_client

使用示例

/**
 * @brief  创建音视频推流任务
 * @param  
 * @return [*]
 */
void tuya_av_start(void)
{
    PR_DEBUG("create av task!!!\n");
    int ret = 0;
    ret = tal_vi_init(NULL, TY_DSP_MEDIA_VI_MAX);     //底层 TKL 硬件视频采集初始化接口
    if (0 != ret) {
        PR_ERR("tal_vi_init failed,%d\n", ret);
        return ;
    }
    ret = tal_venc_init(0, NULL, TY_DSP_MEDIA_VENC_MAX);   //底层 TKL 视频编码初始化接口
    if (0 != ret) {
        PR_ERR("tal_venc_init failed,%d\n", ret);
        return ;
    }
    ret = tal_ai_init(-1, TY_DSP_MEDIA_AUDIO_MAX);     //底层 TKL 硬件音频采集初始化接口
    if (0 != ret) {
        PR_ERR("tal_ai_init failed,%d\n", ret);
        return ;
    }
    /*创建线程*/
    pthread_t main_pid = -1;
    pthread_t sub_pid = -1;
    pthread_t audio_pid = -1;
    pthread_create(&main_pid, NULL, __video_main,NULL);
    pthread_create(&sub_pid, NULL, __video_sub,NULL);
    pthread_create(&audio_pid, NULL, __audio_main,NULL);

    return ;
}

以上示例来源于激光扫地机 Demo,该示例是基于 x86 平台实现简单的音视频推流功能。用户开发音视频功能时,需要根据自身硬件平台来配置参数。更多信息,参考 视频采集音频采集与播放

Demo 中如要开启音视频功能,需将 TY_ROBOT_MEDIA_ENABLE 宏置 1 ,默认是关闭状态。

了解更多