本發(fā)明涉及云存儲技術(shù)領(lǐng)域,尤其涉及一種支持云平臺采用雙緩沖的實時視頻流存儲方法。
背景技術(shù):
隨著整個安防行業(yè)技術(shù)水平的不斷成熟以及社會治安事件復(fù)雜度的不斷提高,原有的以硬盤存儲視頻的方式已經(jīng)達(dá)不到破案的要求,視頻在存儲周期、訪問效率以及安全性方面也有了更高的要求。
在這個大的應(yīng)用背景下,基于云存儲的實現(xiàn)架構(gòu)應(yīng)運而生,如阿里云、百度云、華為云等。一般云存儲分為:文件存儲、塊存儲和對象存儲,文件存儲和塊存儲是傳統(tǒng)的存儲數(shù)據(jù)方式;對象存儲服務(wù)是面向企業(yè)和個人開發(fā)者提供的高可用,高穩(wěn)定,強安全的云端存儲服務(wù),對象存儲是目前最常用的云存儲方案,克服了塊存儲和文件存儲的缺點。同原有的存儲架構(gòu)相比,使用云存儲在可靠性、安全、成本以及數(shù)據(jù)處理能力方面都具有明顯的優(yōu)勢。就可靠性而言,對象存儲服務(wù)的可運行性不低于99.9%,規(guī)模自動擴展,不影響對外服務(wù),同時采用了多重冗余備份機制來增強其安全性,而采用自建服務(wù)器存儲,其可靠性受限于存儲服務(wù)的硬件環(huán)境,相比于對象存儲,易出現(xiàn)不可逆轉(zhuǎn)的數(shù)據(jù)丟失問題;就安全性而言,對象存儲提供企業(yè)級多層次安全防護(hù),而用戶自建存儲需要單獨實現(xiàn);就成本而言,對象存儲根據(jù)存儲大小按需收費,成本低,而用戶自建存儲則是一次性投入、資源的利用率很低,存儲受硬盤容量限制;就處理能力而言,采用對象存儲架構(gòu),提供內(nèi)容加速分發(fā)功能,其存儲效率遠(yuǎn)高于用戶自建存儲服務(wù)模式。
技術(shù)實現(xiàn)要素:
有鑒于現(xiàn)有技術(shù)的上述缺陷,本發(fā)明提供一種支持云平臺采用雙緩沖的實時視頻流存儲方法,由云存儲服務(wù)自動向下級平臺或前端設(shè)備進(jìn)行點播請求,獲取到視頻流,采用自定義的存儲模式進(jìn)行視頻流存儲,能夠在一定程度上提高了視頻存儲的效率,減少不可逆轉(zhuǎn)的視頻丟失問題,同時也可以在一定程度上提高視頻存儲的安全性。
本發(fā)明所采用的技術(shù)方案是:一種支持云平臺采用雙緩沖的實時視頻流存儲方法,包括如下步驟:
步驟1、獲取云存儲配置文件信息,所述信息包括服務(wù)部署ID、云平臺配置信息、數(shù)據(jù)庫配置信息;
步驟2、初始化數(shù)據(jù)庫連接,連接所述數(shù)據(jù)庫,獲取所述部署ID對應(yīng)的存儲相機列表信息;
步驟3、獲取調(diào)度服務(wù)器信息,同時啟動存儲管理主線程,為每個相機分配對應(yīng)的雙緩沖區(qū),建立相機與雙緩沖區(qū)之間的映射關(guān)系,進(jìn)行內(nèi)存的一次性申請;
步驟4、遍歷相機列表信息,創(chuàng)建視頻流存儲線程和視頻流接收線程,每路視頻對應(yīng)一個存儲線程和一個視頻流接收線程,同時建立相機與存儲線程、視頻流接收線程之間的映射關(guān)系,并向調(diào)度服務(wù)發(fā)起實時視頻播放請求;
步驟5、所述調(diào)度服務(wù)向下級平臺或設(shè)備發(fā)起視頻點播請求,為每路視頻開啟一個存儲線程和一個視頻流接收線程;
步驟6、所述視頻流接收線程在接收到視頻流后,將視頻數(shù)據(jù)保存到對應(yīng)的緩沖區(qū)中,所述存儲線程根據(jù)緩沖區(qū)存滿標(biāo)志將所述視頻數(shù)據(jù)存儲到所述云平臺上,并將時間節(jié)點信息保存至數(shù)據(jù)庫中;
步驟7、在存儲完成后,重置所述相機的緩沖區(qū),同時將視頻流存儲信息保存到所述數(shù)據(jù)庫中;重復(fù)步驟3-7,直到接收到退出指令。
在本發(fā)明較佳實施方式中,所述相機雙緩沖區(qū)為主緩沖區(qū)和備用緩沖區(qū),所述主緩沖區(qū)和所述備用緩沖區(qū)交替使用。
在本發(fā)明另一較佳實施方式中,所述每個緩沖區(qū)的結(jié)構(gòu)為{相機編號、存儲狀態(tài)、當(dāng)前已經(jīng)存儲的數(shù)據(jù)大小、I幀列表信息(I幀偏移量、時間戳)}。
在本發(fā)明較佳實施方式中,所述步驟6中所述存儲接口根據(jù)所述云平臺配置信息中的參數(shù)調(diào)用云平臺接口進(jìn)行初始化,所述存儲線程通過所述云平臺的存儲接口將所述視頻流保存到所述云平臺上。
在本發(fā)明另一較佳實施方式中,所述步驟6中所述視頻流接收線程接收視頻流的具體方式為:
判斷所述視頻流的長度是否大于RTP包頭長度,如果小于則直接丟棄;
否則獲取到視頻流數(shù)據(jù),獲取視頻幀類型;
如果是I幀,判斷臨時接收緩沖區(qū)中是否有數(shù)據(jù),如果沒有,則直接將數(shù)據(jù)保存至所述臨時緩沖區(qū);如果有數(shù)據(jù),則將所述臨時緩沖區(qū)中的數(shù)據(jù)保存至所述緩沖區(qū)中,將接收到的I幀保存至所述臨時緩沖區(qū);
如果是P幀,判斷是否找到了I幀,如果沒有找到,則丟棄掉,如果已經(jīng)找到,則將視頻流保存至臨時緩沖區(qū)中;
每次在處理完成后更新接收序號和接收時間戳信息。
在本發(fā)明較佳實施方式中,所述I幀序列數(shù)據(jù)入雙緩沖區(qū)實現(xiàn)步驟如下:
步驟11、獲取所述I幀序列數(shù)據(jù)、數(shù)據(jù)長度、I幀絕對時間信息;
步驟12、獲取所述主緩沖區(qū)的狀態(tài),判斷所述備用緩沖區(qū)中是否有數(shù)據(jù),如果有數(shù)據(jù),則執(zhí)行步驟13;否則執(zhí)行步驟14;
步驟13、獲取所述備用緩沖區(qū)的剩余空間,判斷所述備用緩沖區(qū)的剩余空間是否存夠存儲,如果是,則將數(shù)據(jù)拷貝至所述備用緩沖區(qū),執(zhí)行步驟15;否則將所述備用緩沖區(qū)的狀態(tài)設(shè)置成已滿,將剩下的空間進(jìn)行占位填充,同時將數(shù)據(jù)拷貝至所述主緩沖區(qū),執(zhí)行步驟15;
步驟14、判斷所述主緩沖區(qū)的剩余空間是否足夠存儲,如果足夠存儲,則將數(shù)據(jù)拷貝至所述主緩沖區(qū),執(zhí)行步驟15;否則將所述主緩沖區(qū)的狀態(tài)設(shè)置為已滿,將剩下的空間進(jìn)行占位填充,并將數(shù)據(jù)拷貝至所述備用緩沖區(qū),執(zhí)行步驟15;
步驟15、處理完畢。
在本發(fā)明另一較佳實施方式中,所述視頻流存儲線程實現(xiàn)步驟如下:
步驟21、根據(jù)所述配置文件中的云平臺配置信息初始化云平臺接口、相機編號以及雙緩沖區(qū)信息;
步驟22、啟動所述視頻流存儲線程;
步驟23、判斷是否接收到服務(wù)的退出命令,如果接收到退出命令,則退出循環(huán),等待程序退出,否則執(zhí)行步驟24;
步驟24、判斷所述主緩沖區(qū)是否已滿,如果已滿,則調(diào)用所述云平臺存儲接口將數(shù)據(jù)保存至云平臺,如果存儲成功,則將視頻片段信息保存至數(shù)據(jù)庫,重置緩沖區(qū),執(zhí)行步驟25;
步驟25、判斷所述備用緩沖區(qū)是否已經(jīng)寫滿,如果所述備用緩沖區(qū)已經(jīng)寫滿,則調(diào)用云平臺存儲接口將數(shù)據(jù)保存至云平臺,如果存儲成功,則將視頻片段信息保存至數(shù)據(jù)庫,重置緩沖區(qū),執(zhí)行步驟26;
步驟26、進(jìn)行下一輪的判斷,執(zhí)行步驟23。
在本發(fā)明較佳實施方式中,所述視頻流接收線程實現(xiàn)步驟如下:
步驟31、初始化所述視頻流接收線程,包括所述相機編號、雙緩沖區(qū);
步驟32、生成視頻流接收端口,并設(shè)置臨時接收緩沖區(qū);
步驟33、啟動所述視頻流接收線程;
步驟34、在所述視頻流接收線程中判斷是否接收到退出命令,如果接收到,則執(zhí)行步驟35,否則執(zhí)行步驟36;
步驟35、停止接收視頻流,并判斷雙緩沖區(qū)中是否有需要存儲的視頻數(shù)據(jù),如果有,將緩沖區(qū)的存滿標(biāo)志置成已滿,并進(jìn)行數(shù)據(jù)占位填充(保證整個緩沖區(qū)都是填滿的),如果沒有,則退出循環(huán),等待線程退出;
步驟36、準(zhǔn)備接收視頻流,判斷是否接收到所述視頻流接收線程的退出信號,如果接收到,則執(zhí)行步驟35;否則執(zhí)行步驟37;
步驟37、獲取視頻數(shù)據(jù)、幀類型,如果是I幀,判斷基準(zhǔn)時間是否存在,如果不存在,則將基準(zhǔn)時間設(shè)置為當(dāng)前時間,根據(jù)RTP數(shù)據(jù)的時間戳信息以及基準(zhǔn)時間更新I幀絕對時間,執(zhí)行步驟38;如果不是I幀,則執(zhí)行步驟39;
步驟38、將之前保存的整個I幀序列保存至雙緩沖區(qū),將新接收到I幀保存至臨時接收緩沖區(qū),并更新序號、時間戳信息,執(zhí)行步驟36;
步驟39、判斷是否已經(jīng)接收到I幀,如果已經(jīng)收到了I幀,則將接收到的視頻數(shù)據(jù)保存至臨時接收緩沖區(qū),并更新序號、時間戳信息,執(zhí)行步驟36;否則數(shù)據(jù)丟棄,更新序號、時間戳信息,執(zhí)行步驟36
本發(fā)明能充分的提高視頻的存儲和訪問效率,視頻存儲時每個片段里面都包含有一個或多個I幀序列信息,在下載后通過解析后直接進(jìn)行播放,不存在找不到I幀而無法播放的問題;同時,當(dāng)緩沖區(qū)的大小不足以存儲一個I幀序列時,將緩沖區(qū)的存滿標(biāo)志設(shè)置為已滿,將數(shù)據(jù)區(qū)剩余空間進(jìn)行占位填充,這樣在存儲時可以減少存儲碎片的產(chǎn)生,提高訪問效率。
從安全性角度而言,由于本發(fā)明視頻存儲時是按照指定的格式進(jìn)行存儲和數(shù)據(jù)填充,在一定程度上可以提高視頻存儲的安全性,沒有視頻存儲的結(jié)構(gòu)信息則無法快速的對視頻進(jìn)行解析,從而提高了視頻存儲和訪問的安全性。。
附圖說明
圖1是本發(fā)明一較佳實施例中的實時視頻流存儲方法方法流程示意圖;
圖2是本發(fā)明另一較佳實施例中的云平臺配置信息結(jié)構(gòu)示意圖;
圖3是本發(fā)明一較佳實施例中的雙緩沖區(qū)存儲結(jié)構(gòu)示意圖;
圖4是本發(fā)明另一較佳實施例中的I幀序列數(shù)據(jù)入雙緩沖區(qū)模塊實現(xiàn)流程示意圖;
圖5是本發(fā)明一較佳實施例中的視頻流存儲線程實現(xiàn)流程示意圖;
圖6是本發(fā)明另一較佳實施例中的視頻流接收線程實現(xiàn)流程示意圖。
具體實施方式
下面對本發(fā)明的較佳實施例進(jìn)行詳細(xì)闡述,以使本發(fā)明的優(yōu)點和特征能更易于被本領(lǐng)域技術(shù)人員理解,從而對本發(fā)明的保護(hù)范圍做出更為清楚明確的界定。
本實施例公開一種支持云平臺采用雙緩沖的實時視頻流存儲方法,具體流程如圖1所示,包括如下步驟:
步驟1、獲取云存儲配置文件信息,配置文件信息包括服務(wù)部署ID、云平臺配置信息、數(shù)據(jù)庫配置信息。
其中,云平臺配置信息結(jié)構(gòu)如圖2所示,包括實例編號、云平臺登錄信息、訪問權(quán)限和分區(qū)配置信息。
步驟2、初始化數(shù)據(jù)庫連接,連接數(shù)據(jù)庫,獲取部署ID對應(yīng)的存儲相機列表信息。
實時視頻流存儲支持分布式部署。
步驟3、獲取調(diào)度服務(wù)器信息,同時啟動存儲管理主線程,為每個相機分配對應(yīng)的雙緩沖區(qū),建立相機與雙緩沖區(qū)之間的映射關(guān)系,進(jìn)行內(nèi)存的一次性申請。
其中,視頻流的獲取由調(diào)度服務(wù)向下級平臺/設(shè)備發(fā)起請求,由下級平臺/設(shè)備將碼流發(fā)給實時視頻流存儲服務(wù)。
雙緩沖為主緩沖區(qū)和備用緩沖區(qū)兩個緩沖區(qū),主緩沖區(qū)和備用緩沖區(qū)交替使用,雙緩沖區(qū)存儲結(jié)構(gòu)如圖3所示,每個緩沖區(qū)結(jié)構(gòu)為{相機編號、存儲狀態(tài)、當(dāng)前已經(jīng)存儲的數(shù)據(jù)大小、I幀列表信息(I幀偏移量、時間戳)}。
雙緩沖區(qū)數(shù)據(jù)保存過程如下:
獲取當(dāng)前緩沖區(qū)剩余空間,兩個緩沖區(qū)默認(rèn)大小設(shè)置可以根據(jù)實際情況進(jìn)行設(shè)置,當(dāng)接收到一個完整的I幀序列時數(shù)據(jù)時,將該數(shù)據(jù)存入主緩沖區(qū),當(dāng)不是一個完整的I幀序列數(shù)據(jù)時,則將該數(shù)據(jù)保存在臨時緩沖區(qū)。如果緩沖區(qū)剩余空間小于接收到的I幀數(shù)據(jù),則將該緩沖區(qū)標(biāo)志設(shè)置為已滿,并將緩沖區(qū)剩余空間進(jìn)行占位填充,將已經(jīng)接收到的數(shù)據(jù)保存至另一個緩沖區(qū)中,并將I幀的時間戳信息保存起來,更新數(shù)據(jù)總大小信息。
步驟4、遍歷相機列表信息,創(chuàng)建視頻流存儲線程和視頻流接收線程,每路視頻對應(yīng)一個存儲線程和一個視頻流接收線程,同時建立相機與存儲線程、視頻流接收線程之間的映射關(guān)系,并向調(diào)度服務(wù)發(fā)起實時視頻播放請求。
步驟5、調(diào)度服務(wù)向下級平臺或設(shè)備發(fā)起視頻點播請求,為每路視頻開啟一個存儲線程和一個視頻流接收線程。
步驟6、視頻流接收線程在接收到視頻流后,將數(shù)據(jù)保存到對應(yīng)的緩沖區(qū)中,存儲線程根據(jù)緩沖區(qū)存滿標(biāo)志將視頻流存儲到云平臺上,并將時間節(jié)點信息保存至數(shù)據(jù)庫中。
視頻流接收線程接收視頻流的具體方式為:
判斷視頻流的長度是否大于RTP包頭長度,如果小于則直接丟棄;
否則獲取到視頻流數(shù)據(jù),獲取視頻幀類型;
如果是I幀,判斷臨時接收緩沖區(qū)中是否有數(shù)據(jù),如果沒有,則直接將數(shù)據(jù)保存至臨時緩沖區(qū);如果有數(shù)據(jù),則將臨時緩沖區(qū)中的數(shù)據(jù)保存至緩沖區(qū)中,將接收到的I幀保存至臨時緩沖區(qū);
如果是P幀,判斷是否找到了I幀,如果沒有找到,則丟棄掉,如果已經(jīng)找到,則將視頻流保存至臨時緩沖區(qū)中;
每次在處理完成后更新接收序號和接收時間戳信息。
I幀序列數(shù)據(jù)入雙緩沖區(qū)實現(xiàn)流程如圖4所示,具體步驟如下:
步驟11、根據(jù)獲取到I幀序列數(shù)據(jù)、數(shù)據(jù)長度、I幀絕對時間信息;
步驟12、獲取主緩沖區(qū)的狀態(tài),判斷備用緩沖區(qū)中是否有數(shù)據(jù),如果有數(shù)據(jù),則執(zhí)行步驟13;否則執(zhí)行步驟14;
步驟13、獲取備用緩沖區(qū)的剩余空間,判斷備用緩沖區(qū)的剩余空間是否存夠存儲,如果是,則將數(shù)據(jù)拷貝至備用緩沖區(qū),執(zhí)行步驟15;否則將備用緩沖區(qū)的狀態(tài)設(shè)置成已滿,將剩下的空間進(jìn)行占位填充,同時將數(shù)據(jù)拷貝至主緩沖區(qū),執(zhí)行步驟15
步驟14、判斷主緩沖區(qū)的剩余空間是否足夠存儲,如果足夠存儲,則將數(shù)據(jù)拷貝至主緩沖區(qū),執(zhí)行步驟15;否則將主緩沖區(qū)的狀態(tài)設(shè)置為已滿,將剩下的空間進(jìn)行占位填充,并將數(shù)據(jù)拷貝至備用緩沖區(qū),執(zhí)行步驟15;
步驟15、處理完畢。
視頻流存儲線程實現(xiàn)流程如圖4所示,具體步驟如下:
步驟21、根據(jù)配置文件中的云平臺配置信息初始化云平臺接口、相機編號以及雙緩沖區(qū)信息;
步驟22、啟動視頻流存儲線程;
步驟23、判斷是否接收到服務(wù)的退出命令,如果接收到退出命令,則退出循環(huán),等待程序退出,否則執(zhí)行步驟24;
步驟24、判斷主緩沖區(qū)是否已滿,如果已滿,則調(diào)用云平臺存儲接口將數(shù)據(jù)保存至云平臺,如果存儲成功,則將視頻片段信息保存至數(shù)據(jù)庫,重置緩沖區(qū),執(zhí)行步驟25;
步驟25、判斷備用緩沖區(qū)是否已經(jīng)寫滿,如果備用緩沖區(qū)已經(jīng)寫滿,則調(diào)用云平臺存儲接口將數(shù)據(jù)保存至云平臺,如果存儲成功,則將視頻片段信息保存至數(shù)據(jù)庫,重置緩沖區(qū),執(zhí)行步驟26;
步驟26、進(jìn)行下一輪的判斷,執(zhí)行步驟23。
存儲接口通過云平臺配置信息進(jìn)行初始化。
視頻流接收線程實現(xiàn)流程如圖5所示,具體步驟如下:
步驟31、初始化視頻流接收線程,包括相機編號、雙緩沖區(qū);
步驟32、生成視頻流接收端口,并設(shè)置臨時接收緩沖區(qū);
步驟33、啟動視頻流接收線程;
步驟34、在視頻流接收線程中判斷是否接收到退出命令,如果接收到,則執(zhí)行步驟35,否則執(zhí)行步驟36;
步驟35、停止接收視頻流,并判斷雙緩沖區(qū)中是否有需要存儲的視頻數(shù)據(jù),如果有,將緩沖區(qū)的存滿標(biāo)志置成已滿,并進(jìn)行數(shù)據(jù)占位填充(保證整個緩沖區(qū)都是填滿的),如果沒有,則退出循環(huán),等待線程退出;
步驟36、準(zhǔn)備接收視頻流,判斷是否接收到線程的退出信號,如果接收到,則執(zhí)行步驟35;否則執(zhí)行步驟37;
步驟37、獲取視頻數(shù)據(jù)、幀類型,如果是I幀,判斷基準(zhǔn)時間是否存在,(RTP((Realtime Transport Protocol,實時傳輸協(xié)議))數(shù)據(jù)獲取到的時間戳都是相對時間),如果不存在,則將基準(zhǔn)時間設(shè)置為當(dāng)前時間,根據(jù)RTP數(shù)據(jù)的時間戳信息以及基準(zhǔn)時間更新I幀絕對時間,執(zhí)行步驟38;如果不是I幀,則執(zhí)行步驟39;
步驟38、將之前保存的整個I幀序列保存至雙緩沖區(qū),將新接收到I幀保存至臨時接收緩沖區(qū),并更新序號、時間戳信息,執(zhí)行步驟36;
步驟39、判斷是否已經(jīng)接收到I幀,如果已經(jīng)收到了I幀,則將接收到的視頻數(shù)據(jù)保存至臨時接收緩沖區(qū),并更新序號、時間戳信息,執(zhí)行步驟36;否則數(shù)據(jù)丟棄,更新序號、時間戳信息,執(zhí)行步驟36。
步驟7在存儲完成后,重置相機的緩沖區(qū),同時將視頻流存儲信息保存到數(shù)據(jù)庫中;重復(fù)步驟3-7,直到接收到退出指令。
以上所述僅為本發(fā)明的實施例,并非因此限制本發(fā)明的專利范圍,凡是利用本發(fā)明說明書內(nèi)容所作的等效結(jié)構(gòu)或等效流程變換,或直接或間接運用在其他相關(guān)的技術(shù)領(lǐng)域,均同理包括在本發(fā)明的專利保護(hù)范圍內(nèi)。