本發(fā)明涉及瀏覽器中視頻播放方法,具體涉及一種瀏覽器無插件視頻直播方法。
背景技術(shù):
在web頁面中進(jìn)行視頻直播,目前主要的解決方案主要有:
在瀏覽器中安裝自定義開發(fā)的activex和npapi插件的方式,通過插件進(jìn)行視頻直播,但該方案存在不同的瀏覽器需要安裝不同的插件,不同操作系統(tǒng)需要不同的插件,32位與64位瀏覽器也存在不同版本的插件,版本多,各個版本不能很好的兼容,需要每個客戶端都設(shè)置瀏覽器安全性,而且在新版本的瀏覽器中逐漸淘汰activex和npapi插件的支持,在移動端中也不支持該插件技術(shù),無法再移動端瀏覽器中使用該技術(shù)進(jìn)行視頻直播。
使用rtmp協(xié)議+pc客戶端瀏覽器中普遍預(yù)裝的flash插件的方式,但該方案因為使用的是rtmp協(xié)議和第三方的flash控件因此需要做自定義擴(kuò)展時相當(dāng)復(fù)雜與困難,同時不支持移動端web瀏覽器進(jìn)行直播。
使用hls協(xié)議的方式,無需安裝第三方插件,通過html5的video標(biāo)簽進(jìn)行播放,但該方案播放延遲通常大于10秒,不能有效降低直播時的延遲。
以上方案都無法做到在web瀏覽器中統(tǒng)一進(jìn)行低延遲的視頻直播,特別是在移動端的web瀏覽器中。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的在于克服現(xiàn)有技術(shù)的不足,提供一種瀏覽器無插件視頻直播方法,用于在跨平臺的多種web瀏覽器中統(tǒng)一、便捷、低延遲的進(jìn)行視頻直播。
本發(fā)明的目的是通過以下技術(shù)方案來實現(xiàn)的:
一種瀏覽器無插件視頻直播方法,其特征在于包括以下步驟:
s01:服務(wù)端獲取視頻編碼流;
s02:服務(wù)端使用websocket傳輸視頻編碼流給web瀏覽器端,web瀏覽器端使用websocket接收視頻編碼流;
s03:web瀏覽器端使用javascript對視頻編碼流進(jìn)行解碼;
s04:瀏覽器運(yùn)用canvas+webgl進(jìn)行實時視頻圖像展示,即視頻播放。
進(jìn)一步的,所述的步驟s01服務(wù)端獲取視頻編碼流包括使用中間件技術(shù)獲取視頻編碼流或從網(wǎng)絡(luò)直接獲取視頻編碼流或通過本地攝像機(jī)直接獲取視頻原始數(shù)據(jù)。
進(jìn)一步的,所述的步驟s01中還包括將獲取的視頻編碼流進(jìn)行解包為標(biāo)準(zhǔn)裸碼流,將標(biāo)準(zhǔn)裸碼流重新打包成視頻編碼流并進(jìn)入步驟s02;
若視頻編碼流是不可解包為標(biāo)準(zhǔn)裸碼流,調(diào)用相應(yīng)碼流解碼器解碼,再編碼為標(biāo)準(zhǔn)裸碼流,將標(biāo)準(zhǔn)裸碼流重新打包成視頻編碼流并進(jìn)入步驟s02。
進(jìn)一步的,所述的將標(biāo)準(zhǔn)裸碼流打包具體操作如下:
使用視頻封裝格式將每一幀的視頻流數(shù)據(jù)和對應(yīng)該幀視頻流數(shù)據(jù)需要攜帶的信息封裝序列化為一個個消息,供后續(xù)進(jìn)行傳輸。
進(jìn)一步的,所述的步驟s02的具體操作如下:
服務(wù)端實現(xiàn)websocket協(xié)議,將視頻編碼流通過websocket協(xié)議傳輸?shù)絯eb瀏覽器端,web瀏覽器端通過javascript支持的websocket對象主動連接服務(wù)端,并實時的接收服務(wù)端傳輸過來的視頻編碼流。
進(jìn)一步的,所述的步驟s03具體操作如下:
在web瀏覽器中通過javascript庫,將視頻編碼流解封裝,獲取到完整的每一幀標(biāo)準(zhǔn)裸碼流;使用emscripten將c語言編寫的標(biāo)準(zhǔn)解碼庫進(jìn)行轉(zhuǎn)換為javascript語言的解碼庫,使得在web瀏覽器中可以使用javascript對標(biāo)準(zhǔn)裸碼流進(jìn)行解碼,使用javascript將解封裝后的標(biāo)準(zhǔn)裸碼流進(jìn)行解碼,獲取到圖像原始數(shù)據(jù)。
進(jìn)一步的,所述的步驟s04具體操作是:web瀏覽器中使用webgl將解碼后的圖像原始數(shù)據(jù)繪制到canvas上,完成實時視頻圖像展示。
進(jìn)一步的,本方法中使用的標(biāo)準(zhǔn)通用標(biāo)記語言是超文本標(biāo)記語言html5標(biāo)準(zhǔn)。。
本發(fā)明的有益效果是:本發(fā)明主要用于解決在瀏覽器中進(jìn)行視頻直播需要安裝瀏覽器插件的問題;本發(fā)明使用標(biāo)準(zhǔn)websocket進(jìn)行視頻數(shù)據(jù)流傳輸,使用javascript進(jìn)行視頻解碼,使用webgl在canvas中進(jìn)行視頻顯示。使用本發(fā)明的技術(shù)方案,在支持websocket、webgl和canvans的web瀏覽器中,無需安裝第三方瀏覽器插件,進(jìn)行視頻直播,無論瀏覽器是32位還是64位,無論操作系統(tǒng)是windows、linux、ios、andriod。
附圖說明
圖1是本發(fā)明的流程圖;
圖2是實施例1的流程圖。
具體實施方式
下面結(jié)合附圖進(jìn)一步詳細(xì)描述本發(fā)明的技術(shù)方案,但本發(fā)明的保護(hù)范圍不局限于以下所述。
如圖1所示,
一種瀏覽器無插件視頻直播方法,包括以下步驟:
s01:服務(wù)端獲取視頻編碼流;
s02:服務(wù)端使用websocket傳輸視頻編碼流給web瀏覽器端,web瀏覽器端使用websocket接收視頻編碼流;
s03:web瀏覽器端使用javascript對視頻編碼流進(jìn)行解碼;
s04:瀏覽器運(yùn)用canvas+webgl進(jìn)行實時視頻圖像展示,即視頻播放。
【實施例1】
如圖2所示:一種瀏覽器無插件視頻直播方法,具體包括以下步驟;
使用中間件技術(shù),將各類視頻源設(shè)備,抽象為統(tǒng)一接口視頻設(shè)備,通過操作統(tǒng)一接口的視頻設(shè)備對象獲取視頻流。對于不同設(shè)備視頻的視頻流,中間件內(nèi)部對其進(jìn)行標(biāo)識。
檢查視頻流標(biāo)識,如果支持直接解復(fù)用,得到標(biāo)準(zhǔn)h264裸碼流,直接進(jìn)行解復(fù)用,如果不支持直接解復(fù)用得到h264裸碼流,則先通過視頻流標(biāo)識使用對應(yīng)解碼器對視頻流進(jìn)行實時解碼,然后再使用標(biāo)準(zhǔn)h264編碼器編碼,得到標(biāo)準(zhǔn)h264裸碼流。
使用bson格式的封裝將每一幀的視頻流數(shù)據(jù)和對應(yīng)該幀視頻流數(shù)據(jù)需要攜帶的信息封裝序列化為一個個消息,供后續(xù)進(jìn)行傳輸。
服務(wù)端實現(xiàn)websocket協(xié)議,將經(jīng)過bson格式序列化的視頻流消息,通過websocket協(xié)議傳輸?shù)絯eb瀏覽器。
web瀏覽器中通過javascript支持的websocket對象主動連接服務(wù)端,并實時的接收服務(wù)端傳輸過來的視頻流消息。
在web瀏覽器中通過javascript的bson庫,將視頻流消息解封裝,獲取到完整的每一幀標(biāo)準(zhǔn)h264裸碼流。
使用emscripten將c語言編寫的h264標(biāo)準(zhǔn)解碼庫進(jìn)行轉(zhuǎn)換為javascript語言的h264解碼庫,使得在web瀏覽器中可以使用javascript對標(biāo)準(zhǔn)h264裸碼流進(jìn)行解碼。使用javascript將解封裝后的標(biāo)準(zhǔn)h264裸視頻數(shù)據(jù)進(jìn)行解碼,獲取到圖像原始數(shù)據(jù)。
web瀏覽器中使用webgl將解碼后的圖像原始數(shù)據(jù)繪制到canvas上,完成實時視頻圖像展示。
服務(wù)端:流媒體服務(wù)器支持websocket協(xié)議,通過websocket協(xié)議接收來自客戶端的視頻流請求,根據(jù)請求查詢對應(yīng)視頻設(shè)備信息,主動獲取視頻設(shè)備視頻流,將設(shè)備視頻流提供流媒體協(xié)議統(tǒng)一轉(zhuǎn)換,將轉(zhuǎn)換后的視頻流通過websocket發(fā)送到web瀏覽器端。
web瀏覽器端:使用websocket向服務(wù)端發(fā)起鏈接,通過websocket接收視頻流,將接收到的視頻流使用javascript的h264解碼器進(jìn)行解碼,解碼后的圖像數(shù)據(jù)使用webgl繪制到canvas上進(jìn)行顯示。
【實施例2】
一種瀏覽器無插件視頻直播方法,具體包括以下步驟;
使用本地攝像機(jī)直接獲取視頻原始數(shù)據(jù)。
使用標(biāo)準(zhǔn)h265編碼器編碼,得到標(biāo)準(zhǔn)h265裸碼流。
使用probuf格式的封裝將每一幀的視頻流數(shù)據(jù)和對應(yīng)該幀視頻流數(shù)據(jù)需要攜帶的信息封裝序列化為一個個消息,供后續(xù)進(jìn)行傳輸。
服務(wù)端實現(xiàn)websocket協(xié)議,將經(jīng)過probuf格式序列化的視頻流消息,通過websocket協(xié)議傳輸?shù)絯eb瀏覽器。
web瀏覽器中通過javascript支持的websocket對象主動連接服務(wù)端,并實時的接收服務(wù)端傳輸過來的視頻流消息。
在web瀏覽器中通過javascript的probuf庫,將視頻流消息解封裝,獲取到完整的每一幀標(biāo)準(zhǔn)h265裸碼流。
使用emscripten將c語言編寫的h265標(biāo)準(zhǔn)解碼庫進(jìn)行轉(zhuǎn)換為javascript語言的h265解碼庫,使得在web瀏覽器中可以使用javascript對標(biāo)準(zhǔn)h265裸碼流進(jìn)行解碼。使用javascript將解封裝后的標(biāo)準(zhǔn)h265裸視頻數(shù)據(jù)進(jìn)行解碼,獲取到圖像原始數(shù)據(jù)。
web瀏覽器中使用webgl將解碼后的圖像原始數(shù)據(jù)繪制到canvas上,完成實時視頻圖像展示。
服務(wù)端:流媒體服務(wù)器支持websocket協(xié)議,通過websocket協(xié)議接收來自客戶端的視頻流請求,根據(jù)請求查詢對應(yīng)視頻設(shè)備信息,主動獲取視頻設(shè)備視頻流,將設(shè)備視頻流提供流媒體協(xié)議統(tǒng)一轉(zhuǎn)換,將轉(zhuǎn)換后的視頻流通過websocket發(fā)送到web瀏覽器端。
web瀏覽器端:使用websocket向服務(wù)端發(fā)起鏈接,通過websocket接收視頻流,將接收到的視頻流使用javascript的h265解碼器進(jìn)行解碼,解碼后的圖像數(shù)據(jù)使用webgl繪制到canvas上進(jìn)行顯示。
值得說明的是,在本發(fā)明中獲取視頻編碼流的技術(shù)手段不局限于中間件技術(shù)和攝像機(jī)直接獲取,亦可通過其他本領(lǐng)域的常規(guī)技術(shù)手段獲取視頻編碼流,其次關(guān)于視頻流的標(biāo)準(zhǔn)編碼格式亦不局限,只要是本行業(yè)內(nèi)通用的視頻編碼格式均可應(yīng)用到本發(fā)明中。
以上所述僅是本發(fā)明的優(yōu)選實施方式,應(yīng)當(dāng)理解本發(fā)明并非局限于本文所披露的形式,不應(yīng)看作是對其他實施例的排除,而可用于各種其他組合、修改和環(huán)境,并能夠在本文所述構(gòu)想范圍內(nèi),通過上述教導(dǎo)或相關(guān)領(lǐng)域的技術(shù)或知識進(jìn)行改動。而本領(lǐng)域人員所進(jìn)行的改動和變化不脫離本發(fā)明的精神和范圍,則都應(yīng)在本發(fā)明所附權(quán)利要求的保護(hù)范圍內(nèi)。