本發(fā)明涉及流媒體技術(shù)領(lǐng)域,具體涉及一種拉流控制方法及裝置、可讀存儲介質(zhì)、流媒體服務(wù)器。
背景技術(shù):
流媒體,指以流的方式在網(wǎng)絡(luò)中傳送音頻、視頻和多媒體文件的媒體形式。相對于下載后觀看的網(wǎng)絡(luò)播放形式,流媒體可以把連續(xù)的音頻和視頻信息壓縮后傳輸至流媒體服務(wù)器上,用戶邊下載邊觀看,而不必等待整個文件下載完畢。
直播內(nèi)容的提供方通過推流技術(shù)將直播內(nèi)容推送至流媒體服務(wù)器,此過程簡稱推流。在觀看直播內(nèi)容時,觀看方發(fā)出觀看請求,將直播內(nèi)容從流媒體服務(wù)器拉取到觀看方的客戶端,此過程簡稱拉流。
現(xiàn)有的流媒體服務(wù)器在啟動時大都采用主從(master–worker)模式,流媒體服務(wù)器在調(diào)用主(master)進(jìn)程拉流時,主進(jìn)程并不知道用戶需要拉的流在哪個進(jìn)程上,由此常常導(dǎo)致用戶所需的流在流媒體服務(wù)器中卻拉取不到的情況。
針對上述問題,目前主要采取以下解決方案:在用戶向流媒體服務(wù)器推流時,流媒體服務(wù)器調(diào)用所有從(worker)進(jìn)程來推送這路流,使得所有從進(jìn)程都存在這路流的數(shù)據(jù)信息。在用戶請求該路流時,流媒體服務(wù)器可以調(diào)用任意從進(jìn)程進(jìn)行拉流。
在上述解決方案中,由于每個從進(jìn)程都存在同一路流的數(shù)據(jù)信息,導(dǎo)致流媒體服務(wù)器的負(fù)荷以及帶寬的增加。
技術(shù)實現(xiàn)要素:
本發(fā)明要解決的問題是如何減少流媒體服務(wù)器的負(fù)荷以及帶寬。
為解決上述問題,本發(fā)明實施例提供了一種拉流控制方法,所述方法包括:當(dāng)接收到獲取直播內(nèi)容的請求時,調(diào)用主進(jìn)程分配第一從進(jìn)程處理所述獲取直播內(nèi)容的請求;調(diào)用所述第一從進(jìn)程獲取推送所請求的流的第二從進(jìn)程;當(dāng)所述第一從進(jìn)程非推送所請求的流的第二從進(jìn)程時,調(diào)用所述第一從進(jìn)程從所述第二從進(jìn)程中回源拉流,并由所述第一從進(jìn)程將所拉取到的流發(fā)送至對應(yīng)的客戶端,其中,所述第一從進(jìn)程及第二從進(jìn)程為所有從進(jìn)程中的任意一個。
可選地,所述方法還包括:當(dāng)所述第一從進(jìn)程是推送所請求的流的第二從進(jìn)程時,調(diào)用所述第一從進(jìn)程將所請求的直播內(nèi)容對應(yīng)的流發(fā)送至對應(yīng)的客戶端。
可選地,所述調(diào)用所述第一從進(jìn)程獲取推送所請求的流的第二從進(jìn)程,包括:調(diào)用所述第一從進(jìn)程從預(yù)先存儲的映射關(guān)系信息中,獲取所請求的流對應(yīng)的第二從進(jìn)程,所述預(yù)先存儲的映射關(guān)系信息為每路流的標(biāo)識信息與推送相應(yīng)流的從進(jìn)程之間的對應(yīng)關(guān)系信息。
可選地,所述預(yù)先存儲的映射關(guān)系信息存儲在共享內(nèi)存中。
可選地,所述流的標(biāo)識信息為所標(biāo)識的流所在數(shù)組的下標(biāo)。
可選地,所述流所在數(shù)組的下標(biāo)包括:所述流的掛載點及流的名稱組成的字符串進(jìn)行哈希運算后的數(shù)值。
可選地,所述從所述第二從進(jìn)程中回源拉流,包括:采用預(yù)設(shè)配置的協(xié)議從所述第二從進(jìn)程中回源拉流。
可選地,所述預(yù)設(shè)配置的協(xié)議包括:tcp協(xié)議或unix協(xié)議。
本發(fā)明實施例還提供了一種拉流控制裝置,所述裝置包括:第一控制單元,適于當(dāng)接收到獲取直播內(nèi)容的請求時,調(diào)用主進(jìn)程分配第一從進(jìn)程處理所述獲取直播內(nèi)容的請求;獲取單元,適于調(diào)用所述第一從進(jìn)程獲取推送所請求的流的第二從進(jìn)程;第二控制單元,適于當(dāng)所述第一從進(jìn)程非推送所請求的流的第二從進(jìn)程時,調(diào)用所述第一從進(jìn)程從所述第二從進(jìn)程中回源拉流,并由所述第一從進(jìn)程將所拉取到的流發(fā)送至對應(yīng)的客戶端,其中,所述第一從進(jìn)程及第二從進(jìn)程為所有從進(jìn)程中的任意一個。
可選地,所述裝置還包括:第三控制單元,適于當(dāng)所述第一從進(jìn)程是推送所請求的流的第二從進(jìn)程時,調(diào)用所述第一從進(jìn)程將所請求的流發(fā)送至對應(yīng)的客戶端。
可選地,所述獲取單元,適于調(diào)用第一從進(jìn)程從預(yù)先存儲的映射關(guān)系信息中,獲取所請求的流對應(yīng)的第二從進(jìn)程,所述預(yù)先存儲的映射關(guān)系信息為每路流的標(biāo)識信息與推送相應(yīng)流的從進(jìn)程之間的對應(yīng)關(guān)系信息。
可選地,所述預(yù)先存儲的映射關(guān)系信息存儲在共享內(nèi)存中。
可選地,所述流的標(biāo)識信息為所標(biāo)識的流所在數(shù)組的下標(biāo)。
可選地,所述流所在數(shù)組的下標(biāo)為對所述流的掛載點及流的名稱組成的字符串進(jìn)行哈希運算后的數(shù)值。
可選地,所述第二控制單元適于采用預(yù)設(shè)配置的協(xié)議從所述第二從進(jìn)程中回源拉流。
可選地,所述預(yù)設(shè)配置的協(xié)議包括:tcp協(xié)議或unix協(xié)議。
本發(fā)明實施例還提供了一種計算機(jī)可讀存儲介質(zhì),其上存儲有計算機(jī)指令,所述計算機(jī)指令運行時執(zhí)行上述任一種所述方法的步驟。
本發(fā)明實施例還提供了一種流媒體服務(wù)器,包括存儲器和處理器,所述存儲器上存儲有能夠在所述處理器上運行的計算機(jī)指令,所述處理器運行所述計算機(jī)指令時執(zhí)行上述任一種所述方法的步驟。
與現(xiàn)有技術(shù)相比,本發(fā)明實施例的技術(shù)方案具有以下優(yōu)點:
采用上述方案,在接收到獲取直播內(nèi)容的請求時,先調(diào)用主進(jìn)程分配第一從進(jìn)程處理所述獲取直播內(nèi)容的請求,再調(diào)用所述第一從進(jìn)程獲取推送所請求的流的第二從進(jìn)程,在主進(jìn)程所分配的第一從進(jìn)程非推送所請求的流的第二從進(jìn)程時,調(diào)用所述第一從進(jìn)程從所述第二從進(jìn)程中回源拉流,并將所拉取到的流發(fā)送至對應(yīng)的客戶端,由此可以使得用戶在每次發(fā)送獲取直播內(nèi)容的請求時,都能夠觀看到所請求的直播內(nèi)容,避免出現(xiàn)用戶所請求的流在流媒體服務(wù)器中卻拉取不到的情況。同時,在用戶推流時,調(diào)用一個從進(jìn)程進(jìn)行處理,而非調(diào)用所有從進(jìn)程進(jìn)行處理,由此可以減少流媒體服務(wù)器的負(fù)荷以及帶寬。
附圖說明
圖1是本發(fā)明實施例中一種流媒體服務(wù)系統(tǒng)的結(jié)構(gòu)示意圖;
圖2是本發(fā)明實施例中一種拉流控制方法的流程圖;
圖3是本發(fā)明實施例中一種拉流控制裝置的結(jié)構(gòu)示意圖。
具體實施方式
目前,針對用戶所需的流在流媒體服務(wù)器中卻拉取不到的情況,常采取的解決方案是:流媒體服務(wù)器中設(shè)置自動推送(auto_push)模塊,在用戶向流媒體服務(wù)器推流時,auto_push模塊會控制主進(jìn)程來調(diào)用所有從進(jìn)程來推送這路流,使得所有從進(jìn)程都存在這路流的數(shù)據(jù)信息。在用戶請求該路流時,流媒體服務(wù)器可以調(diào)用任意從進(jìn)程進(jìn)行拉流。
由于每個從進(jìn)程中都存在同一路流的數(shù)據(jù)信息,會導(dǎo)致流媒體服務(wù)器的負(fù)荷以及帶寬的增加。
針對上述問題,本發(fā)明實施例提供了一種拉流控制方法,在接收到獲取直播內(nèi)容的請求時,先調(diào)用主進(jìn)程分配第一從進(jìn)程處理所述獲取直播內(nèi)容的請求,再調(diào)用所述第一從進(jìn)程獲取推送所請求的流的第二從進(jìn)程,在主進(jìn)程所分配的第一從進(jìn)程非推送所請求的流的第二從進(jìn)程時,調(diào)用所述第一從進(jìn)程從所述第二從進(jìn)程中回源拉流,并將所拉取到的流發(fā)送至對應(yīng)的客戶端,由此可以使得用戶在每次發(fā)送獲取直播內(nèi)容的請求時,都能夠觀看到所請求的直播內(nèi)容,避免出現(xiàn)用戶所請求的流在流媒體服務(wù)器中卻拉取不到的情況。同時,在用戶推流時,調(diào)用一個從進(jìn)程進(jìn)行處理,而非調(diào)用所有從進(jìn)程進(jìn)行處理,由此可以減少流媒體服務(wù)器的負(fù)荷以及帶寬。
為使本發(fā)明的上述目的、特征和優(yōu)點能夠更為明顯易懂,下面結(jié)合附圖對本發(fā)明的具體實施例作詳細(xì)地說明。
首先,為了更加清楚地說明本發(fā)明實施例中提供的拉流控制方法,先對所述拉流控制方法涉及的流媒體服務(wù)系統(tǒng)進(jìn)行詳細(xì)介紹:
參照圖1,所述流媒體服務(wù)系統(tǒng)1可以包括主播端11,流媒體服務(wù)器12以及多個客戶端131~13n。
直播內(nèi)容的提供方通過主播端11將直播內(nèi)容推送至流媒體服務(wù)器12。觀看直播內(nèi)容的用戶可以將流媒體服務(wù)器12上的直播內(nèi)容拉取至所在的客戶端,比如,觀看直播內(nèi)容的用戶可以將流媒體服務(wù)器12上的直播內(nèi)容拉取至客戶端131。
在本發(fā)明的實施例中,所述流媒體服務(wù)器12可以為nginx(enginex)服務(wù)器。并且,所述流媒體服務(wù)器12支持一個主進(jìn)程,每個主進(jìn)程對應(yīng)多個從進(jìn)行。其中,主進(jìn)程負(fù)責(zé)接收和分配任務(wù),從進(jìn)程負(fù)責(zé)處理子任務(wù)。當(dāng)從進(jìn)程將子任務(wù)處理完后,會將結(jié)果返回給主進(jìn)程,由主進(jìn)行歸納和匯總,從而得到最終的處理結(jié)果。
圖2為本發(fā)明實施例提供的一種拉流控制方法。參照圖2,所述方法具體可以包括如下步驟:
步驟21,當(dāng)接收到獲取直播內(nèi)容的請求時,調(diào)用主進(jìn)程分配第一從進(jìn)程處理所述獲取直播內(nèi)容的請求。
在具體實施中,參照圖1,獲取直播內(nèi)容的請求,為用戶通過所在的客戶端向流媒體服務(wù)器12發(fā)送的。比如,用戶可以通過客戶端132向流媒體服務(wù)器12發(fā)送獲取直播內(nèi)容的請求,以獲取所要觀看的直播視頻。所述獲取直播內(nèi)容的請求,可以為觀看直播視頻的請求,或者獲取直播音頻的請求等,具體不作限制。
在接收到獲取直播內(nèi)容的請求時,調(diào)用主進(jìn)程分配第一從進(jìn)程處理用戶所請求的流,其中,第一從進(jìn)程為所有從進(jìn)程中的任意一個。也就是說,主進(jìn)程可以分配任意從進(jìn)程來處理用戶所請求的流,本發(fā)明的實施例中,將處理用戶所請求的流的從進(jìn)程作為第二從進(jìn)程。
比如,流媒體服務(wù)器存在1個主進(jìn)程,以及8個從進(jìn)程。其中,所述8個從進(jìn)程為1號~8號從進(jìn)程。在接收到獲取直播內(nèi)容的請求時,可以調(diào)用該主進(jìn)程分配8個從進(jìn)程中的任意一個從進(jìn)程來處理獲取直播內(nèi)容的請求。
步驟22,調(diào)用所述第一從進(jìn)程獲取推送所請求的流的第二從進(jìn)程。
在本發(fā)明的一實施例中,可以從預(yù)先存儲的映射關(guān)系信息中,獲取用戶所請求的流對應(yīng)的第二從進(jìn)程。其中,所述預(yù)先存儲的映射關(guān)系信息為每路流的標(biāo)識信息與推送相應(yīng)流的從進(jìn)程之間的對應(yīng)關(guān)系信息。也就是說,可以預(yù)先對每路流的標(biāo)識信息與推送相應(yīng)流的從進(jìn)程之間的對應(yīng)關(guān)系信息進(jìn)行記錄并存儲。
在具體實施中,可以采用多種方式設(shè)置每路流的標(biāo)識信息。比如,可以將所標(biāo)識的流所在數(shù)組的下標(biāo)作為所述流的標(biāo)識信息。當(dāng)然,也可以采用其它方式對每路流進(jìn)行標(biāo)識。
在本發(fā)明的一實施例中,可以將所述流的掛載點(appname)及流的名稱(streamname)組成的字符串進(jìn)行哈希運算后的數(shù)值作為所述流所在數(shù)組的下標(biāo),由此可以計算出用戶請求的流在哪個進(jìn)程,然后可以到該進(jìn)程拉流。
在本發(fā)明的一實施例中,為了更快速地獲取推送用戶所請求的流的第二從進(jìn)程,可以將所述預(yù)先存儲的映射關(guān)系信息存儲在共享內(nèi)存中,即從共享內(nèi)存中讀取所述預(yù)先存儲的映射關(guān)系信息并確定第二從進(jìn)程。
接收到獲取直播內(nèi)容的請求時,可以從所述獲取直播內(nèi)容的請求中獲取到用戶所請求的流的標(biāo)識信息,比如,可以從所述獲取直播內(nèi)容的請求中獲取到用戶所請求的流所在數(shù)組的掛載點及流的名稱,并基于獲取到的掛載點及流的名稱進(jìn)行哈希運算,得到用戶所請求的流的標(biāo)識信息,最終基于所得到流的標(biāo)識信息,的從預(yù)先存儲的映射關(guān)系信息中獲取對應(yīng)的第二從進(jìn)程。
在本發(fā)明的另一實施例中,當(dāng)調(diào)用所述第一從進(jìn)程在預(yù)先存儲的映射關(guān)系信息中沒有獲取到用戶所請求的流對應(yīng)的從進(jìn)程時,可以向流媒體服務(wù)器請求該流,并在所述預(yù)先存儲的映射關(guān)系信息中記錄該流的標(biāo)識信息與推送該流的從進(jìn)程之間的對應(yīng)關(guān)系信息。
步驟23,當(dāng)所述第一從進(jìn)程非推送所請求的流的第二從進(jìn)程時,調(diào)用所述第一從進(jìn)程從所述第二從進(jìn)程中回源拉流,并由所述第一從進(jìn)程將所拉取到的流發(fā)送至對應(yīng)的客戶端。
在具體實施中,第一從進(jìn)程可能為推送所述用戶所請求的流的第二從進(jìn)程,也可能非推送所述用戶所請求的流的第二從進(jìn)程。也就是說,第一從進(jìn)程可能與第二從進(jìn)程為同一從進(jìn)程,也可能非同一從進(jìn)程。
比如,當(dāng)?shù)谝粡倪M(jìn)程為8個從進(jìn)程中的3號從進(jìn)程,而第二從進(jìn)程為該8個從進(jìn)程中的4號從進(jìn)程時,所述第一從進(jìn)程與第二從進(jìn)程非同一從進(jìn)程。當(dāng)?shù)谝粡倪M(jìn)程與第二從進(jìn)程均為8個從進(jìn)程中的4號從進(jìn)程時,所述第一從進(jìn)程與第二從進(jìn)程為同一從進(jìn)程。
當(dāng)?shù)谝粡倪M(jìn)程與第二從進(jìn)程為同一從進(jìn)程時,此時,第一從進(jìn)程中保留有用戶所請求的流的數(shù)據(jù)信息,直接調(diào)用所述第一從進(jìn)程將所請求的直播內(nèi)容對應(yīng)的流發(fā)送至對應(yīng)的客戶端,也就是調(diào)用第一從進(jìn)程將所保留的該流的數(shù)據(jù)信息發(fā)送至對應(yīng)的客戶端即可。
當(dāng)?shù)谝粡倪M(jìn)程與第二從進(jìn)程非同一從進(jìn)程時,由于第二從進(jìn)程中保留有用戶所請求的流的數(shù)據(jù)信息,此時可以調(diào)用第一從進(jìn)程從第二從進(jìn)程中回源拉流,也就是調(diào)用第一從進(jìn)程獲取第二從進(jìn)程中保留的該流的數(shù)據(jù)信息,并將所拉取到的流發(fā)送至對應(yīng)的客戶端。
在具體實施中,調(diào)用第一從進(jìn)程從第二從進(jìn)程中回源拉流時,可以按照預(yù)先配置的協(xié)議從所述第二從進(jìn)程中回源拉流,也就是按照預(yù)設(shè)配置的協(xié)議將用戶所請求的流進(jìn)行封裝,已達(dá)到進(jìn)程間回源的目的。比如,可以傳輸控制協(xié)議(transmissioncontrolprotocol,tcp)協(xié)議或unix協(xié)議從所述第二從進(jìn)程中回源拉流。
由上述內(nèi)容可知,本發(fā)明實施例中的拉流控制方法,不僅可以避免出現(xiàn)用戶所需的流在流媒體服務(wù)器中卻拉取不到的情況,而且在用戶推流時,調(diào)用一個從進(jìn)程進(jìn)行處理,而非調(diào)用所有從進(jìn)程進(jìn)行處理,可以有效減少流媒體服務(wù)器的負(fù)荷以及帶寬。
另外,調(diào)用所述第一從進(jìn)程來確定第二從進(jìn)程,并在第一從進(jìn)程非第二從進(jìn)程時,調(diào)用所述第一從進(jìn)程從所述第二從進(jìn)程中回源拉流,相對于完全由主進(jìn)程進(jìn)行調(diào)度,可以減少主進(jìn)程的調(diào)度負(fù)擔(dān),避免主進(jìn)程調(diào)度失誤而導(dǎo)致用戶無法觀看到直播內(nèi)容以及影響主進(jìn)程其它功能的情況。
為了使本領(lǐng)域技術(shù)人員更好地理解和實現(xiàn)本發(fā)明,以下對上述拉流控制方法對應(yīng)的拉流控制裝置、計算機(jī)可讀介質(zhì)及流媒體服務(wù)器進(jìn)行詳細(xì)描述。
參照圖3,本發(fā)明實施例提供了一種拉流控制裝置30,所述裝置30可以包括:第一控制單元31,獲取單元32以及第二控制單元33。其中:
所述第一控制單元31,適于當(dāng)接收到獲取直播內(nèi)容的請求時,調(diào)用主進(jìn)程分配第一從進(jìn)程處理所述獲取直播內(nèi)容的請求;
所述獲取單元32,適于調(diào)用所述第一從進(jìn)程獲取推送所請求的流的第二從進(jìn)程;
所述第二控制單元33,適于當(dāng)所述第一從進(jìn)程非推送所請求的流的第二從進(jìn)程時,調(diào)用所述第一從進(jìn)程從所述第二從進(jìn)程中回源拉流,并由所述第一從進(jìn)程將所拉取到的流發(fā)送至對應(yīng)的客戶端,其中,所述第一從進(jìn)程及第二從進(jìn)程為所有從進(jìn)程中的任意一個。
在本發(fā)明的一實施例中,所述裝置30還可以包括:第三控制單元34,適于當(dāng)所述第一從進(jìn)程是推送所請求的流的第二從進(jìn)程時,調(diào)用所述第一從進(jìn)程將所請求的流發(fā)送至對應(yīng)的客戶端。
在本發(fā)明的一實施例中,所述獲取單元32適于調(diào)用第一從進(jìn)程從預(yù)先存儲的映射關(guān)系信息中,獲取所請求的流對應(yīng)的第二從進(jìn)程,所述預(yù)先存儲的映射關(guān)系信息為每路流的標(biāo)識信息與推送相應(yīng)流的從進(jìn)程之間的對應(yīng)關(guān)系信息。
在本發(fā)明的一實施例中,所述預(yù)先存儲的映射關(guān)系信息可以存儲在共享內(nèi)存中。
在本發(fā)明的一實施例中,所述流的標(biāo)識信息可以為所標(biāo)識的流所在數(shù)組的下標(biāo)。
在本發(fā)明的一實施例中,所述流所在數(shù)組的下標(biāo)為對所述流的掛載點及流的名稱組成的字符串進(jìn)行哈希運算后的數(shù)值。
在本發(fā)明的一實施例中,所述第二控制單元33適于采用預(yù)設(shè)配置的協(xié)議從所述第二從進(jìn)程中回源拉流。
在本發(fā)明的一實施例中,所述預(yù)設(shè)配置的協(xié)議包括:tcp協(xié)議或unix協(xié)議。
本發(fā)明實施例還提供了一種計算機(jī)可讀存儲介質(zhì),其上存儲有計算機(jī)指令,所述計算機(jī)指令運行時執(zhí)行上述實施例中所述拉流控制方法的步驟。
在具體實施中,所述計算機(jī)可讀存儲介質(zhì)可以包括:rom、ram、磁盤或光盤等。
本發(fā)明的實施例還提供了一種流媒體服務(wù)器,所述流媒體服務(wù)器可以包括存儲器和處理器,所述存儲器上存儲有能夠在所述處理器上運行的計算機(jī)指令,所述處理器運行所述計算機(jī)指令時執(zhí)行上述實施例中所述拉流控制方法的步驟。
雖然本發(fā)明披露如上,但本發(fā)明并非限定于此。任何本領(lǐng)域技術(shù)人員,在不脫離本發(fā)明的精神和范圍內(nèi),均可作各種更動與修改,因此本發(fā)明的保護(hù)范圍應(yīng)當(dāng)以權(quán)利要求所限定的范圍為準(zhǔn)。