日日摸夜夜添夜夜爽出水_dvd碟片色爱_麻豆wwwcom内射软件_国产欧美色一区二区三区_中字幕视频在线永久在线观看免费_99久久在线视频精品店_国产精品1区2区3区在线观看 _两性午夜色视频免费网站_国产精品女同久久久久电影院_国产一区二区不卡亚洲涩情

簡體中文

通過AVAPIs的方式實作云存推流

云存儲(VSaaS)設備端開發(fā)指南 | TUTK AV SDK 開發(fā)手冊

一、概述

云存儲采用「服務器主動取流」模式(類似實時觀看):設備端觸發(fā)存儲需求時,調用接口通知云服務器從設備端取流,底層基于 TUTK AVAPIs 協(xié)議
設備端僅需對接 TUTK 公版實時音視頻協(xié)議,無需額外開發(fā)復雜存儲邏輯。
(一)編碼格式要求
圖像:H264 / H265
音頻:PCM、AAC、G711 等

二、云存儲模塊初始化

初始化時讀取本地云存儲配置文件(含 URL、Token),無配置則通過回調從 APP 端獲取并持久化。
初始化實現(xiàn)代碼
// 讀取云存儲配置文件(gVsaasInfoFilePath:本地配置文件路徑) char *vsaas_info = NULL; FILE *vsaas_info_file_ptr = fopen(gVsaasInfoFilePath, "r"); int ret = 0; if (vsaas_info_file_ptr == NULL) {    // 未配置:從APP端獲?。ㄍㄟ^VsaasConfigChangedHandle回調保存)    printf("Enable VSaaS without preload data!\n");    ret = avEnableVSaaS(uid, NULL, VsaasConfigChangedHandle, VSaaSUpdateContractInfoHandle); } else {    // 已配置:讀取本地文件初始化    long file_size = 0;    fseek(vsaas_info_file_ptr, 0, SEEK_END);    file_size = ftell(vsaas_info_file_ptr);    rewind(vsaas_info_file_ptr);    vsaas_info = (char*)malloc(sizeof(char)*file_size);    if (vsaas_info == NULL) {        printf("memory alloc fail!\n");        fclose(vsaas_info_file_ptr);        return -1;    }        fread(vsaas_info, 1, file_size, vsaas_info_file_ptr);    ret = avEnableVSaaS(uid, vsaas_info, VsaasConfigChangedHandle, VSaaSUpdateContractInfoHandle);        fclose(vsaas_info_file_ptr);    free(vsaas_info);    gVsaasConfigExist = true; } if (ret != AV_ER_NoERROR) {    printf("avEnableVSaaS error [%d]\n", ret);    return -1; }

三、通知云服務器取流

支持「實時流(Live)」和「回放流(Playback)」兩種模式,按參數(shù)要求構造 JSON 后調用接口。
1. 參數(shù)說明
參數(shù)名類型必選說明
starttimeString實時流填"live",回放流填時間戳(秒)
event_idInt默認為 VSAAS_EVENT_GENERAL,APP將拿到這個event_id,轉為文字顯示
event_fileString回放流必選指定本地錄像文件路徑
media_typeInt0=H264,1=H265,2=JPEG
channelInt回放流必選傳入回放專用IOTC通道ID(避免avServStartEx超時)
通知取流實現(xiàn)代碼
/* 參數(shù)說明: * starttime:實時流填"live",回放流填時間戳(秒) * event_id:默認為 VSAAS_EVENT_GENERAL,也可以自定義  * event_file:回放流必填,指定本地錄像文件路徑 * media_type:0=H264,1=H265,2=JPEG * channel:回放流必填,傳入回放專用IOTC通道ID(避免avServStartEx超時) */ char att_json_str[256] = {0}; bool isLiveView = true;  // true=實時流,false=回放流 bool h264 = true;        // true=H264,false=H265 unsigned long current_time_sec = 1699999999;  // 回放起始時間戳 char *gRecordFile = "/mnt/record/20231114_100000.h264";  // 本地錄像文件 int iotc_channel_id_for_playback = 1;  // 回放IOTC通道ID if (isLiveView) {    // 實時流模式    sprintf(att_json_str,        "{\"starttime\":\"live\",\"protocol\":\"tutk\",\"event_id\":\"%d\",\"media_type\":\"%d\"}",        VSAAS_EVENT_GENERAL,        h264 ? 0 : 1    ); } else {    // 回放流模式    sprintf(att_json_str,        "{\"starttime\":\"%lu\",\"protocol\":\"tutk\",\"event_id\":\"%d\",\"event_file\":\"%s\",\"media_type\":\"%d\",\"channel\":\"%d\"}",        current_time_sec,        VSAAS_EVENT_GENERAL,        gRecordFile,        h264 ? 0 : 1,        iotc_channel_id_for_playback    ); } // 通知云服務器取流(超時3000ms) Nebula_Json_Obj attr_obj = NULL; Nebula_Json_Obj_Create_From_String(att_json_str, &attr_obj); ret = avServNotifyCloudRecordStream(attr_obj, 3000, NULL); printf("avServNotifyCloudRecordStream ret[%d]\n", ret); if (ret != AV_ER_NoERROR) {    // 錯誤處理(例:-20043=用戶未購買云存儲方案)    printf("通知取流失敗,錯誤碼:%d\n", ret); }
通知成功后,云服務器會發(fā)起 IOTC 連線,通過 P2P 協(xié)議取流(設備端將收到 0x1ff、0x351 拉流指令)。

