非 SDK 存储开发指导

更新时间:2025-09-18 08:02:15下载pdf

获取音视频数据

  1. 创建读取 ringbuf 对象。

    视频和音频需要分开创建。

    RING_BUFFER_USER_HANDLE_T tuya_ipc_ring_buffer_open(INT_T device, INT_T channel, IPC_STREAM_E stream, RBUF_OPEN_TYPE_E open_type);
    
  2. 定位要读取的 I 帧位置。如需要预录功能,建议在创建读取对象后,调用此接口,锁定预录帧的起始位置。

    OPERATE_RET tuya_ipc_ring_buffer_anchor_user(RING_BUFFER_USER_HANDLE_T handle, UINT_T frame_num, BOOL_T check_overlap);
    

    如返回失败,则表示找不到入参条件下的帧,可继续等待至找到为止。

  3. 在定位到视频关键帧的位置后,需要同步音频帧位置。

    OPERATE_RET tuya_ipc_ring_buffer_sync_stream(RING_BUFFER_USER_HANDLE_T handle_video, RING_BUFFER_USER_HANDLE_T handle_audio);
    
  4. 取帧。通过创建的音视频 ringbuf 对象,依次取帧。

    RING_BUFFER_NODE_T* tuya_ipc_ring_buffer_get_av_frame(RING_BUFFER_USER_HANDLE_T v_handle, RING_BUFFER_USER_HANDLE_T a_handle, BOOL_T is_retry);
    

    retry 表示是否重复取帧,异常情况下可使用此参数。

数据加密与解密

如果您需要开发视频文件加密功能,请参考本章节的介绍,如不需要可忽略。

加密方法有多种,您可自行了解相关细节并设计实现。

密钥获取

云端获取接口

加密密钥可以自行生成管理,也可以从云端获取。

建议尽量减少调用此接口的频次,否则会加重网络 I/O 负载。

OPERATE_RET httpc_iot_cloud_storage_encrypt_key_get(OUT ty_cJSON **result);

加密

加密向量可自行生成、管理。可使用以下接口进行数据加密。

OPERATE_RET openssl_aes_cbc128_encrypt(IN CONST BYTE_T *pdata_in, IN CONST UINT_T data_len,
                                      OUT BYTE_T *pdata_out, OUT UINT_T *pdata_out_len,
                                      IN CONST BYTE_T *pkey, IN BYTE_T *piv);

设计加密方案时,应进行充分的考虑,必须确保所有数据在回放环节能够被正确解密。

解密

对于加密的帧,使用以下接口解密数据:

OPERATE_RET openssl_aes_cbc128_decrypt(IN CONST BYTE_T *pdata_in, IN CONST UINT_T data_len,
                                      OUT BYTE_T *pdata_out, OUT UINT_T *pdata_out_len,
                                      IN CONST BYTE_T *pkey, IN BYTE_T *piv);
  • pkey 密钥需要和加密时的密钥相同。
  • pdata_inpdata_out 可以共用同一块内存。

上述接口仅作为参考,您可以自行实现解密逻辑的代码,也可以使用其他开源工具。

数据存储

获取帧数据以后,需要自行设计数据存储路径等细节,以便在回放时快速检索读取数据。

回放

请参考以下内容实现非 SDK 存储方案下的回放功能: