獲取前端攝像頭的名稱
一、介紹
攝像頭的名稱可能是標註攝像頭位置,因此獲取攝像頭的名稱對於對接前端攝像頭是一個必須的流程。
在此作者通過Onvif協議獲取前端攝像頭OSD的信息獲取到前端攝像頭的名稱,這種辦法可能存在一些問題:比如如果前端攝像頭有設置名稱但是沒有顯示在界面,那通過Onvif協議獲取的攝像頭名稱就會失敗。或許還有其他問題,暫時還沒遇到。如果有其他途徑獲取前端攝像頭名稱,方便的話知會一下,不勝感激。
同樣通過接口獲取前端OSD的信息同樣需要有一個token信息,而這個token信息不同於前面的media的token,而應該是stProfilesResponse.Profiles[i].VideoSourceConfiguration->token,獲取配置信息的token。
二、代碼實現
struct soap *stSoapNew = soap_new();
if (stSoapNew == nullptr)
{
return nullptr;
}
soap_set_namespaces(stSoapNew, namespaces); // 設置soap的namespaces
stSoapNew->recv_timeout = 5; // 設置超時5秒(超過指定時間沒有數據就退出)
stSoapNew->send_timeout = 5;
stSoapNew->connect_timeout = 5;
soap_set_mode(stSoapNew, SOAP_C_UTFSTRING); // 設置爲UTF-8編碼,否則疊加中文OSD會亂碼
if (stSoapNew == nullptr)
{
printf( "Onvif New Soap error!");
return;
}
// 如果服務要求鑑權,則以下接口就需要加上用戶名密碼進行鑑權
soap_wsse_add_UsernameTokenDigest(stSoapNew, NULL, pUserName, pPassWord);//對用戶名密碼進行加密
// 構建請求的結構體
_trt__GetOSDs stGetOsdsReq;
_trt__GetOSDsResponse stGetOsdsRsp;
memset(&m_sChannelName, 0, ONVIFSDK_MAXCHANNELNAME);
memset(&stGetOsdsReq, 0x00, sizeof(stGetOsdsReq));
memset(&stGetOsdsRsp, 0x00, sizeof(stGetOsdsRsp));
stGetOsdsReq.ConfigurationToken = VideoSourceConfigurationToken;
nRet = soap_call___trt__GetOSDs(stSoapInfo, m_pMediaAddr, nullptr, &stGetOsdsReq, &stGetOsdsRsp);
if (nRet != SOAP_OK || stSoapInfo->error != SOAP_OK)
{
printf( "Dev ip is %s,ChannelIndex is %d Gsoap return is %d labbuf is %s", m_pIpInfo, nChannelIndex, nRet, stSoapInfo->labbuf);
return;
}
stGetOsdsRsp.OSDs[j].TextString->PlainText, // 這個就是獲取到的OSD通道名稱,遍歷所有stGetOsdsRsp.OSDs,直到找到非空的參數