本發(fā)明涉及流數(shù)據(jù)存儲技術(shù)領(lǐng)域,具體涉及一種流數(shù)據(jù)的并發(fā)讀寫方法以及一種流數(shù)據(jù)的并發(fā)讀寫裝置。
背景技術(shù):
流數(shù)據(jù)為可以采用流式傳輸?shù)姆绞皆诰W(wǎng)絡(luò)上傳輸?shù)臄?shù)據(jù),大型網(wǎng)站系統(tǒng)經(jīng)常依賴于內(nèi)容分發(fā)網(wǎng)絡(luò)(Content Delivery Network,CDN)對流數(shù)據(jù)進(jìn)行傳輸,內(nèi)容分發(fā)網(wǎng)絡(luò)是通過在現(xiàn)有的網(wǎng)絡(luò)中增加一層新的網(wǎng)絡(luò)結(jié)構(gòu),使用戶可以將數(shù)據(jù)傳輸?shù)骄徒墓?jié)點上或從就近的節(jié)點獲取所需的數(shù)據(jù)。在內(nèi)容分發(fā)網(wǎng)絡(luò)中,部署有傳輸節(jié)點,用于緩沖流數(shù)據(jù),就近給用戶提供服務(wù)。
流數(shù)據(jù)在經(jīng)傳輸節(jié)點進(jìn)行分發(fā)時,可采用并發(fā)讀寫的工作方式,在向共享內(nèi)存的緩沖隊列中寫入流數(shù)據(jù)的同時,從共享內(nèi)存的緩沖隊列讀取流數(shù)據(jù)。通常對于同一流數(shù)據(jù),會同時存在一個寫訪問和多個讀訪問。因此,可能存在對緩沖隊列的相同位置同時發(fā)起讀、寫訪問的情況,將會導(dǎo)致緩沖隊列中的數(shù)據(jù)混亂,數(shù)據(jù)的一致性會出現(xiàn)問題。
為了避免上述問題,通常采用鎖操作的方式來避免讀和寫的位置不會重疊,鎖操作是一種保證互斥訪問內(nèi)存的保護(hù)措施,具體而言,當(dāng)同時發(fā)起對流數(shù)據(jù)隊列的讀和/或訪問時,要求訪問操作首先獲取流數(shù)據(jù)隊列的互斥鎖,才能具有訪問流數(shù)據(jù)隊列的權(quán)限,獲得互斥鎖的訪問操作訪問流數(shù)據(jù)隊列,并在結(jié)束對流數(shù)據(jù)隊列的訪問時,釋放互斥鎖,之后其他訪問操作可根據(jù)獲取的互斥鎖依次訪問流數(shù)據(jù)隊列。
利用鎖操作的方式雖然避免了對流數(shù)據(jù)隊列進(jìn)行同時操作時引起的數(shù)據(jù)混亂和訪問數(shù)據(jù)出錯的問題,但是通過鎖操作的方式控制并發(fā)讀寫,由于請求鎖、等待鎖和釋放鎖都會增加處理開銷,消耗處理器時間,使得在執(zhí)行鎖操作的過程中造成CPU資源的浪費。
技術(shù)實現(xiàn)要素:
鑒于上述問題,提出了本發(fā)明以便提供一種克服上述問題或者至少部分地解決上述問題的流數(shù)據(jù)的并發(fā)讀寫方法和相應(yīng)的裝置。
依據(jù)本發(fā)明的一個方面,提供了一種流數(shù)據(jù)的并發(fā)讀寫方法,包括:
將流數(shù)據(jù)循環(huán)順次寫入由多個數(shù)據(jù)隊列構(gòu)建的存儲區(qū);
從所述存儲區(qū)讀取流數(shù)據(jù)時,預(yù)估當(dāng)前寫入數(shù)據(jù)隊列之后的預(yù)備寫入數(shù)據(jù)隊列為待讀取數(shù)據(jù)隊列;
從待讀取數(shù)據(jù)隊列轉(zhuǎn)向讀取流數(shù)據(jù)更新的第一目標(biāo)數(shù)據(jù)隊列。
可選地,所述將流數(shù)據(jù)循環(huán)順次寫入由多個數(shù)據(jù)隊列構(gòu)建的存儲區(qū)包括:
順次向各個數(shù)據(jù)隊列寫入設(shè)定的數(shù)據(jù)時長的流數(shù)據(jù)。
可選地,所述預(yù)估當(dāng)前寫入數(shù)據(jù)隊列之后的預(yù)備寫入數(shù)據(jù)隊列為待讀取數(shù)據(jù)隊列包括:
判斷當(dāng)前時間距離待讀取數(shù)據(jù)隊列的起始寫入時間是否超出第一時間閾值;
若是,則確定當(dāng)前寫入數(shù)據(jù)隊列之后的預(yù)備寫入數(shù)據(jù)隊列可能為待讀取數(shù)據(jù)隊列,所述第一時間閾值為除去一個數(shù)據(jù)隊列之外其他隊列的時間長度的總和。
可選地,所述從待讀取數(shù)據(jù)隊列轉(zhuǎn)向讀取流數(shù)據(jù)更新的第一目標(biāo)數(shù)據(jù)隊列包括:
查找存儲有最新流數(shù)據(jù)的第一目標(biāo)數(shù)據(jù)隊列;
讀取查找的第一目標(biāo)數(shù)據(jù)隊列。
可選地,所述查找存儲有最新流數(shù)據(jù)的第一目標(biāo)數(shù)據(jù)隊列包括:
提取各個數(shù)據(jù)隊列的起始寫入時間;
查找起始寫入時間距離當(dāng)前時間最近的數(shù)據(jù)隊列為第一目標(biāo)數(shù)據(jù)隊列。
可選地,所述查找存儲有最新流數(shù)據(jù)的第一目標(biāo)數(shù)據(jù)隊列包括:
調(diào)用流數(shù)據(jù)讀取線程訪問流數(shù)據(jù)寫入線程;
接收流數(shù)據(jù)寫入線程反饋的最新流數(shù)據(jù)的第一目標(biāo)數(shù)據(jù)隊列的隊列標(biāo)識。
可選地,所述方法還包括:
在將流數(shù)據(jù)寫入某一數(shù)據(jù)隊列后,對設(shè)定位置記錄的最新隊列進(jìn)行更新;
所述查找存儲有最新流數(shù)據(jù)的第一目標(biāo)數(shù)據(jù)隊列包括:
在所述設(shè)定位置查找存儲有最新流數(shù)據(jù)的最新隊列。
可選地,在所述讀取查找的第一目標(biāo)數(shù)據(jù)隊列之前,所述從待讀取數(shù)據(jù)隊列轉(zhuǎn)向讀取流數(shù)據(jù)更新的第一目標(biāo)數(shù)據(jù)隊列還包括:
查找所述第一目標(biāo)數(shù)據(jù)隊列中的最新畫面組;
所述讀取查找的第一目標(biāo)數(shù)據(jù)隊列包括:
在所述第一目標(biāo)數(shù)據(jù)隊列中,從所查找的最新畫面組開始讀取流數(shù)據(jù)。
可選地,在所述查找所述第一目標(biāo)數(shù)據(jù)隊列中的最新畫面組之后,包括:
查找所述第一目標(biāo)數(shù)據(jù)隊列中的最新畫面組的I幀;
所述在所述第一目標(biāo)數(shù)據(jù)隊列中,從所查找的最新畫面組開始讀取流數(shù)據(jù)包括:
在所述第一目標(biāo)數(shù)據(jù)隊列中,從所查找的最新畫面組的I幀開始讀取流數(shù)據(jù)。
可選地,所述方法還包括:
在讀取前一數(shù)據(jù)隊列時,根據(jù)最后讀取的流數(shù)據(jù)預(yù)估下一個讀取的流數(shù)據(jù);
判定待讀取的下一數(shù)據(jù)隊列的第一個流數(shù)據(jù)并非預(yù)估的流數(shù)據(jù)時,從所述待讀取的下一數(shù)據(jù)隊列轉(zhuǎn)向讀取除待寫入的下一數(shù)據(jù)隊列之外的第二目標(biāo)數(shù)據(jù)隊列。
可選地,所述從所述待讀取的下一數(shù)據(jù)隊列轉(zhuǎn)向讀取除待寫入的下一數(shù)據(jù)隊列之外的第二目標(biāo)數(shù)據(jù)隊列包括:
查找起始寫入時間距離當(dāng)前時間未超出第二時間閾值的任一第二目標(biāo)數(shù)據(jù)隊列,所述第二時間閾值為除去一個數(shù)據(jù)隊列之外其他隊列的時間長度的總和。
可選地,所述從所述待讀取的下一數(shù)據(jù)隊列轉(zhuǎn)向讀取除待寫入的下一數(shù)據(jù)隊列之外的第二目標(biāo)數(shù)據(jù)隊列包括:
從所述待讀取的下一數(shù)據(jù)隊列轉(zhuǎn)向讀取存儲有最新流數(shù)據(jù)的第二目標(biāo)數(shù)據(jù)隊列。
可選地,在所述將流數(shù)據(jù)循環(huán)順次寫入由多個數(shù)據(jù)隊列構(gòu)建的存儲區(qū)之前,所述方法還包括:
接收從另一傳輸節(jié)點推送至當(dāng)前傳輸節(jié)點的流數(shù)據(jù);
在所述從所述存儲區(qū)讀取流數(shù)據(jù)之前,所述方法還包括:
接收從當(dāng)前傳輸節(jié)點對流數(shù)據(jù)的讀取請求。
可選地,所述將流數(shù)據(jù)循環(huán)順次寫入由多個數(shù)據(jù)隊列構(gòu)建的存儲區(qū)包括:
由流數(shù)據(jù)寫入線程將流數(shù)據(jù)循環(huán)順次寫入由多個數(shù)據(jù)隊列構(gòu)建的存儲區(qū);
所述從所述存儲區(qū)讀取流數(shù)據(jù)包括:
由流數(shù)據(jù)讀取線程從所述存儲區(qū)讀取流數(shù)據(jù)。
可選地,所述由流數(shù)據(jù)讀取線程從所述存儲區(qū)讀取流數(shù)據(jù)包括:
記錄當(dāng)前讀取的數(shù)據(jù)隊列的隊列標(biāo)識和流數(shù)據(jù)的位置標(biāo)識;
推算下一個讀取的流數(shù)據(jù)的位置標(biāo)識和隊列標(biāo)識,并進(jìn)行讀取。
可選地,所述從所述存儲區(qū)讀取流數(shù)據(jù)包括:
按照數(shù)據(jù)隊列的隊列標(biāo)識順次從各個數(shù)據(jù)隊列讀取流數(shù)據(jù)。
根據(jù)本發(fā)明的另一方面,提供了一種流數(shù)據(jù)的并發(fā)讀寫裝置,包括:
流數(shù)據(jù)寫入模塊,用于將流數(shù)據(jù)循環(huán)順次寫入由多個數(shù)據(jù)隊列構(gòu)建的存儲區(qū);
預(yù)估模塊,用于從所述存儲區(qū)讀取流數(shù)據(jù)時,預(yù)估當(dāng)前寫入數(shù)據(jù)隊列之后的預(yù)備寫入數(shù)據(jù)隊列為待讀取數(shù)據(jù)隊列;
第一隊列讀取模塊,用于從待讀取數(shù)據(jù)隊列轉(zhuǎn)向讀取流數(shù)據(jù)更新的第一目標(biāo)數(shù)據(jù)隊列。
可選地,所述流數(shù)據(jù)寫入模塊,具體用于順次向各個數(shù)據(jù)隊列寫入設(shè)定的數(shù)據(jù)時長的流數(shù)據(jù)。
可選地,所述預(yù)估模塊包括:
第一判斷子模塊,用于判斷當(dāng)前時間距離待讀取數(shù)據(jù)隊列的起始寫入時間是否超出第一時間閾值;
第一確定子模塊,用于若是,則確定當(dāng)前寫入數(shù)據(jù)隊列之后的預(yù)備寫入數(shù)據(jù)隊列可能為待讀取數(shù)據(jù)隊列,所述第一時間閾值為除去一個數(shù)據(jù)隊列之外其他隊列的時間長度的總和。
可選地,所述第一隊列讀取模塊包括:
第一查找子模塊,用于查找存儲有最新流數(shù)據(jù)的第一目標(biāo)數(shù)據(jù)隊列;
第一讀取子模塊,讀取查找的第一目標(biāo)數(shù)據(jù)隊列。
可選地,所述第一查找子模塊包括:
寫入時間提取子單元,用于提取各個數(shù)據(jù)隊列的起始寫入時間;
第一查找子單元,用于查找起始寫入時間距離當(dāng)前時間最近的數(shù)據(jù)隊列為第一目標(biāo)數(shù)據(jù)隊列。
可選地,所述第一查找子模塊包括:
寫入線程調(diào)用子單元,用于調(diào)用流數(shù)據(jù)讀取線程訪問流數(shù)據(jù)寫入線程;
隊列標(biāo)識接收子單元,接收流數(shù)據(jù)寫入線程反饋的最新流數(shù)據(jù)的第一目標(biāo)數(shù)據(jù)隊列的隊列標(biāo)識。
可選地,所述裝置還包括:
最新隊列更新模塊,用于在將流數(shù)據(jù)寫入某一數(shù)據(jù)隊列后,對設(shè)定位置記錄的最新隊列進(jìn)行更新;
所述第一查找子模塊,具體用于在所述設(shè)定位置查找存儲有最新流數(shù)據(jù)的最新隊列。
可選地,所述第一隊列讀取模塊還包括:
畫面組查找子單元,用于在所述讀取查找的第一目標(biāo)數(shù)據(jù)隊列之前,查找所述第一目標(biāo)數(shù)據(jù)隊列中的最新畫面組;
所述第一讀取子模塊,具體用于在所述第一目標(biāo)數(shù)據(jù)隊列中,從所查找的最新畫面組開始讀取流數(shù)據(jù)。
可選地,所述裝置還包括:
幀查找子模塊,用于在所述查找所述第一目標(biāo)數(shù)據(jù)隊列中的最新畫面組之后,查找所述第一目標(biāo)數(shù)據(jù)隊列中的最新畫面組的I幀;
所述第一讀取子模塊,具體用于在所述第一目標(biāo)數(shù)據(jù)隊列中,從所查找的最新畫面組的I幀開始讀取流數(shù)據(jù)。
可選地,所述裝置還包括:
流數(shù)據(jù)預(yù)估模塊,用于在讀取前一數(shù)據(jù)隊列時,根據(jù)最后讀取的流數(shù)據(jù)預(yù)估下一個讀取的流數(shù)據(jù);
第二隊列讀取模塊,用于判定待讀取的下一數(shù)據(jù)隊列的第一個流數(shù)據(jù)并非預(yù)估的流數(shù)據(jù)時,從所述待讀取的下一數(shù)據(jù)隊列轉(zhuǎn)向讀取除待寫入的下一數(shù)據(jù)隊列之外的第二目標(biāo)數(shù)據(jù)隊列。
可選地,所述第二隊列讀取模塊包括:
第二查找子單元,用于查找起始寫入時間距離當(dāng)前時間未超出第二時間閾值的任一第二目標(biāo)數(shù)據(jù)隊列,所述第二時間閾值為除去一個數(shù)據(jù)隊列之外其他隊列的時間長度的總和。
可選地,所述第二隊列讀取模塊,具體用于從所述待讀取的下一數(shù)據(jù)隊列轉(zhuǎn)向讀取存儲有最新流數(shù)據(jù)的第二目標(biāo)數(shù)據(jù)隊列。
可選地,所述裝置還包括:
流數(shù)據(jù)接收模塊,用于在所述將流數(shù)據(jù)循環(huán)順次寫入由多個數(shù)據(jù)隊列構(gòu)建的存儲區(qū)之前,接收從另一傳輸節(jié)點推送至當(dāng)前傳輸節(jié)點的流數(shù)據(jù);
所述裝置還包括:
讀取請求接收模塊,用于在所述從所述存儲區(qū)讀取流數(shù)據(jù)之前,接收從當(dāng)前傳輸節(jié)點對流數(shù)據(jù)的讀取請求。
可選地,所述流數(shù)據(jù)寫入模塊,具體用于由流數(shù)據(jù)寫入線程將流數(shù)據(jù)循環(huán)順次寫入由多個數(shù)據(jù)隊列構(gòu)建的存儲區(qū);
所述預(yù)估模塊包括:
線程讀取子模塊,用于由流數(shù)據(jù)讀取線程從所述存儲區(qū)讀取流數(shù)據(jù)。
可選地,所述線程讀取子模塊包括:
標(biāo)識記錄子單元,用于記錄當(dāng)前讀取的數(shù)據(jù)隊列的隊列標(biāo)識和流數(shù)據(jù)的位置標(biāo)識;
推算與讀取子單元,用于推算下一個讀取的流數(shù)據(jù)的位置標(biāo)識和隊列標(biāo)識,并進(jìn)行讀取。
可選地,所述預(yù)估模塊包括:
順次讀取子模塊,用于按照數(shù)據(jù)隊列的隊列標(biāo)識順次從各個數(shù)據(jù)隊列讀取流數(shù)據(jù)。
根據(jù)本發(fā)明的一種流數(shù)據(jù)的并發(fā)讀寫方法和裝置可以通過將流數(shù)據(jù)循環(huán)順次寫入由多個數(shù)據(jù)隊列構(gòu)建的存儲區(qū),從所述存儲區(qū)讀取流數(shù)據(jù)時,預(yù)估當(dāng)前寫入數(shù)據(jù)隊列之后的預(yù)備寫入數(shù)據(jù)隊列為待讀取數(shù)據(jù)隊列,從待讀取數(shù)據(jù)隊列轉(zhuǎn)向讀取流數(shù)據(jù)更新的第一目標(biāo)數(shù)據(jù)隊列,使得可以通過在預(yù)估到預(yù)備寫入數(shù)據(jù)隊列為待讀取數(shù)據(jù)隊列情況下,轉(zhuǎn)向讀取流數(shù)據(jù)更新的數(shù)據(jù)隊列,防止當(dāng)前寫入數(shù)據(jù)隊列被寫滿后,轉(zhuǎn)到預(yù)備寫入數(shù)據(jù)隊列,也就是待讀取數(shù)據(jù)隊列開始寫入,避免出現(xiàn)待讀取數(shù)據(jù)隊列中的流數(shù)據(jù)被寫入操作所刪除或覆蓋的情況發(fā)生,相比通過鎖操作的方式控制并發(fā)讀寫,降低了流數(shù)據(jù)并發(fā)讀寫時的處理器資源占用,提高了流數(shù)據(jù)的并發(fā)讀寫的效率。
上述說明僅是本發(fā)明技術(shù)方案的概述,為了能夠更清楚了解本發(fā)明的技術(shù)手段,而可依照說明書的內(nèi)容予以實施,并且為了讓本發(fā)明的上述和其它目的、特征和優(yōu)點能夠更明顯易懂,以下特舉本發(fā)明的具體實施方式。
附圖說明
通過閱讀下文優(yōu)選實施方式的詳細(xì)描述,各種其他的優(yōu)點和益處對于本領(lǐng)域普通技術(shù)人員將變得清楚明了。附圖僅用于示出優(yōu)選實施方式的目的,而并不認(rèn)為是對本發(fā)明的限制。而且在整個附圖中,用相同的參考符號表示相同的部件。在附圖中:
圖1示出了根據(jù)本發(fā)明實施例一的一種流數(shù)據(jù)的并發(fā)讀寫方法的步驟流程示意圖;
圖2示出了根據(jù)本發(fā)明實施例二的一種流數(shù)據(jù)的并發(fā)讀寫方法的步驟流程示意圖;
圖3示出了根據(jù)本發(fā)明實施例三的一種流數(shù)據(jù)的并發(fā)讀寫方法的步驟流程示意圖;
圖4示出了根據(jù)本發(fā)明實施例四的一種流數(shù)據(jù)的并發(fā)讀寫裝置的結(jié)構(gòu)框圖。
具體實施方式
下面將參照附圖更詳細(xì)地描述本公開的示例性實施例。雖然附圖中顯示了本公開的示例性實施例,然而應(yīng)當(dāng)理解,可以以各種形式實現(xiàn)本公開而不應(yīng)被這里闡述的實施例所限制。相反,提供這些實施例是為了能夠更透徹地理解本公開,并且能夠?qū)⒈竟_的范圍完整的傳達(dá)給本領(lǐng)域的技術(shù)人員。
參照圖1,示出了根據(jù)本發(fā)明實施例一的一種流數(shù)據(jù)的并發(fā)讀寫方法的步驟流程示意圖,具體可以包括如下步驟:
步驟101,將流數(shù)據(jù)循環(huán)順次寫入由多個數(shù)據(jù)隊列構(gòu)建的存儲區(qū)。
本發(fā)明可以應(yīng)用在視頻直播或遠(yuǎn)程攝像頭等服務(wù)中,在視頻直播應(yīng)用或遠(yuǎn)程攝像頭應(yīng)用中,需要經(jīng)過傳輸節(jié)點分發(fā)流數(shù)據(jù),其中,流數(shù)據(jù)為可以采用流式傳輸?shù)姆绞皆诰W(wǎng)絡(luò)上傳輸?shù)臄?shù)據(jù),傳輸節(jié)點是指用于分發(fā)流數(shù)據(jù)的流媒體服務(wù)器。
在本發(fā)明實施例中,存儲區(qū)為傳輸節(jié)點的內(nèi)存中為流數(shù)據(jù)讀寫分配的一段存儲空間,具體采用隊列的數(shù)據(jù)結(jié)構(gòu),由多個數(shù)據(jù)隊列組成一個存儲區(qū),該存儲區(qū)可以循環(huán)順次地被寫入或讀取。存儲區(qū)可以由任意適用的個數(shù)的數(shù)據(jù)隊列組成,本發(fā)明實施例對此不做限制。
具體而言,流數(shù)據(jù)寫入時,從第一個數(shù)據(jù)隊列開始順次寫入,并在寫滿存儲區(qū)后,再從第一個數(shù)據(jù)隊列開始順次寫入,以此方式實現(xiàn)將流數(shù)據(jù)循環(huán)順次地寫入存儲區(qū)。
例如,存儲區(qū)是由7個數(shù)據(jù)隊列組成,設(shè)定每個數(shù)據(jù)隊列中存儲5秒的視頻流數(shù)據(jù)。先從第1個數(shù)據(jù)隊列開始順次寫入,每次寫滿5秒的視頻流數(shù)據(jù)后,切換到下一個數(shù)據(jù)隊列繼續(xù)寫入,直到7個數(shù)據(jù)隊列全部寫滿,再從第1個數(shù)據(jù)隊列開始,用新的數(shù)據(jù)隊列覆蓋掉第1個數(shù)據(jù)隊列中的視頻流數(shù)據(jù),以此方式繼續(xù)循環(huán)地將視頻流數(shù)據(jù)寫入7個數(shù)據(jù)隊列構(gòu)建地存儲區(qū)。
在視頻直播或遠(yuǎn)程攝像頭的應(yīng)用場景下,一個傳輸節(jié)點上通常會同時有多個流數(shù)據(jù)的分發(fā)任務(wù),為每個流數(shù)據(jù)分配對應(yīng)的由多個數(shù)據(jù)隊列構(gòu)建的存儲區(qū),當(dāng)有視頻流數(shù)據(jù)傳輸?shù)絺鬏敼?jié)點時,將視頻流數(shù)據(jù)以上述方式寫入由多個數(shù)據(jù)隊列構(gòu)建的存儲區(qū),以供流數(shù)據(jù)傳輸連接從存儲區(qū)中讀取視頻流數(shù)據(jù)。
步驟102,從所述存儲區(qū)讀取流數(shù)據(jù)時,預(yù)估當(dāng)前寫入數(shù)據(jù)隊列之后的預(yù)備寫入數(shù)據(jù)隊列為待讀取數(shù)據(jù)隊列。
在本發(fā)明實施例中,從存儲區(qū)讀取流數(shù)據(jù)時,通常當(dāng)一個數(shù)據(jù)隊列中的數(shù)據(jù)讀取完畢后,順次讀取下一個數(shù)據(jù)隊列中的流數(shù)據(jù),以此方式循環(huán)地從存儲區(qū)地各個數(shù)據(jù)隊列中讀取流數(shù)據(jù)。當(dāng)前寫入數(shù)據(jù)隊列為當(dāng)前正在寫入流數(shù)據(jù)的隊列,預(yù)備寫入數(shù)據(jù)隊列為當(dāng)前寫入數(shù)據(jù)隊列被寫滿后要被寫入的數(shù)據(jù)隊列,待讀取數(shù)據(jù)隊列為當(dāng)前準(zhǔn)備要讀取流數(shù)據(jù)的隊列。多個讀取并發(fā)時,每個讀取操作對應(yīng)一個待讀取數(shù)據(jù)隊列。
對于每個讀取操作,在每次從數(shù)據(jù)隊列中讀取流數(shù)據(jù)時,需要先進(jìn)行預(yù)估,預(yù)估到待讀取數(shù)據(jù)隊列為當(dāng)前寫入數(shù)據(jù)隊列之后的預(yù)備寫入數(shù)據(jù)隊列情況,也就是當(dāng)前正在讀取的隊列是否就是當(dāng)前正在寫入的數(shù)據(jù)隊列之后要寫入的一個數(shù)據(jù)隊列的情況。如果待讀取數(shù)據(jù)隊列不是當(dāng)前寫入數(shù)據(jù)隊列之后的預(yù)備寫入數(shù)據(jù)隊列,那么繼續(xù)從待讀取數(shù)據(jù)隊列中讀取數(shù)據(jù);如果待讀取數(shù)據(jù)隊列為當(dāng)前寫入數(shù)據(jù)隊列之后的預(yù)備寫入數(shù)據(jù)隊列,那么執(zhí)行按照步驟103執(zhí)行下一步操作。
具體可以采用任意適用的方式預(yù)估待讀取數(shù)據(jù)隊列為當(dāng)前寫入數(shù)據(jù)隊列之后的預(yù)備寫入數(shù)據(jù)隊列,本實施例對此不作限定。例如,在視頻直播應(yīng)用中,由于每個數(shù)據(jù)隊列中存儲5秒的視頻流數(shù)據(jù),那么第1個數(shù)據(jù)隊列中的起始的流數(shù)據(jù)生成的時間一定比第7個數(shù)據(jù)隊列中的起始的流數(shù)據(jù)生成的時間要早至少30秒。對于每個數(shù)據(jù)隊列記錄有起始寫入該數(shù)據(jù)隊列的時間,而流數(shù)據(jù)寫入數(shù)據(jù)隊列的時間一定晚于流數(shù)據(jù)生成的時間,如果待讀取數(shù)據(jù)隊列為第1個數(shù)據(jù)隊列,在讀取流數(shù)據(jù)前進(jìn)行判斷,如果當(dāng)前時間減去第1個數(shù)據(jù)隊列對應(yīng)的起始寫入時間的差值大于等于30秒,那么當(dāng)前寫入數(shù)據(jù)隊列就有可能是第7個數(shù)據(jù)隊列,而第1個數(shù)據(jù)隊列為第7個數(shù)據(jù)隊列之后的預(yù)備寫入數(shù)據(jù)隊列。由此根據(jù)記錄的每個數(shù)據(jù)隊列的寫入時間,預(yù)估出當(dāng)前寫入數(shù)據(jù)隊列之后的預(yù)備寫入數(shù)據(jù)隊列為待讀取數(shù)據(jù)隊列。
步驟103,從待讀取數(shù)據(jù)隊列轉(zhuǎn)向讀取流數(shù)據(jù)更新的第一目標(biāo)數(shù)據(jù)隊列。
第一目標(biāo)數(shù)據(jù)隊列為存儲有相比待讀取數(shù)據(jù)隊列更新的流數(shù)據(jù)的數(shù)據(jù)隊列。由于存儲區(qū)中數(shù)據(jù)隊列中的數(shù)據(jù)時順序?qū)懭氲?,那么待讀取數(shù)據(jù)隊列之后直到當(dāng)前寫入數(shù)據(jù)隊列的數(shù)據(jù)隊列都可以作為第一目標(biāo)數(shù)據(jù)隊列。具體選擇哪一個流數(shù)據(jù)更新的數(shù)據(jù)隊列作為第一目標(biāo)數(shù)據(jù)隊列,本實施例對此不做限定。
當(dāng)預(yù)估到當(dāng)前寫入數(shù)據(jù)隊列之后的預(yù)備寫入數(shù)據(jù)隊列為待讀取數(shù)據(jù)隊列時,為了防止當(dāng)前寫入數(shù)據(jù)隊列被寫滿后,轉(zhuǎn)到待讀取數(shù)據(jù)隊列開始寫入,導(dǎo)致出現(xiàn)待讀取數(shù)據(jù)隊列中的流數(shù)據(jù)被寫入操作所刪除或覆蓋的情況發(fā)生,轉(zhuǎn)為讀取流數(shù)據(jù)更新的第一目標(biāo)數(shù)據(jù)隊列。例如,將待讀取數(shù)據(jù)隊列的下一個數(shù)據(jù)隊列作為第一目標(biāo)數(shù)據(jù)隊列,或者將當(dāng)前寫入數(shù)據(jù)隊列作為第一目標(biāo)數(shù)據(jù)隊列,并且只要保證寫入的位置在讀取的位置之前,那么待讀取的位置的流數(shù)據(jù)就不會被寫入操作所刪除或覆蓋。
綜上所述,依據(jù)本發(fā)明實施例,通過將流數(shù)據(jù)循環(huán)順次寫入由多個數(shù)據(jù)隊列構(gòu)建的存儲區(qū),從所述存儲區(qū)讀取流數(shù)據(jù)時,預(yù)估當(dāng)前寫入數(shù)據(jù)隊列之后的預(yù)備寫入數(shù)據(jù)隊列為待讀取數(shù)據(jù)隊列,從待讀取數(shù)據(jù)隊列轉(zhuǎn)向讀取流數(shù)據(jù)更新的第一目標(biāo)數(shù)據(jù)隊列,使得可以通過在預(yù)估到預(yù)備寫入數(shù)據(jù)隊列為待讀取數(shù)據(jù)隊列情況下,轉(zhuǎn)向讀取流數(shù)據(jù)更新的數(shù)據(jù)隊列,防止當(dāng)前寫入數(shù)據(jù)隊列被寫滿后,轉(zhuǎn)到預(yù)備寫入數(shù)據(jù)隊列,也就是待讀取數(shù)據(jù)隊列開始寫入,避免出現(xiàn)待讀取數(shù)據(jù)隊列中的流數(shù)據(jù)被寫入操作所刪除或覆蓋的情況發(fā)生,相比通過鎖操作的方式控制并發(fā)讀寫,降低了流數(shù)據(jù)并發(fā)讀寫時的處理器資源占用,提高了流數(shù)據(jù)的并發(fā)讀寫的效率。
在本發(fā)明實施例中,優(yōu)選地,所述將流數(shù)據(jù)循環(huán)順次寫入由多個數(shù)據(jù)隊列構(gòu)建的存儲區(qū)的一種實現(xiàn)方式為,順次向各個數(shù)據(jù)隊列寫入設(shè)定的數(shù)據(jù)時長的流數(shù)據(jù)。
具體而言,可以為各數(shù)據(jù)隊列設(shè)定可以寫入的流數(shù)據(jù)的數(shù)據(jù)時長,當(dāng)向一個數(shù)據(jù)隊列中寫入流數(shù)據(jù)達(dá)到該數(shù)據(jù)隊列設(shè)定的數(shù)據(jù)時長時,轉(zhuǎn)向下一個數(shù)據(jù)隊列寫入流數(shù)據(jù)。具體可以設(shè)定任意適用的時長作為寫入的流數(shù)據(jù)的數(shù)據(jù)時長,本實施例對此不做限定。例如,設(shè)定每個數(shù)據(jù)隊列中可以寫入播放時長為5秒的視頻流數(shù)據(jù),在順次寫入各個數(shù)據(jù)隊列時,一個數(shù)據(jù)隊列中寫入5秒的視頻流數(shù)據(jù)后,就轉(zhuǎn)向下一個數(shù)據(jù)隊列開始寫入,以此方式循環(huán)順次寫入存儲區(qū)。
在本發(fā)明實施例中,優(yōu)選地,所述預(yù)估當(dāng)前寫入數(shù)據(jù)隊列之后的預(yù)備寫入數(shù)據(jù)隊列為待讀取數(shù)據(jù)隊列的一種實現(xiàn)方式為,判斷當(dāng)前時間距離待讀取數(shù)據(jù)隊列的起始寫入時間是否超出第一時間閾值;若是,則確定當(dāng)前寫入數(shù)據(jù)隊列之后的預(yù)備寫入數(shù)據(jù)隊列可能為待讀取數(shù)據(jù)隊列,所述第一時間閾值為除去一個數(shù)據(jù)隊列之外其他隊列的時間長度的總和。
具體而言,每個數(shù)據(jù)隊列在寫入流數(shù)據(jù)時記錄有起始寫入時間,第一時間閾值為除去一個數(shù)據(jù)隊列之外其他隊列的時間長度的總和。例如一共有7個數(shù)據(jù)隊列,每個數(shù)據(jù)隊列中存儲有5秒的數(shù)據(jù)時長的流數(shù)據(jù),那么第一時間閾值為5乘以6等于30秒。
在讀取流數(shù)據(jù)時,判斷當(dāng)前時間減去待讀取數(shù)據(jù)隊列的起始寫入時間是否超過第一時間閾值,如果超過了第一時間閾值,那么確定當(dāng)前寫入數(shù)據(jù)隊列之后的預(yù)備寫入數(shù)據(jù)隊列可能為待讀取數(shù)據(jù)隊列。
在本發(fā)明實施例中,優(yōu)選地,所述從所述存儲區(qū)讀取流數(shù)據(jù)的一種實現(xiàn)方式為,按照數(shù)據(jù)隊列的隊列標(biāo)識順次從各個數(shù)據(jù)隊列讀取流數(shù)據(jù)。
具體而言,數(shù)據(jù)隊列的隊列標(biāo)識是指為數(shù)據(jù)隊列設(shè)置的標(biāo)識,例如隊列編號。按照數(shù)據(jù)隊列的隊列標(biāo)識順次從各個數(shù)據(jù)隊列讀取流數(shù)據(jù),例如讀取完第1個數(shù)據(jù)隊列的流數(shù)據(jù)后,讀取第2個數(shù)據(jù)隊列的流數(shù)據(jù),以此方式實現(xiàn)順次從各個數(shù)據(jù)隊列讀取流數(shù)據(jù)。
參照圖2,示出了根據(jù)本發(fā)明實施例二的一種流數(shù)據(jù)的并發(fā)讀寫方法的步驟流程示意圖,具體可以包括如下步驟:
步驟201,將流數(shù)據(jù)循環(huán)順次寫入由多個數(shù)據(jù)隊列構(gòu)建的存儲區(qū)。
步驟202,從所述存儲區(qū)讀取流數(shù)據(jù)時,預(yù)估當(dāng)前寫入數(shù)據(jù)隊列之后的預(yù)備寫入數(shù)據(jù)隊列為待讀取數(shù)據(jù)隊列。
步驟203,查找存儲有最新流數(shù)據(jù)的第一目標(biāo)數(shù)據(jù)隊列。
在本發(fā)明實施例中,將存儲有最新流數(shù)據(jù)的數(shù)據(jù)隊列作為第一目標(biāo)數(shù)據(jù)隊列,具體查找存儲有最新流數(shù)據(jù)的數(shù)據(jù)隊列的方式可以有多種,具體采用的方式,本發(fā)明實施例對此不作限定。例如,可以查找起始寫入時間距離當(dāng)前時間最近的數(shù)據(jù)隊列,或者可以查找流數(shù)據(jù)寫入線程正在寫入的數(shù)據(jù)隊列。
在本發(fā)明實施例中,優(yōu)選地,所述查找存儲有最新流數(shù)據(jù)的第一目標(biāo)數(shù)據(jù)隊列的一種實現(xiàn)方式為,提取各個數(shù)據(jù)隊列的起始寫入時間;查找起始寫入時間距離當(dāng)前時間最近的數(shù)據(jù)隊列為第一目標(biāo)數(shù)據(jù)隊列。
提取各個數(shù)據(jù)隊列的起始寫入時間,查找與當(dāng)前時間最近的起始寫入時間對應(yīng)的數(shù)據(jù)隊列,該數(shù)據(jù)隊列中存儲有最新的流數(shù)據(jù),可以作為第一目標(biāo)數(shù)據(jù)隊列。
在本發(fā)明實施例中,優(yōu)選地,所述查找存儲有最新流數(shù)據(jù)的第一目標(biāo)數(shù)據(jù)隊列的一種實現(xiàn)方式為,調(diào)用流數(shù)據(jù)讀取線程訪問流數(shù)據(jù)寫入線程;接收流數(shù)據(jù)寫入線程反饋的最新流數(shù)據(jù)的第一目標(biāo)數(shù)據(jù)隊列的隊列標(biāo)識。
具體而言,流數(shù)據(jù)讀取線程可以有多個,調(diào)用需要查找存儲有最新流數(shù)據(jù)的第一目標(biāo)數(shù)據(jù)隊列的流數(shù)據(jù)讀取線程,建立與流數(shù)據(jù)寫入線程的通信,請求流數(shù)據(jù)寫入線程反饋最新流數(shù)據(jù)的數(shù)據(jù)隊列的隊列標(biāo)識,接收流數(shù)據(jù)寫入線程反饋的最新流數(shù)據(jù)的第一目標(biāo)數(shù)據(jù)隊列的隊列標(biāo)識,以供根據(jù)隊列標(biāo)識找到對應(yīng)的第一目標(biāo)數(shù)據(jù)隊列。
在本發(fā)明實施例中,優(yōu)選地,所述方法還包括:在將流數(shù)據(jù)寫入某一數(shù)據(jù)隊列后,對設(shè)定位置記錄的最新隊列進(jìn)行更新;所述查找存儲有最新流數(shù)據(jù)的第一目標(biāo)數(shù)據(jù)隊列包括:在所述設(shè)定位置查找存儲有最新流數(shù)據(jù)的最新隊列。
具體而言,在設(shè)定位置記錄最新隊列,在流數(shù)據(jù)寫入某一數(shù)據(jù)隊列后,對記錄的最新隊列進(jìn)行更新,例如,可以根據(jù)寫入線程寫入的數(shù)據(jù)隊列,在設(shè)定位置記錄最新隊列的標(biāo)識,以供讀取線程到設(shè)定位置查找該標(biāo)識。
從記錄存儲有最新流數(shù)據(jù)的數(shù)據(jù)隊列的設(shè)定位置查找最新隊列,作為第一目標(biāo)數(shù)據(jù)隊列。
步驟204,讀取查找的第一目標(biāo)數(shù)據(jù)隊列。
從第一目標(biāo)數(shù)據(jù)隊列中讀取流數(shù)據(jù),可以從第一目標(biāo)數(shù)據(jù)隊列上當(dāng)前寫入的位置后的任意位置開始讀取流數(shù)據(jù),例如,從第一目標(biāo)數(shù)據(jù)隊列的起始位置開始讀取流數(shù)據(jù),或者從查找的最新畫面組開始讀取流數(shù)據(jù)。具體可以是第一目標(biāo)數(shù)據(jù)隊列上任意適用的位置開始讀取流數(shù)據(jù),本實施例對此不做限定。
在本發(fā)明實施例中,優(yōu)選地,在所述讀取查找的第一目標(biāo)數(shù)據(jù)隊列之前,所述從待讀取數(shù)據(jù)隊列轉(zhuǎn)向讀取流數(shù)據(jù)更新的第一目標(biāo)數(shù)據(jù)隊列還包括:查找所述第一目標(biāo)數(shù)據(jù)隊列中的最新畫面組;所述讀取查找的第一目標(biāo)數(shù)據(jù)隊列的一種實現(xiàn)方式是:在所述第一目標(biāo)數(shù)據(jù)隊列中,從所查找的最新畫面組開始讀取流數(shù)據(jù)。
具體而言,畫面組是指視頻中一組連續(xù)的畫面,本實施例中,最新畫面組為最新寫入的一組完整的畫面組,在讀取查找的第一目標(biāo)數(shù)據(jù)隊列之前,查找第一目標(biāo)數(shù)據(jù)隊列中的最新畫面組,例如,可以訪問流數(shù)據(jù)寫入線程,查找最新寫入的一組完整的畫面組。查找最新畫面組可以采用任意適用的方法,本實施例對此不做限定。
在第一目標(biāo)數(shù)據(jù)隊列中,從查找的最新畫面組開始讀取流數(shù)據(jù)。由于在視頻解碼時只能解碼完整的畫面組來播放,所以讀取最新的流數(shù)據(jù)需要從最新的一個畫面組開始。
在本發(fā)明實施例中,優(yōu)選地,在所述查找所述第一目標(biāo)數(shù)據(jù)隊列中的最新畫面組之后,包括:查找所述第一目標(biāo)數(shù)據(jù)隊列中的最新畫面組的I幀;所述在所述第一目標(biāo)數(shù)據(jù)隊列中,從所查找的最新畫面組開始讀取流數(shù)據(jù)包括:在所述第一目標(biāo)數(shù)據(jù)隊列中,從所查找的最新畫面組的I幀開始讀取流數(shù)據(jù)。
MPEG(Moving Picture Experts Group,動態(tài)圖像專家組)標(biāo)準(zhǔn)編碼將畫面(即幀)分為I、P、B三種,I是內(nèi)部編碼幀,P是前向預(yù)測幀,B是雙向內(nèi)插幀。簡單地講,I幀是一個完整的畫面,而P幀和B幀記錄的是相對于I幀的變化。沒有I幀,P幀和B幀就無法解碼。
具體而言,在查找第一目標(biāo)數(shù)據(jù)隊列中的最新畫面組之后,查找第一目標(biāo)數(shù)據(jù)隊列中最新畫面組的I幀,之后在在第一目標(biāo)數(shù)據(jù)隊列中,從所查找的最新畫面組的I幀開始讀取流數(shù)據(jù)。
綜上所述,依據(jù)本發(fā)明實施例,通過將流數(shù)據(jù)循環(huán)順次寫入由多個數(shù)據(jù)隊列構(gòu)建的存儲區(qū),從所述存儲區(qū)讀取流數(shù)據(jù)時,預(yù)估當(dāng)前寫入數(shù)據(jù)隊列之后的預(yù)備寫入數(shù)據(jù)隊列為待讀取數(shù)據(jù)隊列,查找存儲有最新流數(shù)據(jù)的第一目標(biāo)數(shù)據(jù)隊列,讀取查找的第一目標(biāo)數(shù)據(jù)隊列,使得可以通過在預(yù)估到預(yù)備寫入數(shù)據(jù)隊列為待讀取數(shù)據(jù)隊列情況下,轉(zhuǎn)向讀取流數(shù)據(jù)最新的數(shù)據(jù)隊列,防止當(dāng)前寫入數(shù)據(jù)隊列被寫滿后,轉(zhuǎn)到預(yù)備寫入數(shù)據(jù)隊列,也就是待讀取數(shù)據(jù)隊列開始寫入,避免出現(xiàn)待讀取數(shù)據(jù)隊列中的流數(shù)據(jù)被寫入操作所刪除或覆蓋的情況發(fā)生,相比通過鎖操作的方式控制并發(fā)讀寫,降低了流數(shù)據(jù)并發(fā)讀寫時的處理器資源占用,提高了流數(shù)據(jù)的并發(fā)讀寫的效率。
進(jìn)一步,轉(zhuǎn)向讀取流數(shù)據(jù)最新的數(shù)據(jù)隊列既可以滿足視頻直播應(yīng)用的直播需求,又可以使待讀取數(shù)據(jù)隊列和預(yù)備寫入數(shù)據(jù)隊列的距離最遠(yuǎn),減小了再次轉(zhuǎn)向第一目標(biāo)數(shù)據(jù)隊列讀取流數(shù)據(jù)的可能性,以使讀取的流數(shù)據(jù)可以連續(xù)不中斷,實現(xiàn)流數(shù)據(jù)的播放流暢。
參照圖3,示出了根據(jù)本發(fā)明實施例三的一種流數(shù)據(jù)的并發(fā)讀寫方法的步驟流程示意圖,具體可以包括如下步驟:
步驟301,接收從另一傳輸節(jié)點推送至當(dāng)前傳輸節(jié)點的流數(shù)據(jù)。
在本發(fā)明實施例中,一個傳輸節(jié)點可以主動或根據(jù)請求向另一個傳輸節(jié)點推送流數(shù)據(jù),接收從另一個傳輸節(jié)點推送至當(dāng)前傳輸節(jié)點的流數(shù)據(jù)。
步驟302,由流數(shù)據(jù)寫入線程將流數(shù)據(jù)循環(huán)順次寫入由多個數(shù)據(jù)隊列構(gòu)建的存儲區(qū)。
在本發(fā)明實施例中,流數(shù)據(jù)寫入線程是指傳輸節(jié)點上可以將流數(shù)據(jù)寫入存儲區(qū)建立的線程。在接收到流數(shù)據(jù)后,又流數(shù)據(jù)寫入線程將流數(shù)據(jù)循環(huán)順次寫入由多個數(shù)據(jù)隊列構(gòu)建的存儲區(qū)。
步驟303,接收從當(dāng)前傳輸節(jié)點對流數(shù)據(jù)的讀取請求。
在本發(fā)明實施例中,當(dāng)前傳輸節(jié)點對流數(shù)據(jù)的讀取請求是指在當(dāng)前傳輸節(jié)點根據(jù)流數(shù)據(jù)傳輸請求向存儲區(qū)讀取流數(shù)據(jù)的請求。接收當(dāng)前傳輸節(jié)點對流數(shù)據(jù)的讀取請求。
步驟304,由流數(shù)據(jù)讀取線程從所述存儲區(qū)讀取流數(shù)據(jù)時,預(yù)估當(dāng)前寫入數(shù)據(jù)隊列之后的預(yù)備寫入數(shù)據(jù)隊列為待讀取數(shù)據(jù)隊列。
在本發(fā)明實施例中,在流數(shù)據(jù)讀取線程從存儲區(qū)讀取流數(shù)據(jù)時,預(yù)估當(dāng)前寫入數(shù)據(jù)隊列之后的預(yù)備寫入數(shù)據(jù)隊列為待讀取數(shù)據(jù)隊列。具體實現(xiàn)方式與其他實施例描述一致,不再贅述。
步驟305,從待讀取數(shù)據(jù)隊列轉(zhuǎn)向讀取流數(shù)據(jù)更新的第一目標(biāo)數(shù)據(jù)隊列。
在本發(fā)明實施例中,優(yōu)選地,所述方法還包括:在讀取前一數(shù)據(jù)隊列時,根據(jù)最后讀取的流數(shù)據(jù)預(yù)估下一個讀取的流數(shù)據(jù);判定待讀取的下一數(shù)據(jù)隊列的第一個流數(shù)據(jù)并非預(yù)估的流數(shù)據(jù)時,從所述待讀取的下一數(shù)據(jù)隊列轉(zhuǎn)向讀取除待寫入的下一數(shù)據(jù)隊列之外的第二目標(biāo)數(shù)據(jù)隊列。
具體而言,在讀取前一數(shù)據(jù)隊列時,根據(jù)最后讀取的流數(shù)據(jù),預(yù)估下一個流數(shù)據(jù),其中預(yù)估的流數(shù)據(jù)與最后讀取的流數(shù)據(jù)可以組成連續(xù)的流數(shù)據(jù),例如,可以給每個數(shù)據(jù)隊列中存儲的流數(shù)據(jù)進(jìn)行編號,當(dāng)讀取完數(shù)據(jù)隊列的最后一個流數(shù)據(jù),預(yù)估的流數(shù)據(jù)的編號應(yīng)該是當(dāng)前正在讀取的數(shù)據(jù)隊列中流數(shù)據(jù)的編號的下一個。具體預(yù)估下一個流數(shù)據(jù)的方式可以采用任意適用的方式,本發(fā)明實施例對此不做限制。
在讀取完一個數(shù)據(jù)隊列中的流數(shù)據(jù)時,判斷下一待讀取的數(shù)據(jù)隊列中的流數(shù)據(jù)并非預(yù)估的流數(shù)據(jù)時,也就是下一數(shù)據(jù)隊列中流數(shù)據(jù)已經(jīng)被更新的流數(shù)據(jù)所覆蓋,從待讀取的下一數(shù)據(jù)隊列轉(zhuǎn)向讀取第二目標(biāo)數(shù)據(jù)隊列,其中第二目標(biāo)數(shù)據(jù)隊列為除待寫入的下一數(shù)據(jù)隊列之外的數(shù)據(jù)隊列。
例如,此時7個數(shù)據(jù)隊列中,從第1個數(shù)據(jù)隊列到第7個數(shù)據(jù)隊列,分別為其中存儲的流數(shù)據(jù)進(jìn)行編號,第1個數(shù)據(jù)隊列中存儲著第8組流數(shù)據(jù),第2個數(shù)據(jù)隊列中存儲著第9組流數(shù)據(jù),在讀取完第1個數(shù)據(jù)隊列中的第8組流數(shù)據(jù)后,預(yù)估下一個讀取的流數(shù)據(jù)為第9組流數(shù)據(jù)的第一個,如果此時第2個數(shù)據(jù)隊列中的第9組流數(shù)據(jù)被第16組流數(shù)據(jù)所覆蓋,那么判定待讀取的第2個數(shù)據(jù)隊列的第一個流數(shù)據(jù)并非預(yù)估的第9組流數(shù)據(jù)時,轉(zhuǎn)向讀取第二目標(biāo)數(shù)據(jù)隊列。
在本發(fā)明實施例中,優(yōu)選地,所述從所述待讀取的下一數(shù)據(jù)隊列轉(zhuǎn)向讀取除待寫入的下一數(shù)據(jù)隊列之外的第二目標(biāo)數(shù)據(jù)隊列包括:查找起始寫入時間距離當(dāng)前時間未超出第二時間閾值的任一第二目標(biāo)數(shù)據(jù)隊列,所述第二時間閾值為除去一個數(shù)據(jù)隊列之外其他隊列的時間長度的總和。
具體而言,每個數(shù)據(jù)隊列在寫入流數(shù)據(jù)時記錄有起始寫入時間,第二時間閾值為除去一個數(shù)據(jù)隊列之外其他隊列的時間長度的總和。例如一共有7個數(shù)據(jù)隊列,每個數(shù)據(jù)隊列中存儲有5秒的數(shù)據(jù)時長的流數(shù)據(jù),那么第二時間閾值為5乘以6等于30秒。
在讀取流數(shù)據(jù)時,判斷當(dāng)前時間減去待讀取數(shù)據(jù)隊列的起始寫入時間是否超過第二時間閾值,如果超過了第二時間閾值,那么從所述待讀取的下一數(shù)據(jù)隊列轉(zhuǎn)向讀取除待寫入的下一數(shù)據(jù)隊列之外的第二目標(biāo)數(shù)據(jù)隊列。
在本發(fā)明實施例中,優(yōu)選地,所述從所述待讀取的下一數(shù)據(jù)隊列轉(zhuǎn)向讀取除待寫入的下一數(shù)據(jù)隊列之外的第二目標(biāo)數(shù)據(jù)隊列包括:從所述待讀取的下一數(shù)據(jù)隊列轉(zhuǎn)向讀取存儲有最新流數(shù)據(jù)的第二目標(biāo)數(shù)據(jù)隊列。
具體而言,將存儲有最新流數(shù)據(jù)的數(shù)據(jù)隊列作為第二目標(biāo)數(shù)據(jù)隊列,具體查找存儲有最新流數(shù)據(jù)的數(shù)據(jù)隊列的方式可以有多種,具體采用的方式,本發(fā)明實施例對此不作限定。例如,可以查找起始寫入時間距離當(dāng)前時間最近的數(shù)據(jù)隊列,或者可以查找流數(shù)據(jù)寫入線程正在寫入的數(shù)據(jù)隊列。
從待讀取的下一數(shù)據(jù)隊列轉(zhuǎn)向讀取存儲有最新流數(shù)據(jù)的第二目標(biāo)數(shù)據(jù)隊列,可以從第二目標(biāo)數(shù)據(jù)隊列上當(dāng)前寫入的位置后的任意位置開始讀取流數(shù)據(jù),例如,從第二目標(biāo)數(shù)據(jù)隊列的起始位置開始讀取流數(shù)據(jù),或者從查找的最新畫面組開始讀取流數(shù)據(jù)。具體可以是第二目標(biāo)數(shù)據(jù)隊列上任意適用的位置開始讀取流數(shù)據(jù),本實施例對此不做限定。
在本發(fā)明實施例中,優(yōu)選地,所述由流數(shù)據(jù)讀取線程從所述存儲區(qū)讀取流數(shù)據(jù)包括:記錄當(dāng)前讀取的數(shù)據(jù)隊列的隊列標(biāo)識和流數(shù)據(jù)的位置標(biāo)識;推算下一個讀取的流數(shù)據(jù)的位置標(biāo)識和隊列標(biāo)識,并進(jìn)行讀取。
具體而言,隊列標(biāo)識是指為數(shù)據(jù)隊列設(shè)置的標(biāo)識,例如隊列編號,位置標(biāo)識是指數(shù)據(jù)隊列中為流數(shù)據(jù)存儲位置設(shè)置的標(biāo)識,例如位置編號。在流數(shù)據(jù)讀取線程從存儲區(qū)讀取流數(shù)據(jù)時,記錄當(dāng)前讀取的流數(shù)據(jù)所在數(shù)據(jù)隊列的隊列標(biāo)識,以及流數(shù)據(jù)的位置標(biāo)識。用記錄的隊列標(biāo)識和位置標(biāo)識,推算下一句讀取的流數(shù)據(jù)的位置標(biāo)識和隊列標(biāo)識,并從對應(yīng)的數(shù)據(jù)隊列的對應(yīng)的位置讀取流數(shù)據(jù)。
綜上所述,依據(jù)本發(fā)明實施例,通過接收從另一傳輸節(jié)點推送至當(dāng)前傳輸節(jié)點的流數(shù)據(jù),由流數(shù)據(jù)寫入線程將流數(shù)據(jù)循環(huán)順次寫入由多個數(shù)據(jù)隊列構(gòu)建的存儲區(qū),實現(xiàn)了將另一個傳輸節(jié)點推送的流數(shù)據(jù)寫入當(dāng)前傳輸節(jié)點的存儲區(qū),以供其他傳輸節(jié)點或客戶端從當(dāng)前傳輸節(jié)點請求時讀取。
進(jìn)一步,通過接收從當(dāng)前傳輸節(jié)點對流數(shù)據(jù)的讀取請求,由流數(shù)據(jù)讀取線程從所述存儲區(qū)讀取流數(shù)據(jù)時,預(yù)估當(dāng)前寫入數(shù)據(jù)隊列之后的預(yù)備寫入數(shù)據(jù)隊列為待讀取數(shù)據(jù)隊列,從待讀取數(shù)據(jù)隊列轉(zhuǎn)向讀取流數(shù)據(jù)更新的第一目標(biāo)數(shù)據(jù)隊列,使得可以通過在預(yù)估到預(yù)備寫入數(shù)據(jù)隊列為待讀取數(shù)據(jù)隊列情況下,轉(zhuǎn)向讀取流數(shù)據(jù)最新的數(shù)據(jù)隊列,防止當(dāng)前寫入數(shù)據(jù)隊列被寫滿后,轉(zhuǎn)到預(yù)備寫入數(shù)據(jù)隊列,也就是待讀取數(shù)據(jù)隊列開始寫入,避免出現(xiàn)待讀取數(shù)據(jù)隊列中的流數(shù)據(jù)被寫入操作所刪除或覆蓋的情況發(fā)生,相比通過鎖操作的方式控制并發(fā)讀寫,降低了流數(shù)據(jù)并發(fā)讀寫時的處理器資源占用,提高了流數(shù)據(jù)的并發(fā)讀寫的效率。
參照圖4,示出了根據(jù)本發(fā)明實施例四的一種流數(shù)據(jù)的并發(fā)讀寫裝置的結(jié)構(gòu)框圖,具體可以包括如下模塊:
流數(shù)據(jù)寫入模塊401,用于將流數(shù)據(jù)循環(huán)順次寫入由多個數(shù)據(jù)隊列構(gòu)建的存儲區(qū);
預(yù)估模塊402,用于從所述存儲區(qū)讀取流數(shù)據(jù)時,預(yù)估當(dāng)前寫入數(shù)據(jù)隊列之后的預(yù)備寫入數(shù)據(jù)隊列為待讀取數(shù)據(jù)隊列;
第一隊列讀取模塊403,用于從待讀取數(shù)據(jù)隊列轉(zhuǎn)向讀取流數(shù)據(jù)更新的第一目標(biāo)數(shù)據(jù)隊列。
優(yōu)選地,所述流數(shù)據(jù)寫入模塊,具體用于順次向各個數(shù)據(jù)隊列寫入設(shè)定的數(shù)據(jù)時長的流數(shù)據(jù)。
優(yōu)選地,所述預(yù)估模塊包括:
第一判斷子模塊,用于判斷當(dāng)前時間距離待讀取數(shù)據(jù)隊列的起始寫入時間是否超出第一時間閾值;
第一確定子模塊,用于若是,則確定當(dāng)前寫入數(shù)據(jù)隊列之后的預(yù)備寫入數(shù)據(jù)隊列可能為待讀取數(shù)據(jù)隊列,所述第一時間閾值為除去一個數(shù)據(jù)隊列之外其他隊列的時間長度的總和。
優(yōu)選地,所述第一隊列讀取模塊包括:
第一查找子模塊,用于查找存儲有最新流數(shù)據(jù)的第一目標(biāo)數(shù)據(jù)隊列;
第一讀取子模塊,讀取查找的第一目標(biāo)數(shù)據(jù)隊列。
優(yōu)選地,所述第一查找子模塊包括:
寫入時間提取子單元,用于提取各個數(shù)據(jù)隊列的起始寫入時間;
第一查找子單元,用于查找起始寫入時間距離當(dāng)前時間最近的數(shù)據(jù)隊列為第一目標(biāo)數(shù)據(jù)隊列。
優(yōu)選地,所述第一查找子模塊包括:
寫入線程調(diào)用子單元,用于調(diào)用流數(shù)據(jù)讀取線程訪問流數(shù)據(jù)寫入線程;
隊列標(biāo)識接收子單元,接收流數(shù)據(jù)寫入線程反饋的最新流數(shù)據(jù)的第一目標(biāo)數(shù)據(jù)隊列的隊列標(biāo)識。
優(yōu)選地,所述裝置還包括:
最新隊列更新模塊,用于在將流數(shù)據(jù)寫入某一數(shù)據(jù)隊列后,對設(shè)定位置記錄的最新隊列進(jìn)行更新;
所述第一查找子模塊,具體用于在所述設(shè)定位置查找存儲有最新流數(shù)據(jù)的最新隊列。
優(yōu)選地,所述第一隊列讀取模塊還包括:
畫面組查找子單元,用于在所述讀取查找的第一目標(biāo)數(shù)據(jù)隊列之前,查找所述第一目標(biāo)數(shù)據(jù)隊列中的最新畫面組;
所述第一讀取子模塊,具體用于在所述第一目標(biāo)數(shù)據(jù)隊列中,從所查找的最新畫面組開始讀取流數(shù)據(jù)。
優(yōu)選地,所述裝置還包括:
幀查找子模塊,用于在所述查找所述第一目標(biāo)數(shù)據(jù)隊列中的最新畫面組之后,查找所述第一目標(biāo)數(shù)據(jù)隊列中的最新畫面組的I幀;
所述第一讀取子模塊,具體用于在所述第一目標(biāo)數(shù)據(jù)隊列中,從所查找的最新畫面組的I幀開始讀取流數(shù)據(jù)。
優(yōu)選地,所述裝置還包括:
流數(shù)據(jù)預(yù)估模塊,用于在讀取前一數(shù)據(jù)隊列時,根據(jù)最后讀取的流數(shù)據(jù)預(yù)估下一個讀取的流數(shù)據(jù);
第二隊列讀取模塊,用于判定待讀取的下一數(shù)據(jù)隊列的第一個流數(shù)據(jù)并非預(yù)估的流數(shù)據(jù)時,從所述待讀取的下一數(shù)據(jù)隊列轉(zhuǎn)向讀取除待寫入的下一數(shù)據(jù)隊列之外的第二目標(biāo)數(shù)據(jù)隊列。
優(yōu)選地,所述第二隊列讀取模塊包括:
第二查找子單元,用于查找起始寫入時間距離當(dāng)前時間未超出第二時間閾值的任一第二目標(biāo)數(shù)據(jù)隊列,所述第二時間閾值為除去一個數(shù)據(jù)隊列之外其他隊列的時間長度的總和。
優(yōu)選地,所述第二隊列讀取模塊,具體用于從所述待讀取的下一數(shù)據(jù)隊列轉(zhuǎn)向讀取存儲有最新流數(shù)據(jù)的第二目標(biāo)數(shù)據(jù)隊列。
優(yōu)選地,所述裝置還包括:
流數(shù)據(jù)接收模塊,用于在所述將流數(shù)據(jù)循環(huán)順次寫入由多個數(shù)據(jù)隊列構(gòu)建的存儲區(qū)之前,接收從另一傳輸節(jié)點推送至當(dāng)前傳輸節(jié)點的流數(shù)據(jù);
所述裝置還包括:
讀取請求接收模塊,用于在所述從所述存儲區(qū)讀取流數(shù)據(jù)之前,接收從當(dāng)前傳輸節(jié)點對流數(shù)據(jù)的讀取請求。
優(yōu)選地,所述流數(shù)據(jù)寫入模塊,具體用于由流數(shù)據(jù)寫入線程將流數(shù)據(jù)循環(huán)順次寫入由多個數(shù)據(jù)隊列構(gòu)建的存儲區(qū);
所述預(yù)估模塊包括:
線程讀取子模塊,用于由流數(shù)據(jù)讀取線程從所述存儲區(qū)讀取流數(shù)據(jù)。
優(yōu)選地,所述線程讀取子模塊包括:
標(biāo)識記錄子單元,用于記錄當(dāng)前讀取的數(shù)據(jù)隊列的隊列標(biāo)識和流數(shù)據(jù)的位置標(biāo)識;
推算與讀取子單元,用于推算下一個讀取的流數(shù)據(jù)的位置標(biāo)識和隊列標(biāo)識,并進(jìn)行讀取。
優(yōu)選地,所述預(yù)估模塊包括:
順次讀取子模塊,用于按照數(shù)據(jù)隊列的隊列標(biāo)識順次從各個數(shù)據(jù)隊列讀取流數(shù)據(jù)。
綜上所述,依據(jù)本發(fā)明實施例,通過將流數(shù)據(jù)循環(huán)順次寫入由多個數(shù)據(jù)隊列構(gòu)建的存儲區(qū),從所述存儲區(qū)讀取流數(shù)據(jù)時,預(yù)估當(dāng)前寫入數(shù)據(jù)隊列之后的預(yù)備寫入數(shù)據(jù)隊列為待讀取數(shù)據(jù)隊列,從待讀取數(shù)據(jù)隊列轉(zhuǎn)向讀取流數(shù)據(jù)更新的第一目標(biāo)數(shù)據(jù)隊列,使得可以通過在預(yù)估到預(yù)備寫入數(shù)據(jù)隊列為待讀取數(shù)據(jù)隊列情況下,轉(zhuǎn)向讀取流數(shù)據(jù)更新的數(shù)據(jù)隊列,防止當(dāng)前寫入數(shù)據(jù)隊列被寫滿后,轉(zhuǎn)到預(yù)備寫入數(shù)據(jù)隊列,也就是待讀取數(shù)據(jù)隊列開始寫入,避免出現(xiàn)待讀取數(shù)據(jù)隊列中的流數(shù)據(jù)被寫入操作所刪除或覆蓋的情況發(fā)生,相比通過鎖操作的方式控制并發(fā)讀寫,降低了流數(shù)據(jù)并發(fā)讀寫時的處理器資源占用,提高了流數(shù)據(jù)的并發(fā)讀寫的效率。
在此提供的算法和顯示不與任何特定計算機、虛擬系統(tǒng)或者其它設(shè)備固有相關(guān)。各種通用系統(tǒng)也可以與基于在此的示教一起使用。根據(jù)上面的描述,構(gòu)造這類系統(tǒng)所要求的結(jié)構(gòu)是顯而易見的。此外,本發(fā)明也不針對任何特定編程語言。應(yīng)當(dāng)明白,可以利用各種編程語言實現(xiàn)在此描述的本發(fā)明的內(nèi)容,并且上面對特定語言所做的描述是為了披露本發(fā)明的最佳實施方式。
在此處所提供的說明書中,說明了大量具體細(xì)節(jié)。然而,能夠理解,本發(fā)明的實施例可以在沒有這些具體細(xì)節(jié)的情況下實踐。在一些實例中,并未詳細(xì)示出公知的方法、結(jié)構(gòu)和技術(shù),以便不模糊對本說明書的理解。
類似地,應(yīng)當(dāng)理解,為了精簡本公開并幫助理解各個發(fā)明方面中的一個或多個,在上面對本發(fā)明的示例性實施例的描述中,本發(fā)明的各個特征有時被一起分組到單個實施例、圖、或者對其的描述中。然而,并不應(yīng)將該公開的方法解釋成反映如下意圖:即所要求保護(hù)的本發(fā)明要求比在每個權(quán)利要求中所明確記載的特征更多的特征。更確切地說,如下面的權(quán)利要求書所反映的那樣,發(fā)明方面在于少于前面公開的單個實施例的所有特征。因此,遵循具體實施方式的權(quán)利要求書由此明確地并入該具體實施方式,其中每個權(quán)利要求本身都作為本發(fā)明的單獨實施例。
本領(lǐng)域那些技術(shù)人員可以理解,可以對實施例中的設(shè)備中的模塊進(jìn)行自適應(yīng)性地改變并且把它們設(shè)置在與該實施例不同的一個或多個設(shè)備中??梢园褜嵤├械哪K或單元或組件組合成一個模塊或單元或組件,以及此外可以把它們分成多個子模塊或子單元或子組件。除了這樣的特征和/或過程或者單元中的至少一些是相互排斥之外,可以采用任何組合對本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的所有特征以及如此公開的任何方法或者設(shè)備的所有過程或單元進(jìn)行組合。除非另外明確陳述,本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的每個特征可以由提供相同、等同或相似目的的替代特征來代替。
此外,本領(lǐng)域的技術(shù)人員能夠理解,盡管在此所述的一些實施例包括其它實施例中所包括的某些特征而不是其它特征,但是不同實施例的特征的組合意味著處于本發(fā)明的范圍之內(nèi)并且形成不同的實施例。例如,在下面的權(quán)利要求書中,所要求保護(hù)的實施例的任意之一都可以以任意的組合方式來使用。
本發(fā)明的各個部件實施例可以以硬件實現(xiàn),或者以在一個或者多個處理器上運行的軟件模塊實現(xiàn),或者以它們的組合實現(xiàn)。本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,可以在實踐中使用微處理器或者數(shù)字信號處理器(DSP)來實現(xiàn)根據(jù)本發(fā)明實施例的一種流數(shù)據(jù)的并發(fā)讀寫方法和裝置中的一些或者全部部件的一些或者全部功能。本發(fā)明還可以實現(xiàn)為用于執(zhí)行這里所描述的方法的一部分或者全部的設(shè)備或者裝置程序(例如,計算機程序和計算機程序產(chǎn)品)。這樣的實現(xiàn)本發(fā)明的程序可以存儲在計算機可讀介質(zhì)上,或者可以具有一個或者多個信號的形式。這樣的信號可以從因特網(wǎng)網(wǎng)站上下載得到,或者在載體信號上提供,或者以任何其他形式提供。
應(yīng)該注意的是上述實施例對本發(fā)明進(jìn)行說明而不是對本發(fā)明進(jìn)行限制,并且本領(lǐng)域技術(shù)人員在不脫離所附權(quán)利要求的范圍的情況下可設(shè)計出替換實施例。在權(quán)利要求中,不應(yīng)將位于括號之間的任何參考符號構(gòu)造成對權(quán)利要求的限制。單詞“包含”不排除存在未列在權(quán)利要求中的元件或步驟。位于元件之前的單詞“一”或“一個”不排除存在多個這樣的元件。本發(fā)明可以借助于包括有若干不同元件的硬件以及借助于適當(dāng)編程的計算機來實現(xiàn)。在列舉了若干裝置的單元權(quán)利要求中,這些裝置中的若干個可以是通過同一個硬件項來具體體現(xiàn)。單詞第一、第二、以及第三等的使用不表示任何順序??蓪⑦@些單詞解釋為名稱。
本發(fā)明還公開了A1、一種流數(shù)據(jù)的并發(fā)讀寫方法,包括:
將流數(shù)據(jù)循環(huán)順次寫入由多個數(shù)據(jù)隊列構(gòu)建的存儲區(qū);
從所述存儲區(qū)讀取流數(shù)據(jù)時,預(yù)估當(dāng)前寫入數(shù)據(jù)隊列之后的預(yù)備寫入數(shù)據(jù)隊列為待讀取數(shù)據(jù)隊列;
從待讀取數(shù)據(jù)隊列轉(zhuǎn)向讀取流數(shù)據(jù)更新的第一目標(biāo)數(shù)據(jù)隊列。
A2、根據(jù)A1所述的方法,其中,所述將流數(shù)據(jù)循環(huán)順次寫入由多個數(shù)據(jù)隊列構(gòu)建的存儲區(qū)包括:
順次向各個數(shù)據(jù)隊列寫入設(shè)定的數(shù)據(jù)時長的流數(shù)據(jù)。
A3、根據(jù)A2所述的方法,其中,所述預(yù)估當(dāng)前寫入數(shù)據(jù)隊列之后的預(yù)備寫入數(shù)據(jù)隊列為待讀取數(shù)據(jù)隊列包括:
判斷當(dāng)前時間距離待讀取數(shù)據(jù)隊列的起始寫入時間是否超出第一時間閾值;
若是,則確定當(dāng)前寫入數(shù)據(jù)隊列之后的預(yù)備寫入數(shù)據(jù)隊列可能為待讀取數(shù)據(jù)隊列,所述第一時間閾值為除去一個數(shù)據(jù)隊列之外其他隊列的時間長度的總和。
A4、根據(jù)A1所述的方法,其中,所述從待讀取數(shù)據(jù)隊列轉(zhuǎn)向讀取流數(shù)據(jù)更新的第一目標(biāo)數(shù)據(jù)隊列包括:
查找存儲有最新流數(shù)據(jù)的第一目標(biāo)數(shù)據(jù)隊列;
讀取查找的第一目標(biāo)數(shù)據(jù)隊列。
A5、根據(jù)A4所述的方法,其中,所述查找存儲有最新流數(shù)據(jù)的第一目標(biāo)數(shù)據(jù)隊列包括:
提取各個數(shù)據(jù)隊列的起始寫入時間;
查找起始寫入時間距離當(dāng)前時間最近的數(shù)據(jù)隊列為第一目標(biāo)數(shù)據(jù)隊列。
A6、根據(jù)A4所述的方法,其中,所述查找存儲有最新流數(shù)據(jù)的第一目標(biāo)數(shù)據(jù)隊列包括:
調(diào)用流數(shù)據(jù)讀取線程訪問流數(shù)據(jù)寫入線程;
接收流數(shù)據(jù)寫入線程反饋的最新流數(shù)據(jù)的第一目標(biāo)數(shù)據(jù)隊列的隊列標(biāo)識。
A7、根據(jù)A4所述的方法,其中,所述方法還包括:
在將流數(shù)據(jù)寫入某一數(shù)據(jù)隊列后,對設(shè)定位置記錄的最新隊列進(jìn)行更新;
所述查找存儲有最新流數(shù)據(jù)的第一目標(biāo)數(shù)據(jù)隊列包括:
在所述設(shè)定位置查找存儲有最新流數(shù)據(jù)的最新隊列。
A8、根據(jù)A4所述的方法,其中,在所述讀取查找的第一目標(biāo)數(shù)據(jù)隊列之前,所述從待讀取數(shù)據(jù)隊列轉(zhuǎn)向讀取流數(shù)據(jù)更新的第一目標(biāo)數(shù)據(jù)隊列還包括:
查找所述第一目標(biāo)數(shù)據(jù)隊列中的最新畫面組;
所述讀取查找的第一目標(biāo)數(shù)據(jù)隊列包括:
在所述第一目標(biāo)數(shù)據(jù)隊列中,從所查找的最新畫面組開始讀取流數(shù)據(jù)。
A9、根據(jù)A8所述的方法,其中,在所述查找所述第一目標(biāo)數(shù)據(jù)隊列中的最新畫面組之后,包括:
查找所述第一目標(biāo)數(shù)據(jù)隊列中的最新畫面組的I幀;
所述在所述第一目標(biāo)數(shù)據(jù)隊列中,從所查找的最新畫面組開始讀取流數(shù)據(jù)包括:
在所述第一目標(biāo)數(shù)據(jù)隊列中,從所查找的最新畫面組的I幀開始讀取流數(shù)據(jù)。
A10、根據(jù)A1所述的方法,其中,所述方法還包括:
在讀取前一數(shù)據(jù)隊列時,根據(jù)最后讀取的流數(shù)據(jù)預(yù)估下一個讀取的流數(shù)據(jù);
判定待讀取的下一數(shù)據(jù)隊列的第一個流數(shù)據(jù)并非預(yù)估的流數(shù)據(jù)時,從所述待讀取的下一數(shù)據(jù)隊列轉(zhuǎn)向讀取除待寫入的下一數(shù)據(jù)隊列之外的第二目標(biāo)數(shù)據(jù)隊列。
A11、根據(jù)A10所述的方法,其中,所述從所述待讀取的下一數(shù)據(jù)隊列轉(zhuǎn)向讀取除待寫入的下一數(shù)據(jù)隊列之外的第二目標(biāo)數(shù)據(jù)隊列包括:
查找起始寫入時間距離當(dāng)前時間未超出第二時間閾值的任一第二目標(biāo)數(shù)據(jù)隊列,所述第二時間閾值為除去一個數(shù)據(jù)隊列之外其他隊列的時間長度的總和。
A12、根據(jù)A10所述的方法,其中,所述從所述待讀取的下一數(shù)據(jù)隊列轉(zhuǎn)向讀取除待寫入的下一數(shù)據(jù)隊列之外的第二目標(biāo)數(shù)據(jù)隊列包括:
從所述待讀取的下一數(shù)據(jù)隊列轉(zhuǎn)向讀取存儲有最新流數(shù)據(jù)的第二目標(biāo)數(shù)據(jù)隊列。
A13、根據(jù)A1所述的方法,其中,在所述將流數(shù)據(jù)循環(huán)順次寫入由多個數(shù)據(jù)隊列構(gòu)建的存儲區(qū)之前,所述方法還包括:
接收從另一傳輸節(jié)點推送至當(dāng)前傳輸節(jié)點的流數(shù)據(jù);
在所述從所述存儲區(qū)讀取流數(shù)據(jù)之前,所述方法還包括:
接收從當(dāng)前傳輸節(jié)點對流數(shù)據(jù)的讀取請求。
A14、根據(jù)A1所述的方法,其中,所述將流數(shù)據(jù)循環(huán)順次寫入由多個數(shù)據(jù)隊列構(gòu)建的存儲區(qū)包括:
由流數(shù)據(jù)寫入線程將流數(shù)據(jù)循環(huán)順次寫入由多個數(shù)據(jù)隊列構(gòu)建的存儲區(qū);
所述從所述存儲區(qū)讀取流數(shù)據(jù)包括:
由流數(shù)據(jù)讀取線程從所述存儲區(qū)讀取流數(shù)據(jù)。
A15、根據(jù)A14所述的方法,其中,所述由流數(shù)據(jù)讀取線程從所述存儲區(qū)讀取流數(shù)據(jù)包括:
記錄當(dāng)前讀取的數(shù)據(jù)隊列的隊列標(biāo)識和流數(shù)據(jù)的位置標(biāo)識;
推算下一個讀取的流數(shù)據(jù)的位置標(biāo)識和隊列標(biāo)識,并進(jìn)行讀取。
A16、根據(jù)A1所述的方法,其中,所述從所述存儲區(qū)讀取流數(shù)據(jù)包括:
按照數(shù)據(jù)隊列的隊列標(biāo)識順次從各個數(shù)據(jù)隊列讀取流數(shù)據(jù)。
本發(fā)明還公開了B17、一種流數(shù)據(jù)的并發(fā)讀寫裝置,包括:
流數(shù)據(jù)寫入模塊,用于將流數(shù)據(jù)循環(huán)順次寫入由多個數(shù)據(jù)隊列構(gòu)建的存儲區(qū);
預(yù)估模塊,用于從所述存儲區(qū)讀取流數(shù)據(jù)時,預(yù)估當(dāng)前寫入數(shù)據(jù)隊列之后的預(yù)備寫入數(shù)據(jù)隊列為待讀取數(shù)據(jù)隊列;
第一隊列讀取模塊,用于從待讀取數(shù)據(jù)隊列轉(zhuǎn)向讀取流數(shù)據(jù)更新的第一目標(biāo)數(shù)據(jù)隊列。
B18、根據(jù)B17所述的裝置,其中,所述流數(shù)據(jù)寫入模塊,具體用于順次向各個數(shù)據(jù)隊列寫入設(shè)定的數(shù)據(jù)時長的流數(shù)據(jù)。
B19、根據(jù)B18所述的裝置,其中,所述預(yù)估模塊包括:
第一判斷子模塊,用于判斷當(dāng)前時間距離待讀取數(shù)據(jù)隊列的起始寫入時間是否超出第一時間閾值;
第一確定子模塊,用于若是,則確定當(dāng)前寫入數(shù)據(jù)隊列之后的預(yù)備寫入數(shù)據(jù)隊列可能為待讀取數(shù)據(jù)隊列,所述第一時間閾值為除去一個數(shù)據(jù)隊列之外其他隊列的時間長度的總和。
B20、根據(jù)B17所述的裝置,其中,所述第一隊列讀取模塊包括:
第一查找子模塊,用于查找存儲有最新流數(shù)據(jù)的第一目標(biāo)數(shù)據(jù)隊列;
第一讀取子模塊,讀取查找的第一目標(biāo)數(shù)據(jù)隊列。
B21、根據(jù)B20所述的裝置,其中,所述第一查找子模塊包括:
寫入時間提取子單元,用于提取各個數(shù)據(jù)隊列的起始寫入時間;
第一查找子單元,用于查找起始寫入時間距離當(dāng)前時間最近的數(shù)據(jù)隊列為第一目標(biāo)數(shù)據(jù)隊列。
B22、根據(jù)B20所述的裝置,其中,所述第一查找子模塊包括:
寫入線程調(diào)用子單元,用于調(diào)用流數(shù)據(jù)讀取線程訪問流數(shù)據(jù)寫入線程;
隊列標(biāo)識接收子單元,接收流數(shù)據(jù)寫入線程反饋的最新流數(shù)據(jù)的第一目標(biāo)數(shù)據(jù)隊列的隊列標(biāo)識。
B23、根據(jù)B20所述的裝置,其中,所述裝置還包括:
最新隊列更新模塊,用于在將流數(shù)據(jù)寫入某一數(shù)據(jù)隊列后,對設(shè)定位置記錄的最新隊列進(jìn)行更新;
所述第一查找子模塊,具體用于在所述設(shè)定位置查找存儲有最新流數(shù)據(jù)的最新隊列。
B24、根據(jù)B20所述的裝置,其中,所述第一隊列讀取模塊還包括:
畫面組查找子單元,用于在所述讀取查找的第一目標(biāo)數(shù)據(jù)隊列之前,查找所述第一目標(biāo)數(shù)據(jù)隊列中的最新畫面組;
所述第一讀取子模塊,具體用于在所述第一目標(biāo)數(shù)據(jù)隊列中,從所查找的最新畫面組開始讀取流數(shù)據(jù)。
B25、根據(jù)B24所述的裝置,其中,所述裝置還包括:
幀查找子模塊,用于在所述查找所述第一目標(biāo)數(shù)據(jù)隊列中的最新畫面組之后,查找所述第一目標(biāo)數(shù)據(jù)隊列中的最新畫面組的I幀;
所述第一讀取子模塊,具體用于在所述第一目標(biāo)數(shù)據(jù)隊列中,從所查找的最新畫面組的I幀開始讀取流數(shù)據(jù)。
B26、根據(jù)B17所述的裝置,其中,所述裝置還包括:
流數(shù)據(jù)預(yù)估模塊,用于在讀取前一數(shù)據(jù)隊列時,根據(jù)最后讀取的流數(shù)據(jù)預(yù)估下一個讀取的流數(shù)據(jù);
第二隊列讀取模塊,用于判定待讀取的下一數(shù)據(jù)隊列的第一個流數(shù)據(jù)并非預(yù)估的流數(shù)據(jù)時,從所述待讀取的下一數(shù)據(jù)隊列轉(zhuǎn)向讀取除待寫入的下一數(shù)據(jù)隊列之外的第二目標(biāo)數(shù)據(jù)隊列。
B27、根據(jù)B26所述的裝置,其中,所述第二隊列讀取模塊包括:
第二查找子單元,用于查找起始寫入時間距離當(dāng)前時間未超出第二時間閾值的任一第二目標(biāo)數(shù)據(jù)隊列,所述第二時間閾值為除去一個數(shù)據(jù)隊列之外其他隊列的時間長度的總和。
B28、根據(jù)B26所述的裝置,其中,所述第二隊列讀取模塊,具體用于從所述待讀取的下一數(shù)據(jù)隊列轉(zhuǎn)向讀取存儲有最新流數(shù)據(jù)的第二目標(biāo)數(shù)據(jù)隊列。
B29、根據(jù)B17所述的裝置,其中,所述裝置還包括:
流數(shù)據(jù)接收模塊,用于在所述將流數(shù)據(jù)循環(huán)順次寫入由多個數(shù)據(jù)隊列構(gòu)建的存儲區(qū)之前,接收從另一傳輸節(jié)點推送至當(dāng)前傳輸節(jié)點的流數(shù)據(jù);
所述裝置還包括:
讀取請求接收模塊,用于在所述從所述存儲區(qū)讀取流數(shù)據(jù)之前,接收從當(dāng)前傳輸節(jié)點對流數(shù)據(jù)的讀取請求。
B30、根據(jù)B17所述的裝置,其中,所述流數(shù)據(jù)寫入模塊,具體用于由流數(shù)據(jù)寫入線程將流數(shù)據(jù)循環(huán)順次寫入由多個數(shù)據(jù)隊列構(gòu)建的存儲區(qū);
所述預(yù)估模塊包括:
線程讀取子模塊,用于由流數(shù)據(jù)讀取線程從所述存儲區(qū)讀取流數(shù)據(jù)。
B31、根據(jù)B30所述的裝置,其中,所述線程讀取子模塊包括:
標(biāo)識記錄子單元,用于記錄當(dāng)前讀取的數(shù)據(jù)隊列的隊列標(biāo)識和流數(shù)據(jù)的位置標(biāo)識;
推算與讀取子單元,用于推算下一個讀取的流數(shù)據(jù)的位置標(biāo)識和隊列標(biāo)識,并進(jìn)行讀取。
B32、根據(jù)B17所述的裝置,其中,所述預(yù)估模塊包括:
順次讀取子模塊,用于按照數(shù)據(jù)隊列的隊列標(biāo)識順次從各個數(shù)據(jù)隊列讀取流數(shù)據(jù)。