Onvif OSD相关操作
Onvif OSD相關(guān)配置
jluyeyu | 發(fā)布于 2018-07-16 16:55:56 | 閱讀量 1952 | onvif
與OSD有關(guān)的命令有:CreateOSD、DeleteOSD、GetOSDs、GetOSD、SetOSD、GetOSDOptions。下面逐一介紹。
GetOSDOptions:獲取當(dāng)前相機(jī)具備的OSD選項(xiàng)。如字體大小范圍、OSD總數(shù)、日期時(shí)間格式,等等。
輸入:ConfigurationToken [ReferenceToken]
輸出:
MaximumNumberOfOSDs 最大OSD數(shù)目
Total 總共幾個(gè) PlainText [int] Text類(lèi)型數(shù)目 Image [int] 圖像類(lèi)型數(shù)目 DateAndTime [int] 時(shí)間日期類(lèi)型數(shù)目Type 支持的類(lèi)型
‘文字' '圖片' '擴(kuò)展PositionOption 位置
UpperLeft 左上 UpperRight 右上 LowerLeft 左下 LowerRight 右下 Custom 自定義FontSizeRange 字體大小值的范圍。
DateFormat 支持的日期格式列表。
TimeFormat 支持的時(shí)間格式列表
FontColor 支持的字體顏色列表。
等
獲取ConfigurationToken
/** * @explan: 獲取VideoSourceToken * @param: const char * mediaAddr media地址 * @param: std::string & videoSourceToken 用于存放VideoSourceToken的字符串 * @return: int * success return 0 */ int COvifClient::GetVideoSourceToken(const char* mediaAddr, std::string& videoSourceToken) {MediaBindingProxy* pMedia = new MediaBindingProxy();int result = soap_wsse_add_UsernameTokenDigest(pMedia->soap, NULL, USERNAME, PASSWORD); ///< 啟動(dòng)鑒權(quán)if (SOAP_OK != result){printf_s("soap_wsse_add_UsernameTokenDigest. User:[%s] PASSWORD:[%s]\n", USERNAME, PASSWORD);return -1;}_trt__GetProfiles Profiles_req;_trt__GetProfilesResponse Profiles_rep;result = pMedia->GetProfiles(mediaAddr, NULL, &Profiles_req, Profiles_rep);if (SOAP_OK != result){printf_s("GetProfiles error.\n");return -1;}///< 可能會(huì)有好幾路流,相應(yīng)的也會(huì)有好幾個(gè)profile,這里只取第一路碼流videoSourceToken = Profiles_rep.Profiles[0]->VideoSourceConfiguration->token;return SOAP_OK; } /** * @explan: 顯示OSD設(shè)置項(xiàng) * @param: const char * deviceAddr 設(shè)備地址 * @return: int * success return 0 */ int COvifClient::ShowOSDOpinion(const char* deviceAddr) {if (deviceAddr == nullptr){printf_s("deviceAddr == nullptr\n");return -1;}///< 獲得Media模塊服務(wù)地址std::string mediaAddr;int result = this->GetMediaAddr(deviceAddr, mediaAddr);if (SOAP_OK != result){printf_s("GetMediaAddr error.\n");return -1;}MediaBindingProxy* pMedia = new MediaBindingProxy();result = soap_wsse_add_UsernameTokenDigest(pMedia->soap, NULL, USERNAME, PASSWORD); ///< 啟動(dòng)鑒權(quán)if (SOAP_OK != result){printf_s("soap_wsse_add_UsernameTokenDigest. User:[%s] PASSWORD:[%s]\n", USERNAME, PASSWORD);return -1;}std::string profileToken;result = GetProfilesToken(mediaAddr.c_str(), profileToken);if (result != SOAP_OK){cout << "Get profileToken 失敗";return -1;}std::string videoSourceToken;GetVideoSourceToken(mediaAddr.c_str(), videoSourceToken);_trt__GetOSDOptions getOptions_req;_trt__GetOSDOptionsResponse getOptions_rep;getOptions_req.ConfigurationToken = videoSourceToken;result=pMedia->GetOSDOptions(mediaAddr.c_str(), NULL, &getOptions_req, getOptions_rep);if (result != SOAP_OK){cout << "獲取OSD OPinion 失敗"<<endl;showErrorReason(pMedia->soap);return -1;}cout <<"支持Text數(shù)目:"<< *getOptions_rep.OSDOptions->MaximumNumberOfOSDs->PlainText<<endl;cout <<"支持日期時(shí)間數(shù)目:" << *getOptions_rep.OSDOptions->MaximumNumberOfOSDs->DateAndTime << endl;return 0; }Total 總共幾個(gè)
Total 總共幾個(gè)
GetOSDs:
獲取當(dāng)前相機(jī)所有OSD項(xiàng)目。包括OSDtoken、疊加類(lèi)型、字體大小、字體顏色、字體空間、背景顏色,等。
注意,使用這個(gè)接口時(shí),必須傳入視頻源配置token(VideoSourceConfigurationToken)。每個(gè)視頻源配置都有對(duì)應(yīng)的OSD。比如相機(jī)有3路視頻輸出,則每路都可以疊加獨(dú)立的字符,不互相干擾。返回值是一個(gè)vector,每個(gè)元素都是一個(gè)疊加的字符及其屬性。
輸入:token(VideoSourceConfigurationToken)
輸出
OSDs 包含的OSD列表
OSDtoken 可以根據(jù)這個(gè),修改/刪除OSD
OSD字體大小、字體顏色、字體空間、背景顏色等
/** * @explan: 根據(jù)Media地址,獲取OSD Token list * @param: const char * mediaAddr * @param: std::string OSDList[] OSD Token list * @return: int * success return 0 */ int COvifClient::GetOSDs(const char* mediaAddr, std::string OSDList[]) {MediaBindingProxy* pMedia = new MediaBindingProxy();int result = soap_wsse_add_UsernameTokenDigest(pMedia->soap, NULL, USERNAME, PASSWORD); ///< 啟動(dòng)鑒權(quán)if (SOAP_OK != result){printf_s("soap_wsse_add_UsernameTokenDigest. User:[%s] PASSWORD:[%s]\n", USERNAME, PASSWORD);return -1;}std::string profileToken;result = GetProfilesToken(mediaAddr, profileToken);if (result != SOAP_OK){cout << "Get profileToken 失敗";return -1;}std::string videoSourceToken;GetVideoSourceToken(mediaAddr, videoSourceToken);_trt__GetOSDs OSD_req;_trt__GetOSDsResponse OSD_rep;OSD_req.ConfigurationToken = &videoSourceToken;result=pMedia->GetOSDs(mediaAddr, NULL, &OSD_req, OSD_rep);if (result != SOAP_OK){cout << "獲取OSD失敗 ";showErrorReason(pMedia->soap);}int temp = 0;for (auto x : OSD_rep.OSDs){OSDList[temp++] = x->token;cout << "第" << temp << "個(gè)OSD Token 是" << x->token << endl;if (x->TextString->PlainText != NULL){std::string text = *x->TextString->PlainText;cout << text << endl;}}return 0; }GetOSD:
基本同getOSDs。但傳入?yún)?shù)是OSDtoken,而不是視頻源配置token。
CreateOSD:
創(chuàng)建OSD,成功后會(huì)返回設(shè)備上標(biāo)識(shí)的OSD token。創(chuàng)建的OSD屬性參考上面所述,一般設(shè)備會(huì)有自己OSD的管理機(jī)制,比如固定的token:osd_0、osd_1、osd_2,等等,如果已經(jīng)存在osd_0、osd_2時(shí),則該命令創(chuàng)建時(shí),會(huì)返回osd_1。
/** * @explan: 創(chuàng)建OSD * @param: const char * mediaAddr Media地址 * @param: std::string & OSDToken 返回一個(gè)OSD token * @return: int * success return 0 */ int COvifClient::CreateOSD(const char* mediaAddr, std::string& OSDToken) {MediaBindingProxy* pMedia = new MediaBindingProxy();int result = soap_wsse_add_UsernameTokenDigest(pMedia->soap, NULL, USERNAME, PASSWORD); ///< 啟動(dòng)鑒權(quán)if (SOAP_OK != result){printf_s("soap_wsse_add_UsernameTokenDigest. User:[%s] PASSWORD:[%s]\n", USERNAME, PASSWORD);return -1;}std::string profileToken;result=GetProfilesToken(mediaAddr, profileToken);if (result != SOAP_OK){cout << "Get profileToken 失敗"<<endl;return -1;}std::string videoSourceToken;GetVideoSourceToken(mediaAddr, videoSourceToken); _trt__GetVideoSourceConfiguration VideoConf_req;_trt__GetVideoSourceConfigurationResponse VideoConf_rep;VideoConf_req.ConfigurationToken = videoSourceToken;result = pMedia->GetVideoSourceConfiguration(mediaAddr,NULL,&VideoConf_req, VideoConf_rep);if (result != SOAP_OK){cout << "Get VideoSourceConfiguration 失敗"<<endl;return -1;}result = soap_wsse_add_UsernameTokenDigest(pMedia->soap, NULL, USERNAME, PASSWORD); ///< 啟動(dòng)鑒權(quán)if (SOAP_OK != result){printf_s("soap_wsse_add_UsernameTokenDigest. User:[%s] PASSWORD:[%s]\n", USERNAME, PASSWORD);return -1;}_trt__CreateOSD creOSD_req;_trt__CreateOSDResponse creOSD_rep;tt__OSDConfiguration OSD;OSD.token = profileToken;tt__OSDPosConfiguration Position;std::string Postype = "Custom";OSD.Type = tt__OSDType__Text;//自定義,需要自己設(shè)置Position.Type = Postype;OSD.Position = &Position;tt__OSDReference VideoSourceConfigurationToken;VideoSourceConfigurationToken.__item = VideoConf_rep.Configuration->token;OSD.VideoSourceConfigurationToken = &VideoSourceConfigurationToken;creOSD_req.OSD = &OSD;result = pMedia->CreateOSD(mediaAddr, NULL, &creOSD_req, creOSD_rep);if (result != SOAP_OK){cout << "Greate OSD 失敗"<<endl;showErrorReason(pMedia->soap);return -1;}cout <<"OSDToken為:"<< creOSD_rep.OSDToken << endl;OSDToken = creOSD_rep.OSDToken;return 0; }SetOSD:
設(shè)置OSD。與CreateOSD基本一樣,但該命令使用的是相機(jī)已經(jīng)存在的OSDtoken。因?yàn)檫@個(gè)命令描述為“修改OSD”更妥當(dāng)一些。
/** * @explan: 根據(jù)OSDtoken 設(shè)置OSD * @param: const char * mediaAddr * @param: const char * OSDToken * @return: int * success return 0 */ int COvifClient::SetOSD(const char* mediaAddr,const char* OSDToken) {MediaBindingProxy* pMedia = new MediaBindingProxy();int result = soap_wsse_add_UsernameTokenDigest(pMedia->soap, NULL, USERNAME, PASSWORD); ///< 啟動(dòng)鑒權(quán)if (SOAP_OK != result){printf_s("soap_wsse_add_UsernameTokenDigest. User:[%s] PASSWORD:[%s]\n", USERNAME, PASSWORD);return -1;}std::string profileToken;result = GetProfilesToken(mediaAddr, profileToken);if (result != SOAP_OK){return -1;}std::string videoSourceToken;GetVideoSourceToken(mediaAddr, videoSourceToken);_trt__SetOSD setOSD_req;_trt__SetOSDResponse setOSD_rep;tt__OSDConfiguration OSD;//設(shè)置TokenOSD.token = OSDToken;//設(shè)置OSD的類(lèi)型OSD.Type = tt__OSDType__Text; //Text/image/exten//設(shè)置OSD位置(自定義)tt__OSDPosConfiguration Position;std::string Postype = "Custom";Position.Type = Postype;tt__OSDTextConfiguration TextConf;std::string Text = "test";TextConf.PlainText = &Text;int fontSize = 25;TextConf.FontSize =&fontSize ;tt__Vector pos;//float x = 0;//float y = 0;//pos.x = &x;//pos.y = &y;//Position.Pos = &pos;OSD.TextString = &TextConf;//設(shè)置Position與OSD關(guān)聯(lián)OSD.Position = &Position;//設(shè)置VideoTokentt__OSDReference VideoSourceConfigurationToken;VideoSourceConfigurationToken.__item = videoSourceToken;OSD.VideoSourceConfigurationToken = &VideoSourceConfigurationToken;setOSD_req.OSD = &OSD;result=pMedia->SetOSD(mediaAddr, NULL, &setOSD_req, setOSD_rep);if (result != SOAP_OK){cout << "設(shè)置OSD Opinion 失敗" << endl;showErrorReason(pMedia->soap);return -1;} }DeleteOSD:
刪除OSD,傳入的OSDToken是相機(jī)已經(jīng)存在的。
/** * @explan: 根據(jù)OSD token刪除一個(gè)OSD * @param: const char * mediaAddr media地址 * @param: std::string OSDToken OSD token * @return: int * success return 0 */ int COvifClient::DelectOSD(const char* mediaAddr, std::string OSDToken) {MediaBindingProxy* pMedia = new MediaBindingProxy();int result = soap_wsse_add_UsernameTokenDigest(pMedia->soap, NULL, USERNAME, PASSWORD); ///< 啟動(dòng)鑒權(quán)if (SOAP_OK != result){printf_s("soap_wsse_add_UsernameTokenDigest. User:[%s] PASSWORD:[%s]\n", USERNAME, PASSWORD);return -1;}_trt__DeleteOSD DeleteOSD_req;_trt__DeleteOSDResponse DeleteOSD_rep;DeleteOSD_req.OSDToken = OSDToken;result = pMedia->DeleteOSD(mediaAddr, NULL, &DeleteOSD_req, DeleteOSD_rep);if (result != SOAP_OK){cout << "刪除OSD失敗"<<endl;showErrorReason(pMedia->soap);return -1;}return 0; }總結(jié)
以上是生活随笔為你收集整理的Onvif OSD相关操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 计算机控制面板的字体在哪里,电脑的字体怎
- 下一篇: 安卓开发者的 17 年总结