音视频能力

Last Updated on : 2025-01-20 03:12:55download

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

功能接入流程

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

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

初始化 SDKty_iot_sdk_init初始化媒体抽象层ty_rvc_media_adapter_init初始化环形缓冲区ty_rvc_media_ring_buffer_init注册音视频 P2P 事件回调ty_rvc_media_av_event_init设备媒体服务初始化ty_rvc_server_init等待 MQTT 上线获取到云端时间开始获取音视频流数据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 的回调注册,音视频编解码配置参数的输入。

初始化环形缓冲区

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

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

注册音视频 P2P 事件回调

***********************************************************
 *@function: ty_rvc_media_av_event_init
 *@brief:  sdk audio and video registration callback int
 *@param  [in] event_cb: audio and video stream treans cb
 *@return [*]OPRT_OK on success. Others on error, please refer to tuya_error_code.h
 ***********************************************************/
OPERATE_RET ty_rvc_media_av_event_init(RVC_AV_STREAM_EVENT_CB event_cb);

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

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

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

设备媒体服务初始化

/**
 * @brief real time map and path treans cb
 */
typedef INT_T (*RVC_TRANS_EVENT_CB)(IN CONST int onoff);

/***********************************************************
 *@Function: ty_rvc_server_init
 *@brief  initialize media server init
 *@param[in] handler The status callback for real-time data transmission, 
             with statuses including: start and end.
 *@return OPRT_OK on success. Others on error, please refer to tuya_error_code.h
 ***********************************************************/

OPERATE_RET ty_rvc_server_init(RVC_TRANS_EVENT_CB handler);

以上接口是初始化媒体服务,只有启动该接口,才能正常的音视频拉流。

使用示例

/**
 * @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 ,默认是关闭状态。

了解更多