本發(fā)明涉及通訊技術(shù)領(lǐng)域,尤其涉及一種視頻合成方法及裝置。
背景技術(shù):
隨著4G時(shí)代的到來,互聯(lián)網(wǎng)領(lǐng)域已從文字時(shí)代、圖片時(shí)代、短視頻時(shí)代進(jìn)入到了直播時(shí)代,移動(dòng)視頻直播已經(jīng)成為當(dāng)前互聯(lián)網(wǎng)表現(xiàn)最搶眼的領(lǐng)域之一。為了增加視頻的趣味性,美化視頻效果,主播通常會在錄制時(shí)增加一些美顏、趣味貼圖或者動(dòng)畫等裝飾效果,但通常存在錄制端與播放端設(shè)備不同而不能播放合成視頻或是裝飾效果與錄制視頻不能同步播放的問題,導(dǎo)致用戶體驗(yàn)較差。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的主要目的在于提供一種視頻合成方法及裝置,旨在解決錄制端與播放端設(shè)備不同而不能播放合成視頻或是裝飾效果與錄制視頻不能同步播放的技術(shù)問題。
為實(shí)現(xiàn)上述目的,本發(fā)明提供的一種視頻合成方法包括以下步驟:
獲取相機(jī)的原始視頻幀,將原始視頻幀轉(zhuǎn)換成原始視頻幀紋理并緩存于系統(tǒng)編碼庫生成的繪圖層;
創(chuàng)建繪圖窗口,并建立繪圖窗口與所述繪圖層的對應(yīng)關(guān)系,以將所述繪圖層緩存的原始視頻幀紋理繪制于所述繪圖窗口;
將繪圖窗口的原始視頻幀紋理與本地系統(tǒng)的效果數(shù)據(jù)混合編碼,生成并輸出合成視頻,以供接收端解碼播放所述合成視頻。
優(yōu)選地,所述獲取相機(jī)的原始視頻幀,將原始視頻幀轉(zhuǎn)換成原始視頻幀紋理并緩存于系統(tǒng)編碼庫生成的繪圖層的步驟包括:
創(chuàng)建相機(jī)預(yù)覽窗口以獲取相機(jī)的原始視頻幀,并為所述相機(jī)預(yù)覽窗口設(shè)置渲染器;
獲取所述渲染器基于各個(gè)原始視頻幀創(chuàng)建的表面紋理和對應(yīng)的紋理編號,并將獲取的所述原始視頻幀通過表面紋理和紋理編號轉(zhuǎn)換成原始視頻幀紋理;
將原始視頻幀紋理緩存于系統(tǒng)編碼庫生成的繪圖層。
優(yōu)選地,所述創(chuàng)建繪圖窗口,并建立繪圖窗口與所述繪圖層的對應(yīng)關(guān)系,以將所述繪圖層緩存的原始視頻幀紋理繪制于所述繪圖窗口的步驟包括:
創(chuàng)建繪圖窗口,根據(jù)系統(tǒng)函數(shù)接收繪圖層緩存的原始視頻幀紋理,以建立繪圖窗口與繪圖層的對應(yīng)關(guān)系;
根據(jù)系統(tǒng)編碼線程窗口切換規(guī)則,完成繪圖層與繪圖窗口之間的切換,并根據(jù)預(yù)設(shè)的繪圖參數(shù)和繪圖流程,將繪圖層的原始視頻幀紋理繪制于繪圖窗口中。
優(yōu)選地,所述將繪圖窗口的原始視頻幀紋理與本地系統(tǒng)的效果數(shù)據(jù)混合編碼,生成并輸出合成視頻,以供接收端解碼播放所述合成視頻的步驟包括:
根據(jù)接收的輸入指令,從本地系統(tǒng)中獲取對應(yīng)的效果數(shù)據(jù);
基于系統(tǒng)開放圖形庫將效果數(shù)據(jù)轉(zhuǎn)換為對應(yīng)的效果紋理,并將效果紋理繪制于繪圖窗口中;
對繪圖窗口中的原始視頻幀紋理和效果紋理進(jìn)行混合和編碼,生成并輸出合成視頻,以供接收端解碼播放所述合成視頻。
優(yōu)選地,所述對繪圖窗口中的原始視頻幀紋理和效果紋理進(jìn)行混合和編碼,生成并輸出合成視頻,以供接收端解碼播放所述合成視頻的步驟包括:
將繪圖窗口中的原始視頻幀紋理和效果紋理混合成新的視頻幀,并輸出至與繪圖窗口對應(yīng)的繪圖層;
基于系統(tǒng)編碼庫將繪圖層上當(dāng)前的新的視頻幀按照預(yù)設(shè)格式編碼,生成并輸出合成視頻,以供接收端解碼播放所述合成視頻。
此外,為實(shí)現(xiàn)上述目的,本發(fā)明還提供一種視頻合成裝置,包括:
獲取模塊,用以獲取相機(jī)的原始視頻幀,將原始視頻幀轉(zhuǎn)換成原始視頻幀紋理并緩存于系統(tǒng)編碼庫生成的繪圖層;
繪制模塊,用以創(chuàng)建繪圖窗口,并建立繪圖窗口與所述繪圖層的對應(yīng)關(guān)系,以將所述繪圖層緩存的原始視頻幀紋理繪制于所述繪圖窗口;
編碼模塊,用以將繪圖窗口的原始視頻幀紋理與本地系統(tǒng)的效果數(shù)據(jù)混合編碼,生成并輸出合成視頻,以供接收端解碼播放所述合成視頻。
優(yōu)選地,所述獲取模塊包括:
獲取單元,用以創(chuàng)建相機(jī)預(yù)覽窗口以獲取相機(jī)的原始視頻幀,并為所述相機(jī)預(yù)覽窗口設(shè)置渲染器;
轉(zhuǎn)換單元,用以獲取所述渲染器基于各個(gè)原始視頻幀創(chuàng)建的表面紋理和對應(yīng)的紋理編號,并將獲取的所述原始視頻幀通過表面紋理和紋理編號轉(zhuǎn)換成原始視頻幀紋理;
緩存單元,用以將原始視頻幀紋理緩存于系統(tǒng)編碼庫生成的繪圖層。
優(yōu)選地,所述繪制模塊包括:
繪圖窗口創(chuàng)建單元,用以創(chuàng)建繪圖窗口,根據(jù)系統(tǒng)函數(shù)接收繪圖層緩存的原始視頻幀紋理,以建立繪圖窗口與繪圖層的對應(yīng)關(guān)系;
繪制單元,用以根據(jù)系統(tǒng)編碼線程窗口切換規(guī)則,完成繪圖層與繪圖窗口之間的切換,并根據(jù)預(yù)設(shè)的繪圖參數(shù)和繪圖流程,將繪圖層的原始視頻幀紋理繪制于繪圖窗口中。
優(yōu)選地,所述編碼模塊包括:
效果圖片獲取單元,用以根據(jù)接收的輸入指令,從本地系統(tǒng)中獲取對應(yīng)的效果數(shù)據(jù);
效果紋理繪制單元,用以基于系統(tǒng)開放圖形庫將效果數(shù)據(jù)轉(zhuǎn)換為對應(yīng)的效果紋理,并將效果紋理繪制于繪圖窗口中;
編碼單元,用以對繪圖窗口中的原始視頻幀紋理和效果紋理進(jìn)行混合和編碼,生成并輸出合成視頻,以供接收端解碼播放所述合成視頻。
優(yōu)選地,所述編碼單元包括:
混合單元,用以將繪圖窗口中的原始視頻幀紋理和效果紋理混合成新的視頻幀,并輸出至與繪圖窗口對應(yīng)的繪圖層;
輸出單元,用以基于系統(tǒng)編碼庫將繪圖層上當(dāng)前的新的視頻幀按照預(yù)設(shè)格式編碼,生成并輸出合成視頻,以供接收端解碼播放所述合成視頻。
本發(fā)明提供的技術(shù)方案中,獲取相機(jī)的原始視頻幀,將原始視頻幀轉(zhuǎn)換成原始視頻幀紋理并緩存于系統(tǒng)編碼庫生成的繪圖層,再創(chuàng)建繪圖窗口,并建立繪圖窗口與所述繪圖層的對應(yīng)關(guān)系,以將所述繪圖層緩存的原始視頻幀紋理繪制于所述繪圖窗口,最后將繪圖窗口的原始視頻幀紋理與本地系統(tǒng)的效果數(shù)據(jù)混合編碼,生成并輸出合成視頻,以供接收端解碼播放所述合成視頻,從而基于繪圖層在視頻發(fā)送端將效果數(shù)據(jù)合成至待發(fā)送視頻中,合成視頻為通用格式,使得不管接收端是何種類型設(shè)備,都能對接收的編碼視頻解碼播放,也解決了現(xiàn)有技術(shù)中錄制視頻與增加的裝飾效果數(shù)據(jù)單獨(dú)發(fā)送而造成的不能同步播放的技術(shù)問題,提高了用戶體驗(yàn)。
附圖說明
圖1為本發(fā)明視頻合成方法第一實(shí)施例的流程示意圖;
圖2為本發(fā)明視頻合成方法第二實(shí)施例中獲取原始視頻幀步驟的細(xì)化流程示意圖;
圖3為本發(fā)明視頻合成方法第三實(shí)施例中創(chuàng)建繪圖窗口步驟的細(xì)化流程示意圖;
圖4為本發(fā)明視頻合成方法第四實(shí)施例中將原始視頻幀紋理與效果數(shù)據(jù)編碼步驟的細(xì)化流程示意圖;
圖5為本發(fā)明視頻合成方法第五實(shí)施例中實(shí)現(xiàn)視頻合成步驟的細(xì)化流程示意圖;
圖6為本發(fā)明視頻合成裝置第一實(shí)施例的功能模塊示意圖;
圖7為本發(fā)明視頻合成裝置第二實(shí)施例中獲取模塊的細(xì)化功能模塊示意圖;
圖8為本發(fā)明視頻合成裝置第三實(shí)施例中繪制模塊的細(xì)化功能模塊示意圖;
圖9為本發(fā)明視頻合成裝置第四實(shí)施例中編碼模塊的細(xì)化功能模塊示意圖;
圖10為本發(fā)明視頻合成裝置第五實(shí)施例中編碼單元的細(xì)化功能模塊示意圖。
本發(fā)明目的的實(shí)現(xiàn)、功能特點(diǎn)及優(yōu)點(diǎn)將結(jié)合實(shí)施例,參照附圖做進(jìn)一步說明。
具體實(shí)施方式
應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
本發(fā)明提供一種視頻合成方法,參照圖1,在一實(shí)施例中,該視頻合成方法包括:
步驟S10,獲取相機(jī)的原始視頻幀,將原始視頻幀轉(zhuǎn)換成原始視頻幀紋理并緩存于系統(tǒng)編碼庫生成的繪圖層;
可以理解地,視頻錄制端可以通過多種方式獲取相機(jī)的原始視頻幀;例如,當(dāng)視頻錄制端為手機(jī)時(shí),可以通過手機(jī)自帶的相機(jī)獲取原始視頻幀,當(dāng)視頻錄制端為電腦時(shí),可以通過電腦外接攝像頭來獲取原始視頻幀。本實(shí)施例中,視頻錄制端為自帶有相機(jī)的視頻錄制端,且操作系統(tǒng)為Android系統(tǒng)。
具體地,通過Android系統(tǒng)打開視頻錄制端的相機(jī),并設(shè)置相機(jī)參數(shù),例如光圈值、曝光控制、感光度、對焦距離等參數(shù)的設(shè)置;打開攝像頭預(yù)覽,并創(chuàng)建相機(jī)預(yù)覽窗口(GL Surface View),同時(shí)為相機(jī)預(yù)覽窗口設(shè)置渲染器(Render),上述步驟均是基于Android系統(tǒng)中開放圖形庫(Open GL)實(shí)現(xiàn)。
所述相機(jī)預(yù)覽窗口用以獲取相機(jī)的原始視頻幀,也就是說,相機(jī)每更新一幀數(shù)據(jù),系統(tǒng)就會調(diào)用一次渲染器的on Draw Frame(GL10)方法為相機(jī)預(yù)覽窗口繪制圖像,根據(jù)獲取的相機(jī)每一幀的原始視頻幀數(shù)據(jù)生成開放圖形庫的原始視頻幀紋理。
需要說明的是,紋理就是一個(gè)圖像或照片,用于在基本圖形的表面加入額外的細(xì)節(jié)。每個(gè)二位的紋理都有其自己的坐標(biāo)空間,其范圍是從一個(gè)拐角的(0,0)到另一個(gè)拐角的(1,1)。當(dāng)需要把一個(gè)紋理應(yīng)用于一個(gè)矩形的時(shí)候,因此需要為每個(gè)頂點(diǎn)指定一個(gè)紋理坐標(biāo),以便Open GL知道需要用那個(gè)紋理的哪個(gè)部分畫到矩形上。Android系統(tǒng)中,將以原始的視頻幀和貼圖作為紋理,使用(0,0)、(1,0)、(0,1)、(1,1)作為四個(gè)頂點(diǎn)的紋理坐標(biāo),其效果就是將整個(gè)圖像縮放后,完整地繪制在頂點(diǎn)坐標(biāo)指定的矩形區(qū)域上。
具體地,所述渲染器基于獲取的每一原始視屏幀創(chuàng)建表面紋理和對應(yīng)的紋理編號,這樣,在渲染器的on Draw Frame中就可以通過創(chuàng)建的表面紋理(Surface Texure)和紋理編號(Texureld)獲取紋理數(shù)據(jù)和操作紋理了。也就是說,獲取所述原始視頻幀通過渲染器on Draw Frame轉(zhuǎn)換為對應(yīng)的原始視頻幀紋理。并通過Android系統(tǒng)編碼庫(Mediacodec)生成一個(gè)繪圖層(surface),用以緩存所述原始視頻幀紋理,所述編碼庫將從該繪圖層獲取待編碼的視頻流。
步驟S20,創(chuàng)建繪圖窗口,并建立繪圖窗口與所述繪圖層的對應(yīng)關(guān)系,以將所述繪圖層緩存的原始視頻幀紋理繪制于所述繪圖窗口;
基于Android系統(tǒng)創(chuàng)建繪圖窗口,用以將所述繪圖層緩存的原始視頻幀紋理繪制于所述繪圖窗口;可以理解地,需要建立繪圖窗口與繪圖層的對應(yīng)關(guān)系。
具體地,為了使用繪圖窗口繪圖,通過系統(tǒng)函數(shù)egl Create Window Surface創(chuàng)建一個(gè)EGL Surface,該函數(shù)接收編碼庫生成的繪圖層(surface)作為參數(shù),這樣就建立了繪圖窗口和繪圖層的對應(yīng)關(guān)系。
進(jìn)一步地,Android系統(tǒng)編碼線程通過修改“current”來設(shè)置EGL Surface,為了使Open GL能夠在創(chuàng)建的繪圖窗口上繪圖,還需要通過系統(tǒng)編碼線程調(diào)用EGL Surface.make Current方法完成繪圖層與繪圖窗口之間的切換,并根據(jù)預(yù)設(shè)的繪圖參數(shù)和繪圖流程將繪圖層的原始視頻幀紋理繪制于繪圖窗口。可以理解地,所述繪圖參數(shù)可以為預(yù)設(shè)的頂點(diǎn)坐標(biāo)、紋理坐標(biāo)和頂點(diǎn)著色器、片段著色器等,根據(jù)Open GL的繪圖流程,將所述原始視頻幀紋理繪制在繪圖窗口上。
需要說明的是,所述頂點(diǎn)坐標(biāo)指的是歸一化坐標(biāo),用于指定矩形的繪制區(qū)域。在Open GL里,需要渲染的一切物體都要映射到x軸和y軸上的[-1,1]的范圍內(nèi),這個(gè)范圍內(nèi)的坐標(biāo)被稱為歸一化設(shè)備坐標(biāo),其獨(dú)立于屏幕實(shí)際的尺寸或形狀。Android系統(tǒng)中Open GL占用整個(gè)顯示屏,因此x軸、y軸的[-1,1]的范圍分別映射為屏幕的像素寬和像素高。
可以理解地,圖像在繪制之前,需要在Open GL的管道中傳遞,這就需要稱為著色器的子例程,這些著色器會告訴GPU如何繪制數(shù)據(jù),有頂點(diǎn)著色器和片段著色器,在繪制任何內(nèi)容到屏幕之前,需要先定義頂點(diǎn)著色器和片段著色器。
具體地,首先讀取原始視頻幀的頂點(diǎn)數(shù)據(jù),執(zhí)行頂點(diǎn)著色器,進(jìn)而可以控制每個(gè)頂點(diǎn),實(shí)現(xiàn)渲染、確定頂點(diǎn)位置紋理坐標(biāo)變換等指令;當(dāng)頂點(diǎn)的全部屬性都被確定后,將頂點(diǎn)組裝成圖元,然后光柵化圖元,負(fù)責(zé)接收一個(gè)圖元經(jīng)過處理的電,并把它轉(zhuǎn)換為片段,每個(gè)片段對應(yīng)屏幕的一個(gè)像素;執(zhí)行片段著色器,進(jìn)行紋理查找,確定紋理坐標(biāo);而后將原始視頻幀寫入幀緩沖區(qū),即繪圖層(surface),最后顯示在屏幕上。
步驟S30,將繪圖窗口的原始視頻幀紋理與本地系統(tǒng)的效果數(shù)據(jù)混合編碼,生成并輸出合成視頻,以供接收端解碼播放所述合成視頻。
可以理解地,效果數(shù)據(jù)可以是美顏、濾鏡、趣味貼圖、動(dòng)畫效果等。所述效果數(shù)據(jù)可以是預(yù)存于系統(tǒng)中的數(shù)據(jù),也可以是用戶基于系統(tǒng)程序而產(chǎn)生的當(dāng)前數(shù)據(jù)并緩存于系統(tǒng)內(nèi)存中。
具體地,基于用戶輸入的控制指令獲取系統(tǒng)內(nèi)存中的效果數(shù)據(jù),并與繪圖窗口的原始視頻幀紋理混合和編碼,合成新的視頻,并輸出到網(wǎng)絡(luò)推流模塊,以供接收端解碼播放。
本發(fā)明提供的技術(shù)方案中,通過獲取相機(jī)的原始視頻幀,將原始視頻幀轉(zhuǎn)換成原始視頻幀紋理并緩存于系統(tǒng)編碼庫生成的繪圖層,再創(chuàng)建繪圖窗口,并建立繪圖窗口與所述繪圖層的對應(yīng)關(guān)系,以將所述繪圖層緩存的原始視頻幀紋理繪制于所述繪圖窗口,最后將繪圖窗口的原始視頻幀紋理與本地系統(tǒng)的效果數(shù)據(jù)混合編碼,生成并輸出合成視頻,以供接收端解碼播放所述合成視頻,從而基于繪圖層在視頻發(fā)送端將效果數(shù)據(jù)合成至待發(fā)送視頻中(即合成視頻),合成視頻為通用格式,使得不管接收端是何種類型設(shè)備,都能對接收的編碼視頻解碼播放,也解決了現(xiàn)有技術(shù)中錄制視頻與增加的裝飾效果數(shù)據(jù)單獨(dú)發(fā)送而造成的不能同步播放的技術(shù)問題,提高了用戶體驗(yàn)。
進(jìn)一步地,請參照圖2,基于上述實(shí)施例一,在本實(shí)施例中,上述步驟S10包括:
步驟S11,創(chuàng)建相機(jī)預(yù)覽窗口以獲取相機(jī)的原始視頻幀,并為所述相機(jī)預(yù)覽窗口設(shè)置渲染器;
步驟S12,獲取所述渲染器基于各個(gè)原始視頻幀創(chuàng)建的表面紋理和對應(yīng)的紋理編號,并將獲取的所述原始視頻幀通過表面紋理和紋理編號轉(zhuǎn)換成原始視頻幀紋理;
步驟S13,將原始視頻幀紋理緩存于系統(tǒng)編碼庫生成的繪圖層。
具體地,基于Android系統(tǒng)的開放圖形庫(Open GL),通過Android系統(tǒng)的Camera類,設(shè)置相機(jī)參數(shù),打開攝像頭預(yù)覽,并創(chuàng)建相機(jī)預(yù)覽窗口(GL Surface View),并為所述相機(jī)預(yù)覽窗口設(shè)置渲染器。所述相機(jī)預(yù)覽窗口的創(chuàng)建,能獲取相機(jī)的原始視頻幀。
進(jìn)一步地,為了獲取紋理數(shù)據(jù),首先在渲染器中使用開放圖形庫(Open GL)基于原始視頻幀創(chuàng)建表面紋理(Surface Texure)和對應(yīng)的紋理編號(Texureld),然后通過Camera的set Preview Texture接口傳入紋理;這樣,通過渲染器的on Draw Frame方法,將獲取的所述原始視頻幀通過表面紋理和紋理編號轉(zhuǎn)換成原始視頻幀紋理,并緩存于系統(tǒng)編碼庫生成的繪圖層。
在本實(shí)施例提供的技術(shù)方案中,進(jìn)一步提出了通過創(chuàng)建相機(jī)預(yù)覽窗口以獲取相機(jī)的原始視頻幀,并為所述相機(jī)預(yù)覽窗口設(shè)置渲染器;獲取所述渲染器基于各個(gè)原始視頻幀創(chuàng)建的表面紋理和對應(yīng)的紋理編號,并將獲取的所述原始視頻幀通過表面紋理和紋理編號轉(zhuǎn)換成原始視頻幀紋理,并緩存于系統(tǒng)編碼庫生成的繪圖層。借助Android系統(tǒng)中獨(dú)立于窗口系統(tǒng)、獨(dú)立于硬件的開放圖形庫來實(shí)現(xiàn)相機(jī)預(yù)覽窗口的創(chuàng)建,在運(yùn)行各種操作系統(tǒng)的各種計(jì)算機(jī)上都可以用,優(yōu)化視頻直播體驗(yàn)和效率。
進(jìn)一步地,請參照圖3,基于上述實(shí)施例二,在本實(shí)施例中,上述步驟S20包括:
步驟S21,創(chuàng)建繪圖窗口,根據(jù)系統(tǒng)函數(shù)接收繪圖層緩存的原始視頻幀紋理,以建立繪圖窗口與繪圖層的對應(yīng)關(guān)系;
步驟S22,根據(jù)系統(tǒng)編碼線程中的窗口切換規(guī)則,完成繪圖層與繪圖窗口之間的切換,并根據(jù)預(yù)設(shè)的繪圖參數(shù)和繪圖流程,將繪圖層的原始視頻幀紋理繪制于繪圖窗口中。
本發(fā)明提供的技術(shù)方案中,為了完成錄制視頻和效果數(shù)據(jù)的合成,需要?jiǎng)?chuàng)建一個(gè)繪圖窗口,以完成原始視頻幀的繪制和效果數(shù)據(jù)的繪制。
具體地,為了使用繪圖窗口繪圖,需要?jiǎng)?chuàng)建一個(gè)EGL Context和一個(gè)EGL Surface;EGL Context就是當(dāng)前渲染代碼所在的線程,EGL Surface是通過系統(tǒng)函數(shù)egl Create Window Surface創(chuàng)建的,該函數(shù)接收系統(tǒng)編碼庫生成的繪圖層作為參數(shù),以建立繪圖窗口和繪圖層的對應(yīng)關(guān)系。
進(jìn)一步地,當(dāng)建立了繪圖窗口與繪圖層之間的對應(yīng)關(guān)系,需要將緩存于繪圖層的原始視頻幀紋理繪制于繪圖窗口。通過系統(tǒng)編碼線程調(diào)用EGL Surface.make Current方法完成繪圖層與繪圖窗口之間的切換,基于開放圖形庫的繪圖流程,將原始視頻幀紋理繪制在繪圖窗口上。
本實(shí)施例中,通過創(chuàng)建繪圖窗口,以完成原始視頻幀紋理的繪制,進(jìn)而能在繪圖窗口對獲取的所述原始視頻幀進(jìn)行紋理繪制,并能將本地系統(tǒng)中的效果數(shù)據(jù)也繪制于繪圖窗口,以實(shí)現(xiàn)錄制視頻與效果數(shù)據(jù)的合成;所述繪圖窗口的創(chuàng)建,獨(dú)立于相機(jī)預(yù)覽窗口,進(jìn)而能避免相機(jī)預(yù)覽窗口卡頓等現(xiàn)象的發(fā)生,提高系統(tǒng)的處理效率。
進(jìn)一步地,請參照圖4,基于上述實(shí)施例三,在本實(shí)施例中,上述步驟S30包括:
步驟S31,根據(jù)接收的輸入指令,從本地系統(tǒng)中獲取對應(yīng)的效果數(shù)據(jù);
步驟S32,基于系統(tǒng)開放圖形庫將效果數(shù)據(jù)轉(zhuǎn)換為對應(yīng)的效果紋理,并將效果紋理繪制于繪圖窗口中;
步驟S33,對繪圖窗口中的原始視頻幀紋理和效果紋理進(jìn)行混合和編碼,生成并輸出合成視頻,以供接收端解碼播放所述合成視頻。
可以理解地,為了美化視頻效果,需要在錄制的視頻中添加效果數(shù)據(jù),且需要將效果數(shù)據(jù)轉(zhuǎn)換成與原始視頻幀紋理相同的格式,以實(shí)現(xiàn)將效果數(shù)據(jù)與原始視頻幀紋理的混合。需要說明的是,所述效果數(shù)據(jù)可以是預(yù)存于系統(tǒng)中的數(shù)據(jù),例如貼圖、動(dòng)畫等,也可以是用戶基于系統(tǒng)程序而產(chǎn)生的當(dāng)前數(shù)據(jù)并緩存于系統(tǒng)內(nèi)存中,例如濾鏡、美顏圖片等。
具體地,根據(jù)接收的輸入指令,首先讀取系統(tǒng)磁盤中png或者jpg格式的圖片,并生成bitmap位圖數(shù)據(jù)到內(nèi)存中,然后基于開放圖形庫的glTexImage2D函數(shù)生成二位圖像的效果紋理,并使用相應(yīng)的坐標(biāo)和著色器將所述效果紋理繪制于繪圖窗口上。繪制完成后,將繪圖窗口上的原始視頻幀紋理和效果紋理混合編碼,生成新的合成視頻并輸出至網(wǎng)絡(luò)推流模塊,以供接收端解碼播放。
本實(shí)施例提供的技術(shù)方案中,進(jìn)一步細(xì)化了效果數(shù)據(jù)的處理步驟,將錄制的原始視頻幀與效果數(shù)據(jù)在視頻錄制端合成編碼,實(shí)現(xiàn)了視頻合成的實(shí)時(shí)傳輸,播放端只需解碼播放即可,減少了播放端的處理流程,優(yōu)化了直播效率,提高了用戶體驗(yàn)。
進(jìn)一步地,請參照圖5,基于上述實(shí)施例四,在本實(shí)施例中,上述步驟S33包括:
步驟S331,將繪圖窗口中的原始視頻幀紋理和效果紋理混合成新的視頻幀,并輸出至與繪圖窗口對應(yīng)的繪圖層;
步驟S332,基于系統(tǒng)編碼庫將繪圖層上當(dāng)前的新的視頻幀按照預(yù)設(shè)格式編碼,生成并輸出合成視頻,以供接收端解碼播放所述合成視頻。
具體地,當(dāng)完成將效果紋理繪制于繪圖窗口的步驟后,將繪圖窗口上的原始視頻幀紋理和效果紋理混合成新的視頻幀,并調(diào)用系統(tǒng)中的egl Swap Buffer函數(shù)來提交繪制在繪圖窗口的當(dāng)前新的視頻幀,輸出至與當(dāng)前繪圖窗口對應(yīng)的繪圖層中,系統(tǒng)編碼庫將以該繪圖層作為輸出對象,并將繪圖層上的當(dāng)前新的視頻幀按照預(yù)設(shè)的格式編碼,輸出至網(wǎng)絡(luò)推流模塊,接收端只需解碼播放即可。
需要說明的是,本實(shí)施例中,通過如下設(shè)置以完成將繪圖窗口上的原始視頻幀紋理和效果紋理的混合:
glEnbale(GL_BLEND);//啟用混合
glBlendFunc(GL_SRC_ALPHA,GL_ONE_M(jìn)INUS_SRC_ALPHA);//混合函數(shù)。
其中GL_SRC_ALPHA是源混合因子sfactor,GL_ONE_M(jìn)INUS_SRC_ALPHA是目標(biāo)混合因子dfactor。使用這個(gè)設(shè)置,實(shí)現(xiàn)了由遠(yuǎn)及近的繪圖,在效果紋理的繪制區(qū)域,透明部分將顯示原始幀,有像素的部分將顯示效果紋理。
本實(shí)施例提供的技術(shù)方案中,通過將繪圖窗口中的原始視頻幀紋理和效果紋理混合成新的視頻幀,并輸出至與繪圖窗口對應(yīng)的繪圖層;基于系統(tǒng)編碼庫將繪圖層上當(dāng)前的新的視頻幀按照預(yù)設(shè)格式編碼,生成并輸出合成視頻,以供接收端解碼播放所述合成視頻。進(jìn)一步優(yōu)化了效果紋理與原始視頻幀紋理的處理步驟,以實(shí)現(xiàn)錄制視頻與效果數(shù)據(jù)的高效同步播放的效果。
本發(fā)明還提供一種視頻合成裝置,參照圖6,在一實(shí)施例中,本發(fā)明提供的視頻合成裝置包括:
獲取模塊10,用以獲取相機(jī)的原始視頻幀,將原始視頻幀轉(zhuǎn)換成原始視頻幀紋理并緩存于系統(tǒng)編碼庫生成的繪圖層;
可以理解地,視頻錄制端可以通過多種方式獲取相機(jī)的原始視頻幀;例如,當(dāng)視頻錄制端為手機(jī)時(shí),可以通過手機(jī)自帶的相機(jī)獲取原始視頻幀,當(dāng)視頻錄制端為電腦時(shí),可以通過電腦外接攝像頭來獲取原始視頻幀。本實(shí)施例中,視頻錄制端為自帶有相機(jī)的視頻錄制端,且操作系統(tǒng)為Android系統(tǒng)。
具體地,通過Android系統(tǒng)打開視頻錄制端的相機(jī),并設(shè)置相機(jī)參數(shù),例如光圈值、曝光控制、感光度、對焦距離等參數(shù)的設(shè)置;打開攝像頭預(yù)覽,并創(chuàng)建相機(jī)預(yù)覽窗口(GL Surface View),同時(shí)為相機(jī)預(yù)覽窗口設(shè)置渲染器(Render),上述步驟均是基于Android系統(tǒng)中開放圖形庫(Open GL)實(shí)現(xiàn)。
所述相機(jī)預(yù)覽窗口用以獲取相機(jī)的原始視頻幀,也就是說,相機(jī)每更新一幀數(shù)據(jù),系統(tǒng)就會調(diào)用一次渲染器的on Draw Frame(GL10)方法為相機(jī)預(yù)覽窗口繪制圖像,根據(jù)獲取的相機(jī)每一幀的原始視頻幀數(shù)據(jù)生成開放圖形庫的原始視頻幀紋理。
需要說明的是,紋理就是一個(gè)圖像或照片,用于在基本圖形的表面加入額外的細(xì)節(jié)。每個(gè)二位的紋理都有其自己的坐標(biāo)空間,其范圍是從一個(gè)拐角的(0,0)到另一個(gè)拐角的(1,1)。當(dāng)需要把一個(gè)紋理應(yīng)用于一個(gè)矩形的時(shí)候,因此需要為每個(gè)頂點(diǎn)指定一個(gè)紋理坐標(biāo),以便Open GL知道需要用那個(gè)紋理的哪個(gè)部分畫到矩形上。Android系統(tǒng)中,將以原始的視頻幀和貼圖作為紋理,使用(0,0)、(1,0)、(0,1)、(1,1)作為四個(gè)頂點(diǎn)的紋理坐標(biāo),其效果就是將整個(gè)圖像縮放后,完整地繪制在頂點(diǎn)坐標(biāo)指定的矩形區(qū)域上。
具體地,所述渲染器基于獲取的每一原始視屏幀創(chuàng)建表面紋理和對應(yīng)的紋理編號,這樣,在渲染器的on Draw Frame中就可以通過創(chuàng)建的表面紋理(Surface Texure)和紋理編號(Texureld)獲取紋理數(shù)據(jù)和操作紋理了。也就是說,獲取的相機(jī)的所述原始視頻幀通過渲染器on Draw Frame轉(zhuǎn)換為對應(yīng)的原始視頻幀紋理。并通過Android系統(tǒng)編碼庫(Mediacodec)生成一個(gè)繪圖層(surface),用以緩存所述原始視頻幀紋理,所述編碼庫將從該繪圖層獲取待編碼的視頻流。
繪制模塊20,用以創(chuàng)建繪圖窗口,并建立繪圖窗口與所述繪圖層的對應(yīng)關(guān)系,以將所述繪圖層緩存的原始視頻幀紋理繪制于所述繪圖窗口;
基于Android系統(tǒng)創(chuàng)建繪圖窗口,用以將所述繪圖層緩存的原始視頻幀紋理繪制于所述繪圖窗口;可以理解地,需要建立繪圖窗口與繪圖層的對應(yīng)關(guān)系。
具體地,為了使用繪圖窗口繪圖,通過系統(tǒng)函數(shù)egl Create Window Surface創(chuàng)建一個(gè)EGL Surface,該函數(shù)接收編碼庫生成的繪圖層(surface)作為參數(shù),這樣就建立了繪圖窗口和繪圖層的對應(yīng)關(guān)系。
進(jìn)一步地,Android系統(tǒng)編碼線程通過修改“current”來設(shè)置EGL Surface,為了使Open GL能夠在創(chuàng)建的繪圖窗口上繪圖,還需要通過系統(tǒng)編碼線程調(diào)用EGL Surface.make Current方法完成繪圖層與繪圖窗口之間的切換,并根據(jù)預(yù)設(shè)的繪圖參數(shù)和繪圖流程將繪圖層的原始視頻幀紋理繪制于繪圖窗口。可以理解地,所述繪圖參數(shù)可以為預(yù)設(shè)的頂點(diǎn)坐標(biāo)、紋理坐標(biāo)和頂點(diǎn)著色器、片段著色器等,根據(jù)Open GL的繪圖流程,將所述原始視頻幀紋理繪制在繪圖窗口上。
需要說明的是,所述頂點(diǎn)坐標(biāo)指的是歸一化坐標(biāo),用于指定矩形的繪制區(qū)域。在Open GL里,需要渲染的一切物體都要映射到x軸和y軸上的[-1,1]的范圍內(nèi),這個(gè)范圍內(nèi)的坐標(biāo)被稱為歸一化設(shè)備坐標(biāo),其獨(dú)立于屏幕實(shí)際的尺寸或形狀。Android系統(tǒng)中Open GL占用整個(gè)顯示屏,因此x軸、y軸的[-1,1]的范圍分別映射為屏幕的像素寬和像素高。
可以理解地,圖像在繪制之前,需要在Open GL的管道中傳遞,這就需要稱為著色器的子例程,這些著色器會告訴GPU如何繪制數(shù)據(jù),有頂點(diǎn)著色器和片段著色器,在繪制任何內(nèi)容到屏幕之前,需要先定義頂點(diǎn)著色器和片段著色器。
具體地,首先讀取原始視頻幀的頂點(diǎn)數(shù)據(jù),執(zhí)行頂點(diǎn)著色器,進(jìn)而可以控制每個(gè)頂點(diǎn),實(shí)現(xiàn)渲染、確定頂點(diǎn)位置紋理坐標(biāo)變換等指令;當(dāng)頂點(diǎn)的全部屬性都被確定后,將頂點(diǎn)組裝成圖元,然后光柵化圖元,負(fù)責(zé)接收一個(gè)圖元經(jīng)過處理的電,并把它轉(zhuǎn)換為片段,每個(gè)片段對應(yīng)屏幕的一個(gè)像素;執(zhí)行片段著色器,進(jìn)行紋理查找,確定紋理坐標(biāo);而后將原始視頻幀寫入幀緩沖區(qū),即繪圖層(surface),最后顯示在屏幕上。
編碼模塊30,用以將繪圖窗口的原始視頻幀紋理與本地系統(tǒng)的效果數(shù)據(jù)混合編碼,生成并輸出合成視頻,以供接收端解碼播放所述合成視頻。
可以理解地,效果數(shù)據(jù)可以是美顏、濾鏡、趣味貼圖、動(dòng)畫效果等。所述效果數(shù)據(jù)可以是預(yù)存于系統(tǒng)中的數(shù)據(jù),也可以是用戶基于系統(tǒng)程序而產(chǎn)生的當(dāng)前數(shù)據(jù)并緩存于系統(tǒng)內(nèi)存中。
具體地,基于用戶輸入的控制指令獲取系統(tǒng)內(nèi)存中的效果數(shù)據(jù),并與繪圖窗口的原始視頻幀紋理混合和編碼,合成新的視頻,并輸出到網(wǎng)絡(luò)推流模塊,以供接收端解碼播放。
本發(fā)明提供的技術(shù)方案中,通過獲取模塊10獲取相機(jī)的原始視頻幀,將原始視頻幀轉(zhuǎn)換成原始視頻幀紋理并緩存于系統(tǒng)編碼庫生成的繪圖層,繪制模塊20再創(chuàng)建繪圖窗口,并建立繪圖窗口與所述繪圖層的對應(yīng)關(guān)系,以將所述繪圖層緩存的原始視頻幀紋理繪制于所述繪圖窗口,最后編碼模塊30將繪圖窗口的原始視頻幀紋理與本地系統(tǒng)的效果數(shù)據(jù)混合編碼,生成并輸出合成視頻,以供接收端解碼播放所述合成視頻,從而基于繪圖層在視頻發(fā)送端將效果數(shù)據(jù)合成至待發(fā)送視頻中(即合成視頻),合成視頻為通用格式,使得不管接收端是何種類型設(shè)備,都能對接收的編碼視頻解碼播放,也解決了現(xiàn)有技術(shù)中錄制視頻與增加的裝飾效果數(shù)據(jù)單獨(dú)發(fā)送而造成的不能同步播放的技術(shù)問題,提高了用戶體驗(yàn)。
進(jìn)一步地,請參照圖7,基于上述實(shí)施例一,在本實(shí)施例中,所述獲取模塊10包括:
獲取單元11,用以創(chuàng)建相機(jī)預(yù)覽窗口以獲取相機(jī)的原始視頻幀,并為所述相機(jī)預(yù)覽窗口設(shè)置渲染器;
轉(zhuǎn)換單元12,用以獲取所述渲染器基于各個(gè)原始視頻幀創(chuàng)建的表面紋理和對應(yīng)的紋理編號,并將獲取的所述原始視頻幀通過表面紋理和紋理編號轉(zhuǎn)換成原始視頻幀紋理;
緩存單元13,用以將原始視頻幀紋理緩存于系統(tǒng)編碼庫生成的繪圖層。
具體地,基于Android系統(tǒng)的開放圖形庫(Open GL),通過Android系統(tǒng)的Camera類,設(shè)置相機(jī)參數(shù),打開攝像頭預(yù)覽,并創(chuàng)建相機(jī)預(yù)覽窗口(GL Surface View),并為所述相機(jī)預(yù)覽窗口設(shè)置渲染器。所述相機(jī)預(yù)覽窗口的創(chuàng)建,能獲取相機(jī)的原始視頻幀。
進(jìn)一步地,為了獲取紋理數(shù)據(jù),首先在渲染器中使用開放圖形庫(Open GL)基于原始視頻幀創(chuàng)建表面紋理(Surface Texure)和對應(yīng)的紋理編號(Texureld),然后通過Camera的set Preview Texture接口傳入紋理;這樣,通過渲染器的on Draw Frame方法,將獲取的所述原始視頻幀通過表面紋理和紋理編號轉(zhuǎn)換成原始視頻幀紋理,并緩存于系統(tǒng)編碼庫生成的繪圖層。
在本實(shí)施例提供的技術(shù)方案中,獲取單元11通過創(chuàng)建相機(jī)預(yù)覽窗口以獲取相機(jī)的原始視頻幀,并為所述相機(jī)預(yù)覽窗口設(shè)置渲染器;轉(zhuǎn)換單元12將獲取的所述原始視頻幀通過渲染器創(chuàng)建的表面紋理和紋理編號轉(zhuǎn)換成原始視頻幀紋理,并通過緩存單元13緩存于系統(tǒng)編碼庫生成的繪圖層。借助Android系統(tǒng)中獨(dú)立于窗口系統(tǒng)、獨(dú)立于硬件的開放圖形庫來實(shí)現(xiàn)相機(jī)預(yù)覽窗口的創(chuàng)建,在運(yùn)行各種操作系統(tǒng)的各種計(jì)算機(jī)上都可以用,優(yōu)化視頻直播體驗(yàn)和效率。
進(jìn)一步地,請參照圖8,基于上述實(shí)施例二,在本實(shí)施例中,所述繪制模塊20包括:
繪圖窗口創(chuàng)建單元21,用以創(chuàng)建繪圖窗口,根據(jù)系統(tǒng)函數(shù)接收繪圖層緩存的原始視頻幀紋理,以建立繪圖窗口與繪圖層的對應(yīng)關(guān)系;
繪制單元22,用以根據(jù)系統(tǒng)編碼線程窗口切換規(guī)則,完成繪圖層與繪圖窗口之間的切換,并根據(jù)預(yù)設(shè)的繪圖參數(shù)和繪圖流程,將繪圖層的原始視頻幀紋理繪制于繪圖窗口中。
本發(fā)明提供的技術(shù)方案中,為了完成錄制視頻和效果數(shù)據(jù)的合成,需要?jiǎng)?chuàng)建一個(gè)繪圖窗口,以完成原始視頻幀的繪制和效果數(shù)據(jù)的繪制。
具體地,為了使用繪圖窗口繪圖,需要?jiǎng)?chuàng)建一個(gè)EGL Context和一個(gè)EGL Surface;EGL Context就是當(dāng)前渲染代碼所在的線程,EGL Surface是通過系統(tǒng)函數(shù)egl Create Window Surface創(chuàng)建的,該函數(shù)接收系統(tǒng)編碼庫生成的繪圖層作為參數(shù),以建立繪圖窗口和繪圖層的對應(yīng)關(guān)系。
進(jìn)一步地,當(dāng)建立了繪圖窗口與繪圖層之間的對應(yīng)關(guān)系,需要將緩存于繪圖層的原始視頻幀紋理繪制于繪圖窗口。通過系統(tǒng)編碼線程調(diào)用EGL Surface.make Current方法完成繪圖層與繪圖窗口之間的切換,基于開放圖形庫的繪圖流程,將原始視頻幀紋理繪制在繪圖窗口上。
本實(shí)施例中,通過創(chuàng)建繪圖窗口,以完成原始視頻幀紋理的繪制,進(jìn)而能在繪圖窗口對獲取的所述原始視頻幀進(jìn)行紋理繪制,并能將本地系統(tǒng)中的效果數(shù)據(jù)也繪制于繪圖窗口,以實(shí)現(xiàn)錄制視頻與效果數(shù)據(jù)的合成;所述繪圖窗口的創(chuàng)建,獨(dú)立于相機(jī)預(yù)覽窗口,進(jìn)而能避免相機(jī)預(yù)覽窗口卡頓等現(xiàn)象的發(fā)生,提高系統(tǒng)的處理效率。
進(jìn)一步地,請參照圖9,基于上述實(shí)施例三,在本實(shí)施例中,所述編碼模塊30包括:
效果圖片獲取單元31,用以根據(jù)接收的輸入指令,從本地系統(tǒng)中獲取對應(yīng)的效果數(shù)據(jù);
效果紋理繪制單元32,用以基于系統(tǒng)開放圖形庫將效果數(shù)據(jù)轉(zhuǎn)換為對應(yīng)的效果紋理,并將效果紋理繪制于繪圖窗口中;
編碼單元33,用以對繪圖窗口中的原始視頻幀紋理和效果紋理進(jìn)行混合和編碼,生成并輸出合成視頻,以供接收端解碼播放所述合成視頻。
可以理解地,為了美化視頻效果,需要在錄制的視頻中添加效果數(shù)據(jù),且需要將效果數(shù)據(jù)轉(zhuǎn)換成與原始視頻幀紋理相同的格式,以實(shí)現(xiàn)將效果數(shù)據(jù)與原始視頻幀紋理的混合。需要說明的是,所述效果數(shù)據(jù)可以是預(yù)存于系統(tǒng)中的數(shù)據(jù),例如貼圖、動(dòng)畫等,也可以是用戶基于系統(tǒng)程序而產(chǎn)生的當(dāng)前數(shù)據(jù)并緩存于系統(tǒng)內(nèi)存中,例如濾鏡、美顏圖片等。
具體地,所述效果圖片獲取單元31首先獲取系統(tǒng)磁盤png或者jpg格式的圖片,并生成bitmap位圖數(shù)據(jù)到內(nèi)存中,然后基于開放圖形庫的glTexImage2D函數(shù)生成二位圖像的紋理數(shù)據(jù),并使用相應(yīng)的坐標(biāo)和著色器將所述效果紋理繪制于繪圖窗口上。繪制完成后,將繪圖窗口上的原始視頻幀紋理和效果紋理混合編碼,生成新的合成視頻并輸出至網(wǎng)絡(luò)推流模塊,以供接收端解碼播放。
本實(shí)施例提供的技術(shù)方案中,進(jìn)一步細(xì)化了效果數(shù)據(jù)的處理步驟,將錄制的原始視頻幀與效果數(shù)據(jù)在視頻錄制端合成編碼,實(shí)現(xiàn)了視頻合成的實(shí)時(shí)傳輸,播放端只需解碼播放即可,減少了播放端的處理流程,優(yōu)化了直播效率,提高了用戶體驗(yàn)。
進(jìn)一步地,請參照圖10,基于上述實(shí)施例四,在本實(shí)施例中,所述編碼單元33包括:
混合單元331,用以將繪圖窗口中的原始視頻幀紋理和效果紋理混合成新的視頻幀,并輸出至與繪圖窗口對應(yīng)的繪圖層;
輸出單元332,用以基于系統(tǒng)編碼庫將繪圖層上當(dāng)前的新的視頻幀按照預(yù)設(shè)格式編碼,生成并輸出合成視頻,以供接收端解碼播放所述合成視頻。
具體地,當(dāng)完成將效果紋理繪制于繪圖窗口的步驟后,將繪圖窗口上的原始視頻幀紋理和效果紋理混合成新的視頻幀,并調(diào)用系統(tǒng)中的egl Swap Buffer函數(shù)來提交繪制在繪圖窗口的當(dāng)前新的視頻幀,輸出至與當(dāng)前繪圖窗口對應(yīng)的繪圖層中,系統(tǒng)編碼庫將以該繪圖層作為輸出對象,并將繪圖層上的當(dāng)前新的視頻幀按照預(yù)設(shè)的格式編碼,輸出至網(wǎng)絡(luò)推流模塊,接收端只需解碼播放即可。
需要說明的是,本實(shí)施例中,通過如下設(shè)置以完成將繪圖窗口上的原始視頻幀紋理和效果紋理的混合:
glEnbale(GL_BLEND);//啟用混合
glBlendFunc(GL_SRC_ALPHA,GL_ONE_M(jìn)INUS_SRC_ALPHA);//混合函數(shù)。
其中GL_SRC_ALPHA是源混合因子sfactor,GL_ONE_M(jìn)INUS_SRC_ALPHA是目標(biāo)混合因子dfactor。使用這個(gè)設(shè)置,實(shí)現(xiàn)了由遠(yuǎn)及近的繪圖,在效果紋理的繪制區(qū)域,透明部分將顯示原始幀,有像素的部分將顯示效果紋理。
本實(shí)施例提供的技術(shù)方案中,通過混合單元331將繪圖窗口中的原始視頻幀紋理和效果紋理混合成新的視頻幀,并輸出至與繪圖窗口對應(yīng)的繪圖層;輸出單元332通過系統(tǒng)編碼庫將繪圖層上當(dāng)前的新的視頻幀按照預(yù)設(shè)格式編碼,生成并輸出合成視頻,以供接收端解碼播放所述合成視頻。進(jìn)一步優(yōu)化了效果紋理與原始視頻幀紋理的處理步驟,以實(shí)現(xiàn)錄制視頻與裝飾效果的高效同步的效果。
以上僅為本發(fā)明的優(yōu)選實(shí)施例,并非因此限制本發(fā)明的專利范圍,凡是利用本發(fā)明說明書及附圖內(nèi)容所作的等效結(jié)構(gòu)或等效流程變換,或直接或間接運(yùn)用在其他相關(guān)的技術(shù)領(lǐng)域,均同理包括在本發(fā)明的專利保護(hù)范圍內(nèi)。