動矢量從I幀中找出P幀“某點(diǎn)”的預(yù)測值并與差值相加以得到P幀“某點(diǎn)”樣值,從而可得到完整的P幀。P幀是I幀后面相隔I?2幀的編碼幀,P幀采用運(yùn)動補(bǔ)償?shù)姆椒▊魉退c前面的I或P幀的差值及運(yùn)動矢量(預(yù)測誤差),P幀解碼時(shí)必須將I幀中的預(yù)測值與預(yù)測誤差求和后才能重構(gòu)完整的P幀圖像,P幀屬于前向預(yù)測的幀間編碼。它只參考前面最靠近它的I幀或P幀,幀可以是其后面P幀的參考幀,也可以是其前后的B幀的參考幀,由于P幀是參考幀,它可能造成解碼錯誤的擴(kuò)散,由于是差值傳送,P幀的壓縮比較高。
[0036]需要說明的是,實(shí)時(shí)網(wǎng)絡(luò)傳輸幾乎沒有B幀,即僅采用P幀和I幀的方式來編碼,這是由于B幀會造成網(wǎng)絡(luò)數(shù)據(jù)的等待,因此在實(shí)際應(yīng)用中,實(shí)時(shí)網(wǎng)絡(luò)傳輸幾乎沒有B幀。
[0037]實(shí)時(shí)流媒體傳輸采用RTP(Real_time Transport Protocol,實(shí)時(shí)傳輸協(xié)議)/RTCP (Real-time Streaming Protocol,實(shí)時(shí)流協(xié)議)協(xié)議,RTP負(fù)責(zé)實(shí)時(shí)流媒體音視頻數(shù)據(jù)的發(fā)送,RTCP負(fù)責(zé)實(shí)時(shí)流媒體控制信息的傳送。在RTP傳輸過程中,RTP包頭的第2個32Bit即為RTP包的時(shí)間戳(Time Stamp),時(shí)間戳占32位。時(shí)間戳反映了 RTP分組中的數(shù)據(jù)的第一個字節(jié)的采樣時(shí)刻。在一次會話開始時(shí)的時(shí)間戳初值也是隨機(jī)選擇的。即使是沒有信號發(fā)送時(shí),時(shí)間戳的數(shù)值也要隨時(shí)間不斷的增加。接收端使用時(shí)間戳可準(zhǔn)確知道應(yīng)當(dāng)在什么時(shí)間還原哪一個數(shù)據(jù)塊,從而消除傳輸中的抖動。時(shí)間戳還可用來使視頻應(yīng)用中聲音和圖像同步。在RTP協(xié)議中并沒有規(guī)定時(shí)間戳的粒度,這取決于有效載荷的類型。因此RTP的時(shí)間戳又稱為媒體時(shí)間戳,以強(qiáng)調(diào)這種時(shí)間戳的粒度取決于信號的類型。時(shí)間戳就是一個值,用來反映某個數(shù)據(jù)塊的產(chǎn)生(采集)時(shí)間點(diǎn)的,后采集的數(shù)據(jù)塊的時(shí)間戳肯定是大于先采集的數(shù)據(jù)塊的。有了這樣一個時(shí)間戳,就可以標(biāo)記數(shù)據(jù)塊的先后順序。在實(shí)時(shí)流傳輸中,數(shù)據(jù)采集后立刻傳遞到RTP模塊進(jìn)行發(fā)送,那么,其實(shí),數(shù)據(jù)塊的采集時(shí)間戳就直接作為RTP包的時(shí)間戳。時(shí)間戳的單位采用的是采樣頻率的倒數(shù),例如采樣頻率為8000Hz時(shí),時(shí)間戳的單位為1/8000,時(shí)間戳增量是指兩個RTP包之間的時(shí)間間隔。
[0038]需要說明的是,本發(fā)明實(shí)施例僅以目前主流的流媒體傳輸方案為例進(jìn)行說明,在實(shí)際應(yīng)用時(shí),本發(fā)明實(shí)施例提供的流媒體數(shù)據(jù)傳輸方法及裝置不限于采用H.264標(biāo)準(zhǔn)編碼的視頻,也不限于采用RTP協(xié)議傳輸?shù)囊曨l。
[0039]圖2示出了本發(fā)明實(shí)施例提供的一種發(fā)送端的結(jié)構(gòu)示意圖,如圖2所示,在本發(fā)明實(shí)施例提供的流媒體數(shù)據(jù)傳輸方案中,發(fā)送端可以至少包括:編碼模塊21和網(wǎng)絡(luò)發(fā)送模塊22。編碼模塊21和網(wǎng)絡(luò)發(fā)送模塊22分別根據(jù)預(yù)先設(shè)置的線程優(yōu)先級由發(fā)送端操作系統(tǒng)進(jìn)行調(diào)度;其中,編碼模塊21用于對視頻進(jìn)行編碼,網(wǎng)絡(luò)發(fā)送模塊22用于周期性的與編碼模塊21進(jìn)行數(shù)據(jù)交互并獲取流媒體數(shù)據(jù)后并通過網(wǎng)絡(luò)進(jìn)行傳輸。
[0040]圖3示出了本發(fā)明實(shí)施例提供的一種發(fā)送端向接收端傳輸流媒體數(shù)據(jù)的流程示意圖,如圖3所示,該流程可以包括:
[0041]步驟31:發(fā)送端的網(wǎng)絡(luò)發(fā)送模塊從編碼模塊中拷貝編碼后的音視頻流媒體數(shù)據(jù)。
[0042]具體實(shí)現(xiàn)時(shí),網(wǎng)絡(luò)發(fā)送模塊可以通過內(nèi)存拷貝的方法從底層硬件編碼模塊獲得流媒體數(shù)據(jù)。需要說明的是,本發(fā)明實(shí)施例僅以通過內(nèi)存拷貝的方式進(jìn)行舉例,在實(shí)際應(yīng)用中,發(fā)送端可以通過多種方式獲取流媒體數(shù)據(jù)。
[0043]步驟32:網(wǎng)絡(luò)發(fā)送模塊判斷拷貝得到的流媒體數(shù)據(jù)的類型,若是音頻流數(shù)據(jù),則執(zhí)行步驟33 ;若是視頻流數(shù)據(jù),則執(zhí)行步驟34。
[0044]具體實(shí)現(xiàn)時(shí),由于每個實(shí)時(shí)流媒體數(shù)據(jù)中分為不同的流,有視頻流和音頻流,每個流有不同的標(biāo)識信息(如,特征代碼),網(wǎng)絡(luò)發(fā)送模塊根據(jù)不同的流特征代碼判斷拷貝得到的流媒體數(shù)據(jù)是音頻流數(shù)據(jù)還是視頻流數(shù)據(jù)。
[0045]步驟33:在待傳輸流媒體數(shù)據(jù)的類型為音頻流數(shù)據(jù)時(shí),將音頻流數(shù)據(jù)的全部編碼幀發(fā)送給接收端,以指示接收端根據(jù)接收到的編碼幀進(jìn)行解碼并播放。
[0046]具體實(shí)現(xiàn)時(shí),由于人耳對音頻數(shù)據(jù)的丟失比較敏感,因此在本發(fā)明實(shí)施例中完整發(fā)送所有的音頻流數(shù)據(jù)的每一個編碼幀,不對其進(jìn)行處理;從而保證音頻數(shù)據(jù)對延時(shí)的要求。
[0047]需要說明的是,在執(zhí)行步驟33之后,發(fā)送端結(jié)束音頻流數(shù)據(jù)傳輸流程。
[0048]步驟34:在待傳輸流媒體數(shù)據(jù)的類型為視頻流數(shù)據(jù)時(shí),網(wǎng)絡(luò)發(fā)送模塊對視頻流媒體數(shù)據(jù)進(jìn)行內(nèi)容重要性分析,根據(jù)內(nèi)容重要性分析結(jié)果,確定出重要編碼幀。
[0049]具體實(shí)現(xiàn)時(shí),由于人眼的視覺暫留效應(yīng),人眼在觀察景物時(shí),光信號傳入人大腦神經(jīng),需經(jīng)過一段短暫的時(shí)間,光的作用結(jié)束后,視覺形象并不立即消失,這種殘留的視覺稱“后像”,視覺的這一現(xiàn)象則被稱為“視覺暫留”,是光對視網(wǎng)膜所產(chǎn)生的視覺在光停止作用后,仍保留一段時(shí)間的現(xiàn)象。因此,根據(jù)人眼的這一特性,在24FPS(Frames Per Second,每秒傳輸幀數(shù))幀率或者更高的幀率播放流媒體的過程中,在一秒鐘內(nèi)丟失若干幀人的大腦是無法察覺到的。
[0050]在本發(fā)明實(shí)施例中,網(wǎng)絡(luò)發(fā)送模塊在判斷接收到的流媒體數(shù)據(jù)為視頻流數(shù)據(jù)后,進(jìn)行視頻流數(shù)據(jù)的內(nèi)容重要性的分析。具體分析過程可以如下:
[0051]根據(jù)視頻壓縮編碼的特性,即視頻流數(shù)據(jù)被編碼成連續(xù)的、且由I幀引導(dǎo)的P幀跟隨的數(shù)據(jù)流。由于I幀和P幀的特性,即I幀包含了其所編碼視頻幀所有的圖像數(shù)據(jù),即幀內(nèi)編碼。而P幀為以I幀為參考幀的視頻數(shù)據(jù),只包括兩個不同幀之間不同的部分。因此P幀的丟失不會對視頻回放過程中產(chǎn)生人眼可以察覺的現(xiàn)象。
[0052]網(wǎng)絡(luò)發(fā)送模塊根據(jù)當(dāng)前無線網(wǎng)絡(luò)發(fā)送的狀態(tài)或當(dāng)前網(wǎng)絡(luò)時(shí)延狀態(tài)(例如,根據(jù)網(wǎng)絡(luò)的阻塞情況,或根據(jù)接收端返回的實(shí)時(shí)流媒體數(shù)據(jù)丟包的數(shù)量)進(jìn)行實(shí)時(shí)流媒體數(shù)據(jù)的發(fā)送。當(dāng)網(wǎng)絡(luò)產(chǎn)生擁塞時(shí),網(wǎng)絡(luò)發(fā)送模塊通過不發(fā)送圖像序列中最后若干個P幀的方式來減輕網(wǎng)絡(luò)數(shù)據(jù)發(fā)送的負(fù)擔(dān)。這是由于無線網(wǎng)絡(luò)中數(shù)據(jù)發(fā)送的失敗,或者當(dāng)編碼器編碼所產(chǎn)生的時(shí)延比較大時(shí),編碼的實(shí)時(shí)流媒體數(shù)據(jù)被大量的緩存在發(fā)送端的緩沖區(qū)中,這些都造成了端到端的延時(shí)??梢?,本發(fā)明實(shí)施例將圖像序列中的I幀確定為優(yōu)先發(fā)送的重要編碼幀;并將圖像序列中的所有的P幀中的部分P幀確定為優(yōu)先發(fā)送的重要編碼幀,這部分P幀即為該圖像序列中的最后幾個P幀。這樣,減少了發(fā)送端緩存區(qū)中緩存的待發(fā)送幀的數(shù)量,從而減輕了網(wǎng)絡(luò)數(shù)據(jù)發(fā)送負(fù)擔(dān),進(jìn)而降低了網(wǎng)絡(luò)發(fā)送時(shí)延。
[0053]步驟35:網(wǎng)絡(luò)發(fā)送模塊對視頻流媒體數(shù)據(jù)進(jìn)行時(shí)間重要性分析,根據(jù)時(shí)間重要性分析結(jié)果,確定出重要編碼幀。
[0054]具體實(shí)現(xiàn)時(shí),在視頻流數(shù)據(jù)經(jīng)過內(nèi)容重要性分析后,在發(fā)送端將待傳輸重要編碼幀發(fā)送至接收端之前,如果當(dāng)前實(shí)時(shí)流媒體的數(shù)據(jù)量或者端到端時(shí)延仍未達(dá)到要求,網(wǎng)絡(luò)發(fā)送模塊進(jìn)一步進(jìn)行視頻流數(shù)據(jù)的時(shí)間重要性分析。具體分析過程可以如下:
[0055]本發(fā)明實(shí)施例中的發(fā)送端所在的平臺能夠?qū)崟r(shí)獲取到當(dāng)前時(shí)間,其時(shí)間精度可以精確到納秒。由于流媒體數(shù)據(jù)的數(shù)據(jù)包中存在打包封裝時(shí)的時(shí)間戳,因此,當(dāng)流媒體數(shù)據(jù)的數(shù)據(jù)包因?yàn)榫W(wǎng)絡(luò)阻塞發(fā)送不出去的時(shí)候,緩存在緩沖區(qū)的流媒體數(shù)據(jù)中視頻流的時(shí)間戳和當(dāng)前時(shí)間會有很大的差值,也就是說,待發(fā)送的數(shù)據(jù)已經(jīng)不具有實(shí)時(shí)性,然而,隨著緩存區(qū)中緩存隊(duì)列的增多,待發(fā)送的流媒體數(shù)據(jù)的時(shí)延長度會越來越大,最終導(dǎo)致整個圖像序列的丟失。為了阻止上述時(shí)延現(xiàn)象的加劇,網(wǎng)絡(luò)發(fā)送模塊會根據(jù)流媒體數(shù)據(jù)包中的時(shí)間重要程度以一個圖像序列為單位進(jìn)行分析。也就是說,網(wǎng)絡(luò)發(fā)送模塊僅對該圖像序列中的P幀進(jìn)行時(shí)間重要性分析。首先,根據(jù)時(shí)間戳確定P幀的采樣時(shí)間;然后,將該P(yáng)幀的采樣時(shí)間與當(dāng)前時(shí)間的差值作為該P(yáng)幀的采樣時(shí)間差;進(jìn)一步的,判斷采樣時(shí)間差是否小于當(dāng)前網(wǎng)絡(luò)時(shí)延,若是,則將該P(yáng)幀確定為優(yōu)先發(fā)送的重要編碼幀,即認(rèn)為該P(yáng)幀符合當(dāng)前網(wǎng)絡(luò)傳輸時(shí)延要求,該P(yáng)幀的時(shí)間重要性較大;若采樣時(shí)間差大于當(dāng)前網(wǎng)絡(luò)時(shí)延,則認(rèn)為如果將該P(yáng)幀作為待傳輸編碼幀加入到緩存區(qū)中的緩存隊(duì)列后,會嚴(yán)重影響到該視頻流媒體的傳輸效率,并且,由于該P(yáng)幀與當(dāng)前時(shí)間的差值越大,意味著該P(yáng)幀中包含的與屬于同一圖像序列的I幀之間的差異度越細(xì)微,以至于可以忽略不計(jì),此時(shí)可以認(rèn)為該P(yáng)幀的時(shí)間重要性較小。因此,網(wǎng)絡(luò)發(fā)送模塊首先將時(shí)間重要性較小的圖像組的數(shù)據(jù)進(jìn)行剔除,然后優(yōu)先發(fā)送時(shí)間重要性較大的數(shù)據(jù),這樣,減少了發(fā)送端緩存區(qū)中緩存的待發(fā)送幀的數(shù)量,從而減輕了網(wǎng)絡(luò)數(shù)據(jù)發(fā)送負(fù)擔(dān),進(jìn)而降低了網(wǎng)絡(luò)發(fā)送時(shí)延。
[0056]步驟36:發(fā)送端將確定出的全部重要編碼幀發(fā)送至接收端,以指示接收端根據(jù)接收到的重要編碼幀進(jìn)行解碼并播放。
[0057]具體實(shí)現(xiàn)時(shí),發(fā)送端將確定出的全部重要編碼幀發(fā)送至接收端,接收端根據(jù)現(xiàn)有編解碼標(biāo)準(zhǔn)進(jìn)行解碼并播放。
[0058]需要說明的是,在執(zhí)行步驟36之后,發(fā)送端結(jié)束視頻流數(shù)據(jù)傳輸流程。