方式】
[0046]為使本申請的上述目的、特征和優(yōu)點能夠更加明顯易懂,下面結(jié)合附圖和【具體實施方式】對本申請作進一步詳細(xì)的說明。
[0047]參照圖1,其示出了本申請實施例所述一種視聯(lián)網(wǎng)中網(wǎng)絡(luò)視頻流的播放方法流程圖。
[0048]步驟101、在視頻發(fā)送端預(yù)先設(shè)置針對視頻流的編碼參數(shù),所述視頻流中包括關(guān)鍵幀和多個差別幀。
[0049]本發(fā)明實施例可以解決ES流通過視聯(lián)網(wǎng)傳輸并播放時出現(xiàn)的卡頓的問題,也可以用于其它由于幀之間大小不一致導(dǎo)致的播放卡頓的問題。
[0050]針對ES流,I幀表示關(guān)鍵幀,可以理解為這一幀畫面的完整保留,由于其包含完整畫面,解碼時只需要本幀數(shù)據(jù)就可以完成,P幀也就是差別幀,表示的是這一幀跟之前的一個關(guān)鍵幀(或P幀)的差別,解碼時需要用之前緩存的畫面疊加上本幀定義的差別,生成最終畫面,P幀沒有完整畫面數(shù)據(jù),只有與前一幀的畫面差別的數(shù)據(jù)。
[0051]通過編碼參數(shù)可以設(shè)定一幀圖像壓縮后的最大尺寸,這樣I幀圖像的尺寸就不會過大。只需要在編碼器初始化時設(shè)置一次即可。
[0052]步驟102、所述視頻發(fā)送端按照所述編碼參數(shù)對各幀視頻流進行編碼,編碼后,所述關(guān)鍵幀和所述差別幀的大小差值小于第一預(yù)設(shè)值,各個差別幀的大小差值小于第二預(yù)設(shè)值。
[0053]視頻發(fā)送端按照編碼參數(shù)對視頻流進行編碼,目的在于使得每個幀大小盡量均勻,即各個P幀之間,以及I幀和P幀的大小能盡量保持一致。
[0054]在這是編碼參數(shù)時,可以根據(jù)具體的應(yīng)用和需要來設(shè)置,由于在具體的實現(xiàn)中并無法使得各個幀之間大小完全相同,可以盡量使得各個幀大小比較接近,差值在可接受的范圍之內(nèi),本發(fā)明實施例中,可以設(shè)置所述關(guān)鍵幀和所述差別幀的大小差值小于第一預(yù)設(shè)值,各個差別幀的大小差值小于第二預(yù)設(shè)值。
[0055]步驟103、所述視頻發(fā)送端通過視聯(lián)網(wǎng)向視頻接收端發(fā)送所述視頻流,在發(fā)送時控制每間隔第三預(yù)設(shè)值的時間段發(fā)送一幀視頻流,并在第四預(yù)設(shè)值的時間段之內(nèi)將一幀視頻流發(fā)送出去。
[0056]本發(fā)明實施例中,視頻發(fā)送端采用勻幀勻包的方式發(fā)送各幀視頻流。
[0057]如果發(fā)送端能夠均勻發(fā)送每幀數(shù)據(jù),比如原始視頻幀率是30fps,那么每隔33ms就發(fā)送一幀數(shù)據(jù),那么接收端就會均勻的收到圖像數(shù)據(jù),然后就可以直接解碼顯示。這樣就保證了發(fā)送端和接收端同步,視頻播放就很流暢,這就是所謂勻幀。勻包是將一幀數(shù)據(jù)均勻的在單位時間內(nèi),即一幀時間內(nèi)發(fā)送出去。這樣網(wǎng)絡(luò)流量會比較穩(wěn)定,不會出現(xiàn)網(wǎng)絡(luò)負(fù)載瞬時峰值過大的現(xiàn)象。
[0058]具體而言,通過在發(fā)送各幀視頻流時,控制發(fā)送的時間間隔為第三預(yù)設(shè)值,即控制每間隔第三預(yù)設(shè)值的時間段發(fā)送一幀視頻流,來實現(xiàn)勻幀,通過控制各幀視頻流均在相同的時間內(nèi)發(fā)送完畢,即在第四預(yù)設(shè)值的時間段之內(nèi)將一幀視頻流發(fā)送出去,來實現(xiàn)勻包。
[0059]在現(xiàn)實情況中,由于網(wǎng)絡(luò)傳輸帶寬有限,而且I幀通常比P幀大很多倍,無法在一幀的時間內(nèi)發(fā)送完畢。因此,可以在帶寬允許的條件下盡可能快的發(fā)送一幀數(shù)據(jù),如果一個I幀過大,花費了好幾個時間單元,那么在接下來的時間里就需要盡快發(fā)送P幀數(shù)據(jù),直到恢復(fù)到能夠按幀等間隔發(fā)送的正常狀態(tài)。
[0060]本發(fā)明實施例中,視頻發(fā)送端和視頻接收端之間采用視聯(lián)網(wǎng)進行連接并傳輸視頻流數(shù)據(jù),具體而言,視頻發(fā)送端連入視聯(lián)網(wǎng),并通過視聯(lián)網(wǎng)與視頻接收端建立連接,視頻接收端可以在視頻發(fā)送端連入之前或之后連入視聯(lián)網(wǎng)。
[0061]在具體的實現(xiàn)中,視頻接收端和視頻發(fā)送端均可以為機頂盒,作為視頻接收端的機頂盒為機頂盒客戶端(Client端),作為視頻發(fā)送端的機頂盒為服務(wù)器端(server端),視頻接收端和視頻發(fā)送端也可以為其他可以連入視聯(lián)網(wǎng)的設(shè)備。
[0062]本發(fā)明實施例中,優(yōu)選地,所述視頻發(fā)送端通過視聯(lián)網(wǎng)向視頻接收端發(fā)送所述視頻流的步驟包括:
[0063]子步驟S11、所述視頻發(fā)送端連入視聯(lián)網(wǎng),并通過視聯(lián)網(wǎng)與視頻接收端建立連接;
[0064]子步驟S12、所述視頻發(fā)送端生成包含套接字信息,并按照所述套接字信息經(jīng)視聯(lián)網(wǎng)向所述視頻接收端發(fā)送所述視頻流,所述套接字信息標(biāo)識所述視頻流在視聯(lián)網(wǎng)的數(shù)據(jù)鏈路層進行傳輸?shù)膫鬏斅窂健?br>[0065]視頻接收端和視頻發(fā)送端通過視聯(lián)網(wǎng)建立連接后,視頻接收端向視頻發(fā)送端發(fā)送視頻流。應(yīng)用場景之一的機頂盒的相關(guān)環(huán)境是Linux環(huán)境,在Iinux環(huán)境中要從鏈路層(MAC)直接收發(fā)數(shù)據(jù)幀,本發(fā)明實施例中,視頻流經(jīng)視聯(lián)網(wǎng)傳輸,與傳統(tǒng)的以太網(wǎng)的傳輸方式不同之處在于:經(jīng)以太網(wǎng)傳輸視頻流時,視頻流傳輸在ISO的第三層即應(yīng)用層(網(wǎng)絡(luò)層),通過IP地址對視頻接收端和視頻發(fā)送端進行識別,視頻流傳輸時攜帶視頻接收端和視頻發(fā)送端的IP地址;經(jīng)視聯(lián)網(wǎng)傳輸數(shù)據(jù)時,視頻流傳輸在ISO的第二層即鏈路層,通過鏈路層信息對視頻流的視頻接收端和視頻發(fā)送端進行識別,視頻流傳輸時攜帶鏈路層信息。
[0066]在Iinux環(huán)境中可以通過Iibpcap與Iibnet兩個動態(tài)庫來分別完成收與發(fā)的工作。雖然它已被廣泛使用,但在要求進行跨平臺移植的軟件中使用仍然有很多弊端;又因為視聯(lián)網(wǎng)的視頻都是通過二層(鏈路層)來進行收發(fā)數(shù)據(jù)的,同時為了減少flash的使用空間。本發(fā)明實施例使用了一種更為直接地、無須安裝其它庫的從鏈路層收發(fā)數(shù)據(jù)幀的方式,即通過定義鏈路層的套接字來完成,即packet套接字,packet套接字用于在MAC層上收發(fā)原始數(shù)據(jù)幀,這樣就允許在用戶空間完成鏈路層上各個層次的實現(xiàn),無論是進行開發(fā)還是測試工作都帶來了極大的便利性。
[0067]本發(fā)明實施例中采用套接字信息作為鏈路層的信息。視頻接收端在生成視頻流時在視頻流包中添加套接字信息,向第視頻發(fā)送端發(fā)送視頻流時,按照套接字信息中標(biāo)識的視聯(lián)網(wǎng)數(shù)據(jù)鏈路層傳輸路徑進行傳輸,套接字信息可以包括數(shù)據(jù)鏈路層的物理層的協(xié)議號、接口索引號、報頭類型、分組類型、物理層地址和物理層地址長度中的一種或多種。
[0068]步驟104、視頻接收端接收所述視頻流,針對各幀視頻流添加時間戳信息。
[0069]【背景技術(shù)】中,視頻流傳輸時并沒有攜帶時間戳信息,本發(fā)明實施例中,針對各幀視頻流添加時間戳信息。以用于計算幀率信息。
[0070]步驟105、根據(jù)所述時間戳信息計算當(dāng)前的幀率信息,并根據(jù)所述幀率信息等時間間隔地對接收到的各幀視頻流進行解碼,并對解碼后的視頻流進行播放。
[0071]接收端收到第一幀數(shù)據(jù)時需要記錄當(dāng)時的時間戳信息,并根據(jù)時間戳信息統(tǒng)計幀率信息,本發(fā)明實施例中,所述步驟105可以包括:
[0072]子步驟S21、根據(jù)當(dāng)前接收到的一幀視頻流攜帶的時間戳信息和接收到的第一幀視頻流的的時間戳信息計算所述幀率信息;
[0073]子步驟S22、根據(jù)所述幀率信息確定兩幀視頻流之間的平均的時間間隔,并休眠一個時間間隔后向解碼器發(fā)送下一幀視頻流;
[0074]子步驟S23、所述解碼器對接收到的一幀視頻流進行解碼。
[0075]在接收到一定數(shù)量的幀后可以根據(jù)當(dāng)前時間和第一幀的時間差計算出幀率信息,即根據(jù)當(dāng)前接收到的一幀視頻流攜帶的時間戳信息和接收到的第一幀視頻流的的時間戳