本發(fā)明涉及一種共享SDI數(shù)據(jù)的方法。
背景技術(shù):
SDI采集卡用于采集視音頻基帶信號(hào)。每塊SDI采集卡可能具有多個(gè)SDI端口,這些端口的訪問往往是通過生產(chǎn)廠家提供的SDK進(jìn)行訪問,并且在訪問過程中是獨(dú)占方式的,即使在同一設(shè)備內(nèi),也沒有辦法使得兩個(gè)進(jìn)程同時(shí)訪問一個(gè)端口。
上面這種情況造成了在SDI信號(hào)處理領(lǐng)域,必須前置硬件SDI分配器,將一路SDI信號(hào)分成多路。此種方式使得整個(gè)系統(tǒng)的建設(shè)成本增加的同時(shí)又多出了故障點(diǎn)。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的在于克服現(xiàn)有技術(shù)中的不足而提供一種共享SDI數(shù)據(jù)的方法。
為實(shí)現(xiàn)上述目的,一方面,本發(fā)明提供的一種共享SDI數(shù)據(jù)的方法,包括如下步驟:
利用SDI采集卡提供的SDK讀取SDI基帶數(shù)據(jù);
初始化一個(gè)TCP Socket作為Server端建立發(fā)布點(diǎn);
通過發(fā)布點(diǎn)管理訂閱者隊(duì)列;
通過遍歷訂閱者隊(duì)列,獲取每個(gè)訂閱者的Socket,并通過Socket將SDI基帶數(shù)據(jù)發(fā)給每個(gè)訂閱者。
優(yōu)選地,SDI基帶數(shù)據(jù)包括圖像數(shù)據(jù)和音頻數(shù)據(jù)。
優(yōu)選地,圖像數(shù)據(jù)包括圖像的寬、高、縱橫比、幀率、時(shí)間戳、時(shí)碼和數(shù)據(jù)大小等內(nèi)容,音頻數(shù)據(jù)包括音頻的編碼格式、時(shí)間戳、時(shí)碼和數(shù)據(jù)大小等內(nèi)容。
優(yōu)選地,建立發(fā)布點(diǎn)的步驟中,當(dāng)建立發(fā)布點(diǎn)后,任何Client通過TCP連接至發(fā)布點(diǎn)的Port時(shí),即視為訂閱請(qǐng)求,將此連接socket加入訂閱者隊(duì)列,在訂閱者隊(duì)列中的訂閱者則會(huì)接收到SDI基帶數(shù)據(jù)。
優(yōu)選地,發(fā)布點(diǎn)管理訂閱者隊(duì)列的步驟如下:
創(chuàng)建套接字A;
將套接字A綁定到一個(gè)本地地址和端口上;
將套接字A設(shè)為監(jiān)聽模式,準(zhǔn)備接收客戶端請(qǐng)求;
當(dāng)請(qǐng)求到來后,接受連接請(qǐng)求,返回一個(gè)新的對(duì)應(yīng)于此次連接的套接字B;
將套接字B追加入訂閱者隊(duì)列的尾部,作為新的訂閱者;
將套接字B與對(duì)應(yīng)的訂閱者的客戶端進(jìn)程進(jìn)行數(shù)據(jù)通信。
根據(jù)本發(fā)明提供的一種共享SDI數(shù)據(jù)的方法,不需要前置硬件SDI分配器,借鑒socket網(wǎng)絡(luò)通訊機(jī)制,提供一種更加低成本、部署和開發(fā)都很簡(jiǎn)單的軟件方法來解除SDI設(shè)備獨(dú)占,并且可以將SDI數(shù)據(jù)在不同的進(jìn)程甚至不同的設(shè)備(進(jìn)程外于不同的設(shè)備上運(yùn)行)之間進(jìn)行共享的目的。
附圖說明
圖1是本發(fā)明一實(shí)施例的一種共享SDI數(shù)據(jù)的方法的流程示意圖。
本發(fā)明目的的實(shí)現(xiàn)、功能特點(diǎn)及優(yōu)點(diǎn)將結(jié)合實(shí)施例,參照附圖做進(jìn)一步說明。
具體實(shí)施方式
下面詳細(xì)描述本發(fā)明的實(shí)施例,所述實(shí)施例的示例在附圖中示出,其中自始至終相同或類似的標(biāo)號(hào)表示相同或類似的元件或具有相同或類似功能的元件。下面通過參考附圖描述的實(shí)施例是示例性的,旨在用于解釋本發(fā)明,而不能理解為對(duì)本發(fā)明的限制。
在本發(fā)明的描述中,需要理解的是,術(shù)語“中心”、“縱向”、“橫向”、“長(zhǎng)度”、“寬度”、“厚度”、“上”、“下”、“前”、“后”、“左”、“右”、“豎直”、“水平”、“頂”、“底”“內(nèi)”、“外”、“順時(shí)針”、“逆時(shí)針”等指示的方位或位置關(guān)系為基于附圖所示的方位或位置關(guān)系,僅是為了便于描述本發(fā)明和簡(jiǎn)化描述,而不是指示或暗示所指的裝置或元件必須具有特定的方位、以特定的方位構(gòu)造和操作,因此不能理解為對(duì)本發(fā)明的限制。
此外,術(shù)語“第一”、“第二”僅用于描述目的,而不能理解為指示或暗示相對(duì)重要性或者隱含指明所指示的技術(shù)特征的數(shù)量。由此,限定有“第一”、“第二”的特征可以明示或者隱含地包括一個(gè)或者更多個(gè)該特征。在本發(fā)明的描述中,“多個(gè)”的含義是兩個(gè)或兩個(gè)以上,除非另有明確具體的限定。
在本發(fā)明中,除非另有明確的規(guī)定和限定,術(shù)語“安裝”、“相連”、“連接”、“固定”等術(shù)語應(yīng)做廣義理解,例如,可以是固定連接,也可以是可拆卸連接,或一體地連接;可以是機(jī)械連接,也可以是電連接;可以是直接相連,也可以通過中間媒介間接相連,可以是兩個(gè)元件內(nèi)部的連通。對(duì)于本領(lǐng)域的普通技術(shù)人員而言,可以根據(jù)具體情況理解上述術(shù)語在本發(fā)明中的具體含義。
本發(fā)明一實(shí)施例提供了一種共享SDI數(shù)據(jù)的方法,包括如下步驟:
利用SDI采集卡提供的SDK讀取SDI基帶數(shù)據(jù);
初始化一個(gè)TCP Socket作為Server端建立發(fā)布點(diǎn);
通過發(fā)布點(diǎn)管理訂閱者隊(duì)列;
通過遍歷訂閱者隊(duì)列,獲取每個(gè)訂閱者的Socket,并通過Socket將SDI基帶數(shù)據(jù)發(fā)給每個(gè)訂閱者。
具體地,如圖1所示,本方法依賴一種系統(tǒng)進(jìn)行SDI數(shù)據(jù)共享,該系統(tǒng)包括三個(gè)模塊:
1、數(shù)據(jù)讀取模塊:
利用SDI采集卡提供的SDK,讀取到圖像數(shù)據(jù)、音頻數(shù)據(jù)及其元數(shù)據(jù),在這里統(tǒng)一稱之為SDI基帶數(shù)據(jù)。
圖像數(shù)據(jù)(含元數(shù)據(jù))包括圖像的寬、高、縱橫比、幀率、時(shí)間戳、時(shí)碼、數(shù)據(jù)大小等數(shù)據(jù)內(nèi)容。
音頻數(shù)據(jù)(含元數(shù)據(jù))包括音頻的編碼格式、時(shí)間戳、時(shí)碼、數(shù)據(jù)大小等數(shù)據(jù)內(nèi)容。
特別說明的是,在本實(shí)施例中中,數(shù)據(jù)讀取模塊只要讀取到數(shù)據(jù)就立即發(fā)送給發(fā)送模塊,本地不做緩存。
2、訂閱者管理模塊:
此模塊是用于管理訂閱者隊(duì)列。首先,初始化一個(gè)TCP Socket作為Server端來偵聽訂閱請(qǐng)求和退出請(qǐng)求,偵聽Port可以配置。下文中將此稱為發(fā)布點(diǎn)。
只要任何Client通過TCP連接至此發(fā)布點(diǎn)的Port,即視為訂閱請(qǐng)求,訂閱者管理模塊會(huì)將此連接socket加入訂閱者隊(duì)列,那么此Client即可接收到SDI基帶數(shù)據(jù)。
當(dāng)此Client要求退出時(shí),可發(fā)送退出命令給Server端,本實(shí)施例中使用的退出命令是“bye”三字節(jié)組,一旦Server端收到此命令,訂閱者管理模塊就會(huì)把訂閱者的連接socket關(guān)閉并剔除出訂閱者隊(duì)列,同時(shí)訂閱者管理模塊也不會(huì)再發(fā)送SDI基帶數(shù)據(jù)給該Client。
訂閱者管理模塊的發(fā)布點(diǎn)(Server端)工作流程如下:
(1)創(chuàng)建套接字(使用系統(tǒng)socket函數(shù)),本實(shí)施例中套接字為socket A;
(2)將套接字socket A綁定到一個(gè)本地地址和端口上(使用系統(tǒng)bind函數(shù));
(3)將套接字socket A設(shè)為監(jiān)聽模式,準(zhǔn)備接收客戶端請(qǐng)求(使用系統(tǒng)listen函數(shù));
(4)等待客戶請(qǐng)求到來,當(dāng)請(qǐng)求到來后,接受連接請(qǐng)求,返回一個(gè)新的對(duì)應(yīng)于此次連接的套接字(使用系統(tǒng)accept函數(shù)),本實(shí)施例中此套接字為socketB;
(5)將此套接字socket B追加入訂閱者隊(duì)列尾部,作為新的訂閱者。數(shù)據(jù)發(fā)送模塊使用此訂閱者套接字socket B與訂閱者的客戶端Client進(jìn)程進(jìn)行數(shù)據(jù)通信,當(dāng)從套接字socket B上接收到“bye”后將此socket B從訂閱者隊(duì)列中移除,視為訂閱者注銷。
客戶端的訂閱注冊(cè)流程如下:
(1)創(chuàng)建套接字(使用系統(tǒng)socket函數(shù)),本實(shí)施例中套接字為socket C;
(2)向訂閱者管理模塊的服務(wù)器發(fā)出連接請(qǐng)求(connect,服務(wù)器的IP地址和端口使用其他方式獲取),連接成功即完成訂閱;
(3)和服務(wù)器端進(jìn)行通信(使用系統(tǒng)recv函數(shù)),此時(shí)將收到的就是SDI基帶數(shù)據(jù)。
客戶端的訂閱注銷流程如下:
(1)通過套接字socket C發(fā)送“bye”三字節(jié)(使用系統(tǒng)send函數(shù))。
3、數(shù)據(jù)發(fā)送模塊:
數(shù)據(jù)發(fā)送模塊用于將數(shù)據(jù)讀取模塊讀取到的SDI基帶數(shù)據(jù),通過遍歷訂閱者隊(duì)列,獲取每個(gè)訂閱者的Socket,并通過此Socket將SDI基帶數(shù)據(jù)發(fā)給每個(gè)訂閱者。
根據(jù)本發(fā)明提供的一種共享SDI數(shù)據(jù)的方法,不需要前置硬件SDI分配器,借鑒socket網(wǎng)絡(luò)通訊機(jī)制,提供一種更加低成本、部署和開發(fā)都很簡(jiǎn)單的軟件方法來解除SDI設(shè)備獨(dú)占,并且可以將SDI數(shù)據(jù)在不同的進(jìn)程甚至不同的設(shè)備(進(jìn)程外于不同的設(shè)備上運(yùn)行)之間進(jìn)行共享的目的。
在本說明書的描述中,參考術(shù)語“一個(gè)實(shí)施例”、“一些實(shí)施例”、“示例”、“具體示例”、或“一些示例”等的描述意指結(jié)合該實(shí)施例或示例描述的具體特征、結(jié)構(gòu)、材料或者特點(diǎn)包含于本發(fā)明的至少一個(gè)實(shí)施例或示例中。在本說明書中,對(duì)上述術(shù)語的示意性表述不一定指的是相同的實(shí)施例或示例。而且,描述的具體特征、結(jié)構(gòu)、材料或者特點(diǎn)可以在任何的一個(gè)或多個(gè)實(shí)施例或示例中以合適的方式結(jié)合。盡管上面已經(jīng)示出和描述了本發(fā)明的實(shí)施例,可以理解的是,上述實(shí)施例是示例性的,不能理解為對(duì)本發(fā)明的限制,本領(lǐng)域的普通技術(shù)人員在不脫離本發(fā)明的原理和宗旨的情況下在本發(fā)明的范圍內(nèi)可以對(duì)上述實(shí)施例進(jìn)行變化、修改、替換和變型。