四、關鍵回調函數(shù)實現(xiàn)

(一)配置變更回調(保存APP端下發(fā)的URL和Token)
APP 端將云存儲配置(URL、Token)以 JSON 格式下發(fā)(具體請參考:APP給設備端配置云存信息),設備端需保存到本地文件,供下次初始化使用。
配置變更回調實現(xiàn)代碼
static void VsaasConfigChangedHandle(const char *vsaas_config) {    printf("Enter %s\n", __func__);    printf("收到云存儲配置:\n%s\n", vsaas_config);    // 保存配置到本地文件    FILE *vsaas_info_file_ptr = fopen(gVsaasInfoFilePath, "w+");    if (vsaas_info_file_ptr == NULL) {        printf("%s:打開配置文件失敗!路徑:%s\n", __func__, gVsaasInfoFilePath);        return;    }    fwrite(vsaas_config, 1, strlen(vsaas_config), vsaas_info_file_ptr);    fclose(vsaas_info_file_ptr);    gVsaasConfigExist = true;  // 標記已配置 }
(二)合約信息更新回調(適配云存儲方案限制)
云存儲合約變更時觸發(fā)(如分辨率、碼率、幀率限制),設備端需按合約調整錄像參數(shù)。
合約信息更新回調實現(xiàn)代碼
// 全局變量:存儲云存儲合約信息 VSaaSContractInfo gVsaasContractInfo = {0}; static void VSaaSUpdateContractInfoHandle(const VSaaSContractInfo *contract_info) {    printf("Enter %s\n", __func__);    // 打印合約信息    printf("合約類型:%u\n", contract_info->contract_type);    printf("最大錄制時長:%d秒\n", contract_info->event_recording_max_sec);    printf("最大幀率:%d fps\n", contract_info->video_max_fps);    printf("最大碼率:%d kbps\n", contract_info->recording_max_kbps);    printf("最大分辨率:%dx%d\n", contract_info->video_max_width, contract_info->video_max_high);    // 保存合約信息(設備端需按此調整錄像參數(shù))    memcpy(&gVsaasContractInfo, contract_info, sizeof(VSaaSContractInfo)); }

五、注意事項

公版 Kalay APP 適配

需修改密碼驗證回調,增加對賬號 "vsaas" 的支持(云服務器取流時使用該賬號認證)。

密碼驗證回調修改代碼
int ExPasswordAuthCallBackFn(const char *account, char *pwd, unsigned int pwd_buf_size) {    // 允許設備默認賬號和 "vsaas" 賬號認證    if (strcmp(account, gAvAccount) != 0 && strcmp(account, "vsaas") != 0) {        return -1;  // 賬號不匹配    }    // 密碼緩沖區(qū)長度校驗    if (pwd_buf_size <= strlen(gAvPassword)) {        return -1;  // 緩沖區(qū)不足    }    // 填充密碼    strcpy(pwd, gAvPassword);    return 0;  // 認證成功 }
說明:gAvAccount、gAvPassword 為設備端默認音視頻認證賬號密碼

六、優(yōu)化策略(實時流模式)

實時流默認云端拉取 30s 流,設備端可通過智能算法(如人形識別、寵物識別)動態(tài)調整存儲時長,節(jié)省云存儲空間。
示例場景:10:00:00 偵測到人形→通知云端取流;10:00:10 人形消失→停止送流→關閉連接(最終存儲10s)。
設備端操作步驟
1. 識別連接來源:判斷 IOTC 連線是否為云服務器發(fā)起(通過賬號 "vsaas" 區(qū)分); 2. 標記 avIndex:記錄該連接對應的音視頻流索引(avIndex); 3. 動態(tài)停止存儲:檢測到無需繼續(xù)存儲時,停止向該 avIndex 推送音視頻數(shù)據(jù); 4. 安全關閉連接:等待 avIndex 中緩存的流全部發(fā)送完成后,關閉連接。

即刻開啟您的物聯(lián)網之旅

聯(lián)系解決方案專家
Kalay App
資訊安全白皮書
全球專利布局
解決方案
新聞動態(tài)
公司動態(tài)
行業(yè)資訊
媒體報道
永續(xù)發(fā)展
經營者的話
社會參與
環(huán)境永續(xù)
公司治理

+86 755 27702549

7×24小時服務熱線

法律聲明 隱私權條款

關注“TUTK”

TUTK服務盡在掌握

? 2022 物聯(lián)智慧科技(深圳)有限公司版權所有粵ICP備14023641號
在線咨詢
掃一掃

TUTK服務盡在掌握

全國免費服務熱線
+86 755 27702549

返回頂部