本發(fā)明涉及流媒體領(lǐng)域,更為具體來(lái)說(shuō),尤其涉及一種流媒體的播放方法。
背景技術(shù):
隨著互聯(lián)網(wǎng)流媒體業(yè)務(wù)需求的不斷增多,流媒體現(xiàn)在已經(jīng)進(jìn)入千家成萬(wàn)戶,用戶對(duì)于流媒體的時(shí)移回看需求也日益增長(zhǎng),現(xiàn)有的流媒體直播、時(shí)移、回看方案已經(jīng)不能滿足用戶的需求。
一方面,現(xiàn)有的時(shí)移方案在查找?guī)矫嬉词侵饚檎也⒁詭瑸閱挝话l(fā)送,要么是逐幀查找并以GOP的為單位發(fā)送,查找效率低下?,F(xiàn)有的存儲(chǔ)方案在收到相關(guān)錄制文件的命令時(shí),就開(kāi)始錄相,錄相的大小是每隔10分鐘(這個(gè)大小可以配置)分割一個(gè)文件,其文件名字可以是任意的?,F(xiàn)有的回看方案在查找要發(fā)送的文件及定位要發(fā)送起始位置方面沒(méi)有一個(gè)良好的解決方案,其定位文件的辦法是以文件的創(chuàng)建時(shí)間時(shí)行查找的,而查找要發(fā)送的位置是對(duì)文件進(jìn)行解析后確定要發(fā)送的位置。
另一方面,根據(jù)網(wǎng)絡(luò)狀況對(duì)多碼流的支持(超清、高清、普清、流暢)遇到了瓶頸,比如:對(duì)hls的直播、回看的支持現(xiàn)在也遇到了瓶頸,現(xiàn)有的hls的解決方案是切片成ts后,通過(guò)傳統(tǒng)的http服務(wù)器去下載文件,ts切片的時(shí)間越短直播時(shí)的實(shí)時(shí)性就越好,但是當(dāng)并發(fā)量上來(lái)后,服務(wù)器的資源消耗是很高的(這里的資源包括文件IO的使用等),現(xiàn)在流媒體行內(nèi)還沒(méi)有找到類似的解決方案。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明針對(duì)傳統(tǒng)流媒體播放方案存在的查找回看文件效率低、服務(wù)器的資源消耗高等問(wèn)題,提供了一種流媒體播放方法,達(dá)到提高查找回看文件效率、降低服務(wù)器資源消耗等技術(shù)目的。
本發(fā)明解決上述技術(shù)問(wèn)題的技術(shù)方案如下:
一種流媒體的播放方法,該方法的步驟包括:
步驟S1,對(duì)播放的數(shù)據(jù)文件進(jìn)行存儲(chǔ)以及查找;
步驟S2,對(duì)所述步驟S1的存儲(chǔ)的文件進(jìn)行目錄創(chuàng)建操作;
步驟S3,將所述步驟S2中的存儲(chǔ)的文件存儲(chǔ)到緩存中;
步驟S4,對(duì)所述步驟S3中的緩存的文件進(jìn)行回看播放。
在上述技術(shù)方案的基礎(chǔ)上,本發(fā)明還可以做如下改進(jìn)。
進(jìn)一步,所述步驟S1中,其步驟包括:
步驟S11,定義循環(huán)數(shù)組來(lái)存放每一組連續(xù)的畫面(GOP),存儲(chǔ)GOP的數(shù)據(jù)結(jié)構(gòu)是由先定義的抽象幀的結(jié)構(gòu)和循環(huán)數(shù)組中元素的結(jié)構(gòu)組成;
步驟S12,把解析完完整的一幀數(shù)據(jù)按以GOP為單位存儲(chǔ)在循環(huán)數(shù)組中;
步驟S13,若是直播請(qǐng)求查找,直接取最新更新的GOP發(fā)送到請(qǐng)求直播數(shù)據(jù)的程序中;若是時(shí)移請(qǐng)求,則要查找時(shí)移的發(fā)送點(diǎn),發(fā)送點(diǎn)是根據(jù)時(shí)移時(shí)間與現(xiàn)在緩存數(shù)組中的最早時(shí)間的做差,然后在循環(huán)數(shù)組中直接定位時(shí)移的發(fā)送點(diǎn)。
采用上述進(jìn)一步方案的有益效果是:節(jié)省了查找時(shí)間,存儲(chǔ)方便,存儲(chǔ)效率提高,節(jié)省存儲(chǔ)空間,將直播及時(shí)移的數(shù)據(jù)緩存在內(nèi)存中,當(dāng)有直播請(qǐng)求時(shí),直接從內(nèi)存中發(fā)送數(shù)據(jù),提高系統(tǒng)性能,較少占用文件的IO。
進(jìn)一步,所述步驟S2中創(chuàng)建目錄操作還包括:創(chuàng)建目錄規(guī)則,主機(jī)名-文件目錄-存儲(chǔ)文件的日期;文件目錄的命名規(guī)則,命名規(guī)則是按照年、月、日、小時(shí)、分鐘、秒共14位,若月日時(shí)分秒不足兩位的在左邊用零補(bǔ)夠,若文件切片存儲(chǔ)時(shí)長(zhǎng)為x,則文件名的命令規(guī)則為x的整數(shù)倍。
采用上述進(jìn)一步方案的有益效果是:方便了查找和管理,保證系統(tǒng)的所有流創(chuàng)建的目錄不會(huì)重復(fù),提高查找效率。
進(jìn)一步,所述步驟S3中還包括切片流程,該切片流程的步驟為:
步驟S31,在程序中讀取磁盤的塊的大小,定義緩存大小為塊的大小的整數(shù)倍;
步驟S32,當(dāng)接收到已經(jīng)解析幀數(shù)據(jù)時(shí),先判斷是否要?jiǎng)?chuàng)建新文件,即判斷是否當(dāng)前幀為關(guān)鍵幀并且?guī)瑪?shù)據(jù)的時(shí)間已經(jīng)大于存儲(chǔ)時(shí)長(zhǎng),若創(chuàng)建,則執(zhí)行步驟S33,若不創(chuàng)建,則執(zhí)行步驟S34;
步驟S33,判斷緩存中的數(shù)據(jù)是否有寫入磁盤中的數(shù)據(jù),若有,則先寫入切片文件中再關(guān)閉舊文件并創(chuàng)建新文件,若沒(méi)有,則直接創(chuàng)建新文件;
步驟S34,判斷緩存區(qū)是否滿,若沒(méi)有空間,則先把緩存內(nèi)容即幀數(shù)據(jù)寫入磁盤,再把幀數(shù)據(jù)復(fù)制到緩存,若有空間,則把緩存內(nèi)容即幀數(shù)據(jù)直接寫進(jìn)緩存區(qū)。
有益效果:在發(fā)送數(shù)量大的情況下,可以很好的利用文件控制模塊,很快的把視頻文件存儲(chǔ)在硬盤上。
進(jìn)一步,所述步驟S3中還包括:切片索引數(shù)據(jù)算法,根據(jù)文件時(shí)長(zhǎng)每秒存儲(chǔ)一個(gè)關(guān)鍵幀索引結(jié)構(gòu),結(jié)構(gòu)中存儲(chǔ)關(guān)鍵幀的播放時(shí)間、在文件中的位置、是否為該秒內(nèi)的關(guān)鍵幀;切片的異常處理,若本存儲(chǔ)服務(wù)器上的切片不完整時(shí),刪除本服務(wù)器上不完整的切片,并向網(wǎng)中其他的相同的節(jié)點(diǎn)發(fā)送查找命令,若其他服務(wù)器上有完整的切片則下載該切片,下載文件采用斷點(diǎn)續(xù)傳的方法,若沒(méi)有,則記錄在異常日志中,并以電郵的形式返給運(yùn)維人員。
采用上述進(jìn)一步方案的有益效果是:保證不同的機(jī)子上的相同的程序所做的切片的大小及名字是一樣的,便于處理由網(wǎng)絡(luò)及其他的因素引起的切片異常。
進(jìn)一步,所述回看播放流程:步驟S41,收到回看的請(qǐng)求,根據(jù)開(kāi)始時(shí)間查找回看的第一個(gè)文件;
步驟S42,判斷是否找到符合回看播放時(shí)間要求的切片文件,若找到,則執(zhí)行步驟S44,否則執(zhí)行步驟S43;
步驟S43,切片文件沒(méi)有找到,返回錯(cuò)誤碼;
步驟S44,發(fā)送切片文件,成功發(fā)送切片文件后執(zhí)行步驟S45,否則執(zhí)行紀(jì)步驟S43;
步驟S45,判斷有沒(méi)有end參數(shù),若有,則執(zhí)行步驟S47,否則,執(zhí)行步驟S46;
步驟S46,先生成下一個(gè)文件名,其文件名是代表時(shí)間的字符串,然后查找下一個(gè)切片文件,執(zhí)行步驟S42;
步驟S47,先生成下一個(gè)文件名,其文件名是代表時(shí)間的字符串,并根據(jù)文件名字代表的時(shí)間判斷是否大于end參數(shù),若大于執(zhí)行步驟S48,否則執(zhí)行步驟S46;
步驟S48,結(jié)束回看流程。
本發(fā)明的有益效果是:在數(shù)據(jù)大量發(fā)送的情況下,可以實(shí)時(shí)的響應(yīng)用戶的需要,另外由于步驟中的查找方法是絕對(duì)路徑直接判斷是否文件存在,存在則為找到,不存在則沒(méi)有找到,這樣大大提高了查找文件的效率。
在上述技術(shù)方案的基礎(chǔ)上,本發(fā)明還可以做如下改進(jìn)。
進(jìn)一步,所述的流媒體的播放方法是基于非多碼率協(xié)議的或基于多碼率協(xié)議的。
進(jìn)一步,基于多碼率協(xié)議的流媒體在所述步驟S12中增加一層hls文件邏輯切片層,解析完完整的一個(gè)邏輯切片后,按照邏輯切片為單位存儲(chǔ)在循環(huán)數(shù)組中,在請(qǐng)求切片文件時(shí),則要查找邏輯切片的位置。
進(jìn)一步,基于多碼率協(xié)議的循環(huán)數(shù)組是虛擬切片的信息,數(shù)組中的大小為切片的個(gè)數(shù),以及增加了m3u8格式文件,其中直播是直接讀取內(nèi)存中的m3u8格式文件,而時(shí)移是先查找邏輯切片,再生成m3u8格式文件。
進(jìn)一步,基于多碼率回看的存儲(chǔ)方式為切片存儲(chǔ)。
進(jìn)一步,所述回看的流程步驟:基于多碼率協(xié)議的回看的流程步驟為:
步驟1,收到請(qǐng)求回看m3u8格式文件的請(qǐng)求,判斷有無(wú)end參數(shù),若有end參數(shù),執(zhí)行步驟2,若沒(méi)有,則給end參數(shù)賦予當(dāng)前的時(shí)間值,然后執(zhí)行步驟2;
步驟2,組成m3u8格式文件,判斷是否生成正確的m3u8格式文件內(nèi)容,若是,則執(zhí)行步驟3,若否,則直接返回;
步驟3,發(fā)送m3u8格式文件后返回。
上述所有的關(guān)于多碼率的步驟和邏輯結(jié)構(gòu)方法都同樣適用于hls、hds和dash。
本發(fā)明的有益效果是:可以提高流媒體流直播、切片存儲(chǔ)、查找切片回看部分的性能有很大的提高,在改善商業(yè)流媒體模塊部分有很高的參考價(jià)值。
本發(fā)明附加的方面的優(yōu)點(diǎn)將在下面的描述中部分給出,部分將從下面的描述中變得明顯,或通過(guò)本發(fā)明實(shí)踐了解到。
附圖說(shuō)明
圖1為本發(fā)明流媒體的播放方法流程圖。
圖2為本發(fā)明所述的切片流程圖。
圖3為本發(fā)明所述流媒體的回看的流程圖。
圖4為本發(fā)明所述的請(qǐng)求m3u8格式文件的具體流程。
具體實(shí)施方式
以下結(jié)合附圖對(duì)本發(fā)明的原理和特征進(jìn)行描述,所舉實(shí)例只用于解釋本發(fā)明,并非用于限定本發(fā)明的范圍。
下面是對(duì)本系統(tǒng)各部分的仔細(xì)分析過(guò)程和步驟詳解。
實(shí)施例1
基于非多碼率協(xié)議的流媒體的直播、時(shí)移
1.對(duì)直播、時(shí)移幀數(shù)據(jù)的存儲(chǔ)方案
由于時(shí)移的數(shù)據(jù)是存在內(nèi)存中的,為了便于查找,先定義一個(gè)長(zhǎng)度為時(shí)移時(shí)長(zhǎng)秒數(shù)的循環(huán)數(shù)組來(lái)存放每一組連續(xù)的畫面(GOP),存儲(chǔ)GOP的數(shù)據(jù)結(jié)構(gòu)由先定義抽像幀的結(jié)構(gòu)和循環(huán)數(shù)組中元素的結(jié)構(gòu)組成。
為了方便快速查找,在解析也就是按照音頻視頻壓縮打包及封裝結(jié)構(gòu)邏輯聯(lián)合進(jìn)行解析完后,按照GOP為單位存儲(chǔ)在循環(huán)數(shù)組中(循環(huán)數(shù)組的大小為時(shí)移時(shí)長(zhǎng)的秒數(shù)),若1秒內(nèi)有多個(gè)IDR幀,則只記錄該秒內(nèi)的第一個(gè)IDR幀,若1秒內(nèi)沒(méi)有IDR幀,則記錄它的上一個(gè)IDR幀結(jié)構(gòu),并以一flag標(biāo)識(shí)這個(gè)結(jié)構(gòu)是重復(fù)上個(gè)GOP。
2.直播、時(shí)移數(shù)據(jù)發(fā)送點(diǎn)的查找方案
如果是直播請(qǐng)求,直接取最新更新的GOP發(fā)送給請(qǐng)求直播數(shù)據(jù)的程序。
如果是時(shí)移請(qǐng)求,則要查找時(shí)移的發(fā)送點(diǎn),發(fā)送點(diǎn)其算法也比較簡(jiǎn)單,其做法是:時(shí)移時(shí)間與現(xiàn)在緩存數(shù)組中的最早時(shí)間的差,在循環(huán)數(shù)組中直接定位的時(shí)移的發(fā)送點(diǎn)。
3.基于非多碼率協(xié)議的流媒體的存儲(chǔ)
創(chuàng)建目錄的規(guī)則是以每個(gè)主機(jī)名(www.test.com)/uri(每個(gè)分割符是一個(gè)目錄)/date(存儲(chǔ)文件創(chuàng)建日期)。使用date的目的是為了方便查找和管理,當(dāng)我們要存儲(chǔ)的文件要保存很長(zhǎng)時(shí)間比如:1個(gè)月,如果沒(méi)有date目錄,同一目錄就會(huì)產(chǎn)生好多文件,不利于查詢和管理。這樣就保證了系統(tǒng)內(nèi)地所有流創(chuàng)建的目錄不會(huì)重復(fù)。
刪除目錄的規(guī)則是在刪除文件時(shí),判斷是否有當(dāng)前目錄是否為空,如果為空則刪除。
文件的命名及管理規(guī)則
如果文件切片存儲(chǔ)的文件時(shí)長(zhǎng)為x,則文件名的命令規(guī)則為x的整數(shù)倍。說(shuō)20160408090000、20160408091000/20160408092000等。
文件的刪除
判定文件刪除的條件是該文件超長(zhǎng)了回看時(shí)長(zhǎng);刪除規(guī)則是每次刪除一個(gè)小時(shí)(這個(gè)是以10分鐘切片時(shí)長(zhǎng)為標(biāo)準(zhǔn)的一個(gè)設(shè)定值)的視頻文件。
注:有一個(gè)專門的線程去存儲(chǔ)管理文件及目錄的刪除工作,以項(xiàng)目中的經(jīng)驗(yàn)就放在主線程中。
文件的查找
索引文件時(shí)可以根據(jù)要查找的時(shí)間點(diǎn)直接進(jìn)行定位,提高了查找效率。比如查找的時(shí)間是2016-04-08 09:53:00時(shí),我們可以查找文件“20160408095000”是否存在。
4.保證系統(tǒng)運(yùn)行的切片數(shù)
說(shuō)明:根據(jù)回看設(shè)置的最大時(shí)間、連接空閑時(shí)間設(shè)置、回看文件的最后修改時(shí)間和回看請(qǐng)求的回看開(kāi)始時(shí)間點(diǎn),系統(tǒng)對(duì)部分超過(guò)一定時(shí)間范圍的回看請(qǐng)求認(rèn)定為非法請(qǐng)求,并進(jìn)行強(qiáng)制關(guān)閉,其條件定義如下:
假設(shè):回看文件最大保留時(shí)間T1,連接最大空閑超時(shí)時(shí)間為T2,回看請(qǐng)求當(dāng)前發(fā)送對(duì)應(yīng)文件的最后修改時(shí)間為T3,回看請(qǐng)求的回看開(kāi)始時(shí)間點(diǎn)為T4,當(dāng)前時(shí)間為T,則系統(tǒng)可以確定切片文件在磁盤上的保留數(shù)量,超過(guò)此數(shù)量時(shí)會(huì)對(duì)舊文件進(jìn)行清理,其條件定義如下:
假設(shè)單個(gè)切片文件時(shí)長(zhǎng)為T5,因?yàn)門3+T1<T的請(qǐng)求會(huì)被認(rèn)定為非法請(qǐng)求,可得需要保留的最大時(shí)間為T5+T1,所以可得需要保留的最大切片數(shù)量為(T5+T1+T5-1)/T5。
注:這里的切片時(shí)長(zhǎng)T5滿足條件為:T5遠(yuǎn)大于系統(tǒng)處理網(wǎng)絡(luò)較慢的客戶端請(qǐng)求所需要的時(shí)間,當(dāng)切片時(shí)長(zhǎng)不滿足需求,可以根據(jù)需要自己定義一個(gè)可以處理完系統(tǒng)中所有網(wǎng)絡(luò)較慢的客戶端請(qǐng)求。
5.切片流程如圖2所示
步驟1,在程序中讀取磁盤的塊的大小,定義緩存大小為塊的大小的整數(shù)倍;步驟2,當(dāng)接收到已經(jīng)解析幀數(shù)據(jù)時(shí),先判斷是否要?jiǎng)?chuàng)建新文件,若是當(dāng)前幀為關(guān)鍵幀并且?guī)瑪?shù)據(jù)的時(shí)間已經(jīng)大于存儲(chǔ)時(shí)長(zhǎng),若創(chuàng)建,則執(zhí)行步驟3,不創(chuàng)建,則執(zhí)行步驟4;步驟3,判斷緩存中的數(shù)據(jù)是否有寫入磁盤中的數(shù)據(jù),若有,則先寫入切片文件中再關(guān)閉舊文件并創(chuàng)建新文件,若沒(méi)有,則直接創(chuàng)建新文件;步驟4,判斷緩存區(qū)是否滿,若沒(méi)有空間,則先把緩存內(nèi)容即幀數(shù)據(jù)寫入磁盤,再把幀數(shù)據(jù)復(fù)制到緩存,若有空間,則把緩存內(nèi)容即幀數(shù)據(jù)直接寫進(jìn)緩存區(qū)。其中,緩存的大小為磁盤塊的大小的整數(shù)倍。
判斷是否要?jiǎng)?chuàng)建新文件的條件是判斷為當(dāng)前幀是否為關(guān)鍵幀并且?guī)瑪?shù)據(jù)的時(shí)間已經(jīng)大于存儲(chǔ)時(shí)長(zhǎng)。
注:這個(gè)切片方法保證不同的機(jī)子上的時(shí)間的程序所做的切片的大小及文件名字是一樣的,便于處理由網(wǎng)絡(luò)及其他因素引起的切片異常情況。
6.索引數(shù)據(jù)的存儲(chǔ)
根據(jù)文件時(shí)長(zhǎng)每秒中存儲(chǔ)一個(gè)關(guān)鍵幀索引結(jié)構(gòu),該結(jié)構(gòu)中存儲(chǔ)的是關(guān)鍵幀的播放時(shí)間、在文件中的位置、是否為該秒內(nèi)的關(guān)鍵幀。具體的存儲(chǔ)方案是:支存儲(chǔ)GOP內(nèi)的IDR幀信息,如果1秒內(nèi)有多個(gè)IDR幀,則只記錄該秒內(nèi)的第一個(gè)IDR幀,如果幀內(nèi)沒(méi)有IDR幀,則記錄它的上一個(gè)IDR幀結(jié)構(gòu),并以flag標(biāo)識(shí)這個(gè)結(jié)構(gòu)是重復(fù)上個(gè)GOP。
索引數(shù)據(jù)的存儲(chǔ)有兩種模式:一種是和音視頻數(shù)據(jù)存儲(chǔ)在一個(gè)文件中,這樣可以減少系統(tǒng)對(duì)文件id的占用;一處是索引數(shù)據(jù)和音頻數(shù)據(jù)存儲(chǔ)在不同的文件中,這樣的做法系統(tǒng)占用的文件id會(huì)多一些,系統(tǒng)要多一些管理。
7.切片的異常處理
網(wǎng)絡(luò)異常時(shí),不能保證文件中的切片都完整,為了解決這個(gè)異常問(wèn)題,本發(fā)明中提供的方法如下:由于文件的存儲(chǔ)方案就能保證不同的機(jī)子對(duì)相同的流生成相同的切片,所以當(dāng)本存儲(chǔ)服務(wù)器上的切片不完整時(shí),刪除本服務(wù)器上不完整的切片,并向網(wǎng)中其他的節(jié)點(diǎn)發(fā)送查找命令,如果其他服務(wù)上有完整的切片則下載該切片就行,由于網(wǎng)絡(luò)的不穩(wěn)定性,下載文件采用斷點(diǎn)續(xù)傳的方法;如果沒(méi)有則記錄一個(gè)異常在日志中,并把這個(gè)問(wèn)題以電子郵件的形式返回給運(yùn)維人員。
8.基于非多碼率協(xié)議的流媒體的回看
根據(jù)請(qǐng)求參數(shù)的不同,此功能的算法分為兩個(gè)部分,一個(gè)是帶結(jié)束時(shí)間的回看功能,一個(gè)是不帶結(jié)束時(shí)間的回看功能。如圖3所示的回看流程圖其流程為步驟1,收到回看的請(qǐng)求,根據(jù)開(kāi)始時(shí)間查找回看的第一個(gè)文件;步驟2,判斷是否找到符合回看播放時(shí)間要求的切片文件,若找到,則執(zhí)行步驟4,否則執(zhí)行步驟3;步驟3,切片文件沒(méi)有找到,返回錯(cuò)誤碼;步驟4,發(fā)送切片文件,成功發(fā)送切片文件后執(zhí)行步驟5,否則執(zhí)行紀(jì)步驟3;步驟5,判斷有沒(méi)有end參數(shù),若有,則執(zhí)行步驟7,否則,執(zhí)行步驟6;步驟6,先生成下一個(gè)文件名,其文件名是代表時(shí)間的字符串,然后查找下一個(gè)切片文件,執(zhí)行步驟2;步驟7,先生成下一個(gè)文件名,其文件名是代表時(shí)間的字符串,并根據(jù)文件名字代表的時(shí)間判斷是否大于end參數(shù),若大于執(zhí)行步驟8,否則執(zhí)行步驟6;步驟8,結(jié)束回看流程。
步驟1和6中查找文件的方法是根據(jù)文件絕對(duì)路徑直接判斷是否文件存在,存在則為找到,不存在則沒(méi)有找到。這樣大大提高了查找文件的效率。實(shí)施例2
基于多碼率的協(xié)議的流媒體的直播、時(shí)移
基于自適應(yīng)碼率協(xié)議的流媒體直播、時(shí)移,現(xiàn)在的解決方案是把切片存儲(chǔ)在磁盤上,并通過(guò)調(diào)整切片時(shí)長(zhǎng)來(lái)提高直播的實(shí)時(shí)性,這個(gè)方案的缺點(diǎn)就是切片時(shí)長(zhǎng)越短,切片文件就越多,造成文件IO的占有率較高,系統(tǒng)性能下降的問(wèn)題。
本發(fā)明中的方法是將直播、時(shí)移的數(shù)據(jù)緩存在內(nèi)存中,當(dāng)有直播請(qǐng)求時(shí),直接從內(nèi)存中發(fā)送數(shù)據(jù),提高系統(tǒng)性能,減少占用文件IO。在發(fā)送數(shù)據(jù)量大的情況下,可以實(shí)時(shí)的響應(yīng)用戶的需求。
1.多碼率直播、時(shí)移切片數(shù)據(jù)的存儲(chǔ)
在基于非多碼率協(xié)議的流媒體的時(shí)移的方案上再增加一層----hls文件邏輯切片層
為了快速查找,在解析完完整的一個(gè)邏輯切片后,按照邏輯切片為單位存儲(chǔ)在循環(huán)數(shù)組中,該循環(huán)數(shù)組中的元素是hls_logic_file_s這個(gè)結(jié)構(gòu)。循環(huán)數(shù)組的大小為配置中的切片個(gè)數(shù)。請(qǐng)求切片文件時(shí),則要查找邏輯切片的位置,其算法是:根據(jù)邏輯文件的文件名字與現(xiàn)在緩存數(shù)組中的最早切片的文件名的時(shí)間差在循環(huán)數(shù)組中直接定位所要的切片;M3u8格式文件緩存在m3u8_file格式文件全局?jǐn)?shù)組中,M3u8格式文件包含兩部分直播和時(shí)移,其中直播和時(shí)移是不同的邏輯,直播可以直接讀取內(nèi)存中的m3u8格式文件;時(shí)移先查找邏輯切片,再生成m3u8格式文件。
2.多碼率回看切片數(shù)據(jù)的存儲(chǔ)
這部分的存儲(chǔ)與基于非多碼率協(xié)議的流媒體的存儲(chǔ)部分相同,采用大切片存儲(chǔ)。
請(qǐng)求切片的過(guò)程是基于http協(xié)議的而下載過(guò)程,具體可以參考相關(guān)http的下載文件的相關(guān)知識(shí)。這里的算法主要是請(qǐng)求m3u8格式文件的過(guò)程,如圖4所述如下:
步驟1,收到請(qǐng)求回看m3u8格式文件的請(qǐng)求,判斷有無(wú)end參數(shù),若有,則end參數(shù),執(zhí)行步驟2;若沒(méi)有,則給end參數(shù)賦予當(dāng)前的時(shí)間值,然后執(zhí)行步驟2;步驟2,組成m3u8格式文件,判斷是否生成正確的m3u8格式文件內(nèi)容,若是,則執(zhí)行步驟3,若否,則直接返回;步驟3,發(fā)送m3u8格式文件后返回。
其中查找過(guò)程同“基于非多碼率協(xié)議的流媒體的回看”部分,過(guò)程為:步驟1.根據(jù)時(shí)間查找回看的第一個(gè)文件;步驟2.判斷是否查找到符合時(shí)間要求的切片文件,如果找到執(zhí)行步驟4,否則執(zhí)行步驟3;步驟3.切片文件沒(méi)有找到,返回錯(cuò)誤碼;步驟4.組成m3u8格式文件,生成m3u8格式文件成功,成功發(fā)送后執(zhí)行步驟6;否則執(zhí)行步驟3;步驟5.先生成下一個(gè)文件名,文件名是代表時(shí)間的字符串,查找下一個(gè)切片文件,執(zhí)行步驟2;步驟6.先生成下一個(gè)文件名,文件名是代表時(shí)間的字符串,并根據(jù)文件名字代表的時(shí)間判斷是否大于end參數(shù),如果大于執(zhí)行步驟7,否則執(zhí)行步驟5;步驟7.流程結(jié)束。
3.異常處理與非多碼率異常處理的過(guò)程相同。
本發(fā)明的有益效果:可以提高流媒體直播、切片存儲(chǔ)、查找切片回看部分的性能有了很大的提高,在改善商業(yè)流媒體模塊部分有很高的參考價(jià)值。
在本說(shuō)明書中,對(duì)上述術(shù)語(yǔ)的示意性表述不必須針對(duì)的是相同的實(shí)施例或示例。而且,描述的具體特征、方法、裝置或者特點(diǎn)可以在任一個(gè)或多個(gè)實(shí)施例或示例中以合適的方式結(jié)合。此外,在不相互矛盾的情況下,本領(lǐng)域的技術(shù)人員可以將本說(shuō)明書中描述的不同實(shí)施例或示例以及不同實(shí)施例或示例的特征進(jìn)行結(jié)合和組合。
以上所述僅為本發(fā)明的較佳實(shí)施例,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。