欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

視頻特效渲染方法、裝置及終端與流程

文檔序號:11779022閱讀:345來源:國知局
視頻特效渲染方法、裝置及終端與流程

本發(fā)明涉及視頻技術(shù)領(lǐng)域,尤其涉及一種視頻特效渲染方法、裝置及終端。



背景技術(shù):

在這個微拍時代,人們希望能夠通過手機(jī)、平板電腦等移動終端中的具有視頻編輯功能的軟件,將自己和家人朋友的零散的照片和影像轉(zhuǎn)化為有趣的動態(tài)視頻,與家人朋友一同分享。在這個轉(zhuǎn)化過程中,對視頻幀進(jìn)行渲染是一個重要的環(huán)節(jié)。

傳統(tǒng)移動端的視頻編輯軟件都是通過使用一定的特效算法在cpu中對視頻圖像數(shù)據(jù)通過遍歷計算進(jìn)行特效處理,cpu的計算單元有限其并行計算功能并不是很強(qiáng)大,占用了大量的計算時間和計算內(nèi)存,用cpu進(jìn)行視頻特效渲染效率低下,且占用大量的內(nèi)存,在計算過程中容易出現(xiàn)畫面卡頓,處理效率都低,且在計算過程中,終端發(fā)熱嚴(yán)重。



技術(shù)實現(xiàn)要素:

本發(fā)明的目的旨在提供一種視頻特效渲染方法、裝置及終端,可部分或者全部解決上述問題,提高了視頻渲染的效率,cpu占用內(nèi)存下,計算時間縮短,在計算的過程中,終端有輕微發(fā)熱。

為了實現(xiàn)上述目的,本發(fā)明提供以下技術(shù)方案:

一種視頻特效渲染方法,包括:

響應(yīng)于用戶指令,對獲取的視頻源進(jìn)行解碼,以得到特定格式的第一視頻幀數(shù)據(jù);

將所述第一視頻幀數(shù)據(jù)及預(yù)設(shè)的特效參數(shù)向gpu發(fā)送,以使得gpu完成對該第一視頻幀數(shù)據(jù)的渲染;

從gpu獲取第二視頻幀數(shù)據(jù)進(jìn)行編碼以得到目標(biāo)特效視頻,其中該第二視頻幀數(shù)據(jù)為gpu對所述第一視頻幀數(shù)據(jù)進(jìn)行渲染得到。

進(jìn)一步地,所述將所述第一視頻幀數(shù)據(jù)及預(yù)設(shè)的特效參數(shù)向gpu發(fā)送,以使得gpu完成對該第一視頻幀數(shù)據(jù)的渲染的步驟中,具體包括:

初始化視頻特效的渲染環(huán)境,向gpu發(fā)送渲染指令,以使得gpu響應(yīng)于該渲染指令完成對該第一視頻幀數(shù)據(jù)的渲染。

進(jìn)一步地,所述初始化視頻特效的渲染環(huán)境,并向gpu發(fā)送渲染指令,以使得gpu響應(yīng)于該渲染指令完成對該第一視頻幀數(shù)據(jù)的渲染的步驟中,具體包括:

獲取對所述目標(biāo)視頻進(jìn)行特效渲染的第一平臺的上下文環(huán)境及用于將所述第二視頻幀顯示在設(shè)備上的對象,其中,所述第一平臺的上下文環(huán)境通過eglgetcurrentcontext函數(shù)獲得,所述第二視頻幀顯示在設(shè)備上的對象通過eglgetcurrentcontext函數(shù)獲得;

創(chuàng)建用于處理所述第一視頻幀數(shù)據(jù)的對象;

加載用于執(zhí)行渲染操作的shader程序,對所述shader程序進(jìn)行編譯。

進(jìn)一步地,所述創(chuàng)建用于處理所述第一視頻幀數(shù)據(jù)的對象的步驟中,具體包括:

創(chuàng)建緩存所述渲染畫面數(shù)據(jù)的緩沖區(qū)對象。

進(jìn)一步地,所述緩沖區(qū)對象包括渲染緩存區(qū)對象和/或讀取緩存區(qū)對象。

進(jìn)一步地,所述創(chuàng)建用于處理所述第一視頻幀數(shù)據(jù)的對象的步驟中,具體包括:

創(chuàng)建用于繪制所述第一視頻幀數(shù)據(jù)經(jīng)渲染后的視頻幀數(shù)據(jù)的幀緩存對象。

進(jìn)一步地,所述創(chuàng)建用于處理所述第一視頻幀數(shù)據(jù)的對象的步驟中,具體包括:

創(chuàng)建視頻圖像畫面紋理對象;

填充所述第一視頻幀數(shù)據(jù)到所述紋理對象中。

進(jìn)一步地,所述從gpu獲取第二視頻幀數(shù)據(jù)進(jìn)行編碼以得到目標(biāo)特效視頻,其中該第二視頻幀數(shù)據(jù)為gpu對所述第一視頻幀數(shù)據(jù)進(jìn)行渲染得到的步驟之后,具體包括:

顯示所述目標(biāo)特效視頻。

進(jìn)一步地,所述響應(yīng)于用戶指令,對獲取的視頻源進(jìn)行解碼,以得到特定格式的第一視頻幀數(shù)據(jù)的步驟中,具體包括:

轉(zhuǎn)換解碼后的所述視頻源的格式以得到特定格式的第一視頻幀數(shù)據(jù)。

進(jìn)一步地,解碼后的所述視頻源的格式為4:2:0的yuv平面格式數(shù)據(jù)序列,所述第一視頻幀數(shù)據(jù)的特定格式為4:4:4的yuv平面格式數(shù)據(jù)序列。

進(jìn)一步地,所述將所述第一視頻幀數(shù)據(jù)及預(yù)設(shè)的特效參數(shù)向gpu發(fā)送,以使得gpu完成對該第一視頻幀數(shù)據(jù)的渲染的步驟中,具體包括:

將所述第一視頻幀數(shù)據(jù)進(jìn)行初始化,保存所述第一平臺的初始環(huán)境狀態(tài);

將所述渲染程序與所述第一平臺中的函數(shù)進(jìn)行綁定,開啟所述渲染程序的屬性,并向所述渲染程序中傳入所述特效參數(shù),對所述第一視頻幀進(jìn)行渲染操作;

恢復(fù)所述第一平臺的環(huán)境狀態(tài)至初始環(huán)境狀態(tài)。

進(jìn)一步地,所述將所述第一視頻幀數(shù)據(jù)進(jìn)行初始化,保存所述第一平臺的初始環(huán)境狀態(tài)的步驟中,具體包括:

加載用于獲取所述第一視頻幀頂點(diǎn)數(shù)據(jù)的shader程序,對所述shader程序進(jìn)行編譯;

通過函數(shù)創(chuàng)建用于渲染的程序。

進(jìn)一步地,所述將所述第一視頻幀數(shù)據(jù)進(jìn)行初始化,保存所述第一平臺的初始環(huán)境狀態(tài)的的步驟中,具體包括:

創(chuàng)建用于執(zhí)行保存所述第一平臺的初始環(huán)境狀態(tài)的對象。

進(jìn)一步地,所述將所述第一視頻幀數(shù)據(jù)進(jìn)行初始化,保存所述第一平臺的初始環(huán)境狀態(tài)的步驟中,具體包括:

綁定幀緩存對象和與所述幀緩對象掛接的紋理對象到所述第一平臺實現(xiàn)渲染的上下文中;

將所述特效參數(shù)傳入所述渲染程序;

調(diào)用所述第一平臺中的繪圖函數(shù)對所述第一視頻幀進(jìn)行特效渲染。

優(yōu)選地,所述特效參數(shù)包括所述特效的頂點(diǎn)數(shù)據(jù)和紋理數(shù)據(jù)。

進(jìn)一步地,所述調(diào)用所述第一平臺中的繪圖函數(shù)對所述第一視頻幀進(jìn)行特效渲染的步驟中,具體包括:

初始化所述紋理對象以及所述第一平臺實現(xiàn)紋理渲染的環(huán)境,并為所述紋理對象創(chuàng)建用于紋理渲染的屬性,其中紋理渲染的環(huán)境通過eglgetcurrentcontext函數(shù)實現(xiàn);

依據(jù)所述紋理渲染的屬性,將所述紋理數(shù)據(jù)映射到所述屬性中,設(shè)置所述紋理對象參數(shù);

創(chuàng)建渲染對象,對所述第一視頻幀進(jìn)行特效渲染。

優(yōu)選地,所述紋理對象參數(shù)包括任意一個或多個以下參數(shù),包括:頂點(diǎn)坐標(biāo)、紋理坐標(biāo)、背景顏色、旋轉(zhuǎn)角度。

進(jìn)一步地,所述恢復(fù)所述第一平臺的環(huán)境狀態(tài)至初始環(huán)境狀態(tài)的步驟中,具體包括:

從所述第一平臺中解綁所述渲染程序。

一種視頻特效渲染裝置,包括響應(yīng)單元、渲染單元、編碼單元,

所述響應(yīng)單元,用于響應(yīng)于用戶指令,對獲取的視頻源進(jìn)行解碼,以得到特定格式的第一視頻幀數(shù)據(jù);

所述渲染單元,用于將所述第一視頻幀數(shù)據(jù)及預(yù)設(shè)的特效參數(shù)向gpu發(fā)送,以使得gpu完成對該第一視頻幀數(shù)據(jù)的渲染;

所述編碼單元,用于從gpu獲取第二視頻幀數(shù)據(jù)進(jìn)行編碼以得到目標(biāo)特效視頻,其中該第二視頻幀數(shù)據(jù)為gpu對所述第一視頻幀數(shù)據(jù)進(jìn)行渲染得到。

一種視頻特效渲染終端,包括:存儲器、處理器,所述存儲器存儲有計算機(jī)程序,其特征在于,所述計算機(jī)程序被所述處理器執(zhí)行時實現(xiàn)上述方法的步驟。

相比現(xiàn)有技術(shù),本發(fā)明的方案具有以下優(yōu)點(diǎn):

本發(fā)明的視頻特效渲染方法、裝置及終端,響應(yīng)于用戶指令,對獲取的視頻源進(jìn)行解碼,以得到特定格式的第一視頻幀數(shù)據(jù);將所述第一視頻幀數(shù)據(jù)及預(yù)設(shè)的特效參數(shù)向gpu發(fā)送,以使得gpu完成對該第一視頻幀數(shù)據(jù)的渲染;gpu作為圖形處理器,專為執(zhí)行復(fù)雜的數(shù)學(xué)和幾何計算而設(shè)計的,這些計算是圖形渲染所必需的,同時gpu還具有多線程并行計算的能力,從而可實現(xiàn)對多線程圖形進(jìn)行并行處理,節(jié)約了渲染的時間,從gpu獲取第二視頻幀數(shù)據(jù)進(jìn)行編碼以得到目標(biāo)特效視頻,其中該第二視頻幀數(shù)據(jù)為gpu對所述第一視頻幀數(shù)據(jù)進(jìn)行渲染得到,第二視頻幀可再次編碼壓縮為其他格式的視頻,以便于渲染上特效的視頻能被其他工具顯示或者使用,且此步驟不在gpu上進(jìn)行,降低了gpu的載荷,提高了gpu對在視頻上渲染特效的能力。

進(jìn)一步地,通過本發(fā)明的優(yōu)選實施例方式,可實現(xiàn)具有如下優(yōu)點(diǎn):

1、本發(fā)明的視頻特效渲染方法、裝置及終端,其在gpu上主要對視頻幀進(jìn)行渲染操作,有效的利用了gpu的處理圖形的能力,使渲染過程更為流暢,且預(yù)覽的幀率高,預(yù)覽畫面流暢,降低了處理圖像過程中對cpu的占有率,縮短了視頻的渲染時長,由于gpu自身的屬性,在渲染過程中還可實現(xiàn)多線程并行運(yùn)行對視頻幀進(jìn)行特效的渲染。

2、本發(fā)明的視頻特效渲染方法、裝置及終端,cpu在對視頻幀渲染過程中,其主要作用在于解碼視頻源數(shù)據(jù)及轉(zhuǎn)換視頻源數(shù)據(jù)的格式,使得視頻源數(shù)據(jù)能順利的被gpu接收并進(jìn)行特效渲染,同時cpu還對第二視頻數(shù)據(jù)進(jìn)行編碼壓縮,使得第二視頻幀數(shù)據(jù)能夠被其他的工具使用或者顯示,有效的利用了cpu的計算能力,cpu和gpu結(jié)合對視頻幀進(jìn)行特效渲染,釋放了大量的渲染過程中占用的cpu的內(nèi)存,縮短了視頻渲染的時長,提高了移動端的整體性能,同時還降低了在視頻渲染過程中移動端的溫度。

本發(fā)明附加的方面和優(yōu)點(diǎn)將在下面的描述中部分給出,這些將從下面的描述中變得明顯,或通過本發(fā)明的實踐了解到。

附圖說明

本發(fā)明上述的和/或附加的方面和優(yōu)點(diǎn)從下面結(jié)合附圖對實施例的描述中將變得明顯和容易理解,其中:

圖1為本發(fā)明的一種視頻特效渲染方法流程圖;

圖2為本發(fā)明的一種視頻特效渲染裝置結(jié)構(gòu)示意圖。

具體實施方式

下面詳細(xì)描述本發(fā)明的實施例,所述實施例的示例在附圖中示出,其中自始至終相同或類似的標(biāo)號表示相同或類似的元件或具有相同或類似功能的元件。下面通過參考附圖描述的實施例是示例性的,僅用于解釋本發(fā)明,而不能解釋為對本發(fā)明的限制。

本技術(shù)領(lǐng)域技術(shù)人員可以理解,除非特意聲明,這里使用的單數(shù)形式“一”、“一個”、“所述”和“該”也可包括復(fù)數(shù)形式。應(yīng)該進(jìn)一步理解的是,本發(fā)明的說明書中使用的措辭“包括”是指存在所述特征、整數(shù)、步驟、操作、元件和/或組件,但是并不排除存在或添加一個或多個其他特征、整數(shù)、步驟、操作、元件、組件和/或它們的組。應(yīng)該理解,當(dāng)我們稱元件被“連接”或“耦接”到另一元件時,它可以直接連接或耦接到其他元件,或者也可以存在中間元件。此外,這里使用的“連接”或“耦接”可以包括無線連接或無線耦接。這里使用的措辭“和/或”包括一個或更多個相關(guān)聯(lián)的列出項的全部或任一單元和全部組合。

本技術(shù)領(lǐng)域技術(shù)人員可以理解,除非另外定義,這里使用的所有術(shù)語(包括技術(shù)術(shù)語和科學(xué)術(shù)語),具有與本發(fā)明所屬領(lǐng)域中的普通技術(shù)人員的一般理解相同的意義。還應(yīng)該理解的是,諸如通用字典中定義的那些術(shù)語,應(yīng)該被理解為具有與現(xiàn)有技術(shù)的上下文中的意義一致的意義,并且除非像這里一樣被特定定義,否則不會用理想化或過于正式的含義來解釋。

視頻特效渲染是通過視頻渲染器將選定的圖片或者圖畫等與視頻幀進(jìn)行合成,使視頻看起來更加生動,而特效渲染的軟件有多種,本發(fā)明優(yōu)選的實施例以opengl接口并結(jié)合gpu和cpu共同實現(xiàn)視頻的特效渲染,gpu(圖形處理單元)采用了數(shù)量眾多的計算單元和超長的流水線,但只有非常簡單的控制邏輯并省去了cache(高速緩沖存儲器),gpu擅長的是大規(guī)模的并發(fā)計算;opengl(opengraphicslibrary)是定義了一個跨編程語言、跨平臺的編程接口規(guī)格的專業(yè)的圖形程序接口,它用于三維圖象(二維的亦可),是一個功能強(qiáng)大、調(diào)用方便的底層圖形庫。opengles(openglforembeddedsystems)是opengl三維圖形api的子集,針對手機(jī)、pda和游戲主機(jī)等嵌入式設(shè)備而設(shè)計;shader語言是一種專門用于進(jìn)行圖形編程的高級語言,是繼承自c語言發(fā)展而來,除了具備c語言的一般特征外,同時還具有其他著色語言的一些優(yōu)良的特征。相對傳統(tǒng)的通用編程語言,shader語言提供了更加豐富的原生類型,如向量、矩陣等,簡化了開發(fā)的流程,shader著色語言加入的新特性的使其在3d圖形處理方面更加簡潔、高效。

一種視頻特效渲染方法,如圖1所示,包括步驟s100-s300。

s100:響應(yīng)于用戶指令,對獲取的視頻源進(jìn)行解碼,以得到特定格式的第一視頻幀數(shù)據(jù)。

用戶確定了需要進(jìn)行特效渲染的視頻后,將其發(fā)送給客戶端,且用戶還向客戶端發(fā)送渲染指令,客戶端接收到用戶的指令后,開始對確定的視頻源進(jìn)行解碼,將視頻源的幀數(shù)據(jù)格式解碼為特定的便于客戶端被識別的圖像數(shù)據(jù)格式,以便于對視頻幀進(jìn)行特效渲染,本步驟的執(zhí)行主體可以是一種具備視頻幀渲染功能的客戶端軟件,也可以是一種僅具有單一視頻幀渲染功能的客戶端軟件,本步驟數(shù)據(jù)運(yùn)算過程在cpu中運(yùn)行計算,由于本發(fā)明實施例需要通過gpu對yuv數(shù)據(jù)進(jìn)行處理,而cpu將視頻解碼得到y(tǒng)uv數(shù)據(jù)后,將yuv數(shù)據(jù)存儲到內(nèi)存中,而gpu無法讀取到內(nèi)存中的數(shù)據(jù),基于此,本發(fā)明實施例的cpu將需要播放的當(dāng)前視頻幀進(jìn)行解碼得到y(tǒng)uv數(shù)據(jù),并將所述yuv數(shù)據(jù)置于gpu能夠訪問的數(shù)據(jù)組中,這樣能夠方便gpu進(jìn)行讀取。具體的,本發(fā)明實施例在移動終端中設(shè)置了能夠讓gpu訪問的數(shù)據(jù)組,cpu將yuv數(shù)據(jù)存儲到數(shù)據(jù)組中,并觸發(fā)gpu進(jìn)行讀取;本發(fā)明實施例gpu在讀取數(shù)據(jù)組的數(shù)據(jù)之前,先根據(jù)腳本程序綁定數(shù)據(jù)組,然后就可以讀取綁定的數(shù)據(jù)組的數(shù)據(jù);在實施中,可以在處理整個視頻文件之前綁定一次,后續(xù)就可以對每幀視頻進(jìn)行處理,也可以對視頻幀的每一幀數(shù)據(jù)在處理前分別進(jìn)行綁定。

s200:將所述第一視頻幀數(shù)據(jù)及預(yù)設(shè)的特效參數(shù)向gpu發(fā)送,以使得gpu完成對該第一視頻幀數(shù)據(jù)的渲染。

如前所述,cpu將解碼后的視頻源的幀數(shù)據(jù)以組的方式存儲在數(shù)據(jù)組中,得到第一視頻幀數(shù)據(jù),cpu向gpu發(fā)送數(shù)據(jù)處理完成的指令,使得gpu可以從cpu中獲取所述第一視頻幀數(shù)據(jù),從而解放數(shù)據(jù)組在cpu中所占用的內(nèi)存,gpu獲取到第一視頻幀數(shù)據(jù)后,gpu對所述第一視頻幀數(shù)據(jù)進(jìn)行處理,以得到進(jìn)行過特效渲染的視頻的幀數(shù)據(jù),在發(fā)明中,用于執(zhí)行渲染的是opengl,gpu獲取到所述第一視頻幀數(shù)據(jù)后,需要調(diào)用opengl中執(zhí)行渲染操作的函數(shù),以便于gpu能根據(jù)opengl中的函數(shù)對第一視頻幀數(shù)據(jù)進(jìn)行處理,其具體運(yùn)算實現(xiàn)方法在后文進(jìn)行詳述。

s300:從gpu獲取第二視頻幀數(shù)據(jù)進(jìn)行編碼以得到目標(biāo)特效視頻,其中該第二視頻幀數(shù)據(jù)為gpu對所述第一視頻幀數(shù)據(jù)進(jìn)行渲染得到。

cpu從gpu中獲取已經(jīng)渲染好的視頻幀數(shù)據(jù),即第二視頻幀數(shù)據(jù),cpu對所述第二視頻幀數(shù)據(jù)進(jìn)行編碼壓縮為其他的數(shù)據(jù)格式或者通用數(shù)據(jù)格式,如4:2:2的yuv數(shù)據(jù)格式,其編碼壓縮第二視頻幀數(shù)據(jù)主要是便于其他的工具能夠利用第二視頻幀數(shù)據(jù)得到有效的目標(biāo)特效視頻,和/或其通過顯示裝置顯示出帶有特效的目標(biāo)特效視頻,第二視頻幀數(shù)據(jù)由第一視頻幀數(shù)據(jù)得到,并且是在gpu上實現(xiàn)的該過程,即gpu對所述第一視頻幀數(shù)據(jù)進(jìn)行處理得到第二視頻幀數(shù)據(jù),具體處理過程后文詳述。

進(jìn)一步地,將所述第一視頻幀數(shù)據(jù)及預(yù)設(shè)的特效參數(shù)向gpu發(fā)送,以使得gpu完成對該第一視頻幀數(shù)據(jù)的渲染的s200步驟中,具體包括:

s210:初始化視頻特效的渲染環(huán)境,向gpu發(fā)送渲染指令,以使得gpu響應(yīng)于該渲染指令完成對該第一視頻幀數(shù)據(jù)的渲染。

對視頻特效進(jìn)行渲染之前需要對進(jìn)行視頻的渲染環(huán)境進(jìn)行初始化,以使得渲染環(huán)境中包含的屬性能夠?qū)崿F(xiàn)對視頻的特效渲染,其中,在初始化之前,需要設(shè)置視頻特效相關(guān)的參數(shù),其可以在渲染工具中設(shè)置,也可以是搭載所述渲染工具的系統(tǒng)上設(shè)置,在渲染環(huán)境初始化完成之后,實現(xiàn)渲染的平臺或者工具向gpu發(fā)送渲染指令,使得gpu能在前述的渲染環(huán)境下對需要渲染的視頻幀數(shù)據(jù)進(jìn)行特效渲染,此處,需要渲染的視頻幀數(shù)據(jù)為第一視頻幀數(shù)據(jù)。

具體地,在其中一種實施例中,對視頻幀實現(xiàn)特效渲染的平臺或者工具為opengl,當(dāng)然,也可以是mediashowespresso或者directx等其他的實現(xiàn)對視頻特效的渲染的接口或者應(yīng)用程序,初始化之前,在opengl中設(shè)置視頻特效相關(guān)的參數(shù),或者在搭載opengl的系統(tǒng)上設(shè)置視頻特效相關(guān)的參數(shù),初始化視頻特效的渲染環(huán)境主要包括了確定進(jìn)行渲染的終端的物理層的硬件設(shè)備的配置可以用于進(jìn)行渲染,如內(nèi)存、運(yùn)算速率等,和/或包括了進(jìn)行特效渲染的應(yīng)用層的系統(tǒng)的配置,如應(yīng)用層的插件、控件、語言環(huán)境等,只有在環(huán)境條件滿足對視頻幀的特效渲染時,才能對視頻進(jìn)行特效渲染,環(huán)境條件滿足后,opengl向?qū)崿F(xiàn)運(yùn)算的硬件設(shè)備(gpu)發(fā)送渲染的指令,硬件設(shè)備才開始運(yùn)算,對視頻幀數(shù)據(jù)進(jìn)行處理,以獲得帶有特效的視頻幀數(shù)據(jù)(第二視頻幀數(shù)據(jù)),opengl調(diào)用函數(shù)向gpu發(fā)送渲染的指令,函數(shù)以映射關(guān)系存儲在opengl的數(shù)據(jù)庫中,渲染的指令包括了對視頻幀進(jìn)行渲染所需的特效以及各個特效作用的時間區(qū)間等,在進(jìn)行渲染的時候,可以是同時對一個視頻的多線程在gpu中進(jìn)行特效渲染,也可以是多個視頻多線程的在gpu中進(jìn)行特效渲染,對于單個視頻特效,輸入一幀第一視頻幀數(shù)據(jù),輸入輸出的視頻幀數(shù)不發(fā)生改變,輸出的任然是一幀經(jīng)過處理后的第一視頻幀數(shù)據(jù)的圖像數(shù)據(jù),輸出的被處理過的所述第一視頻幀數(shù)據(jù)為第二視頻幀數(shù)據(jù);對于多個視頻素材的特效處理,會有兩組第一視頻幀數(shù)據(jù)的圖像數(shù)據(jù)序列作為輸入源,分別為切出視頻結(jié)尾的n幀圖像數(shù)據(jù),和切入的開頭的n幀圖像數(shù)據(jù),同時需要有n幀yuv視頻格式的圖像數(shù)據(jù)作為輸出,n的取值為一個常數(shù),其值由用戶確定,在渲染之前,第一視頻幀數(shù)據(jù)攜帶有視頻幀在同一個視頻幀中的順序標(biāo)識和同一個視頻幀源的標(biāo)識,以便于渲染輸出后的視頻幀數(shù)據(jù)可以按照視頻源的視頻幀的排列順序進(jìn)行排列。

進(jìn)一步地,所述初始化視頻特效的渲染環(huán)境,并向gpu發(fā)送渲染指令,以使得gpu響應(yīng)于該渲染指令完成對該第一視頻幀數(shù)據(jù)的渲染的步驟s210中,具體包括步驟s211至s213。

s211:獲取對所述目標(biāo)視頻進(jìn)行特效渲染的第一平臺的上下文環(huán)境及用于將所述第二視頻幀顯示在設(shè)備上的對象,其中,所述第一平臺的上下文環(huán)境通過eglgetcurrentcontext函數(shù)獲得,所述第二視頻幀顯示在設(shè)備上的對象通過eglgetdisplay函數(shù)獲得。

如前所述,在對視頻幀進(jìn)行特效渲染之前,需要對初始化進(jìn)行視頻幀的特效渲染的環(huán)境,其中包括視頻幀經(jīng)過特效渲染完成后將要顯示的系統(tǒng)顯示設(shè)備對象,以便于渲染完成后的視頻幀可以通過顯示設(shè)備對象顯示在顯示裝置上,顯示裝置可以是手機(jī)、電腦顯示屏、電視機(jī)等其他可以顯示視頻的裝置;其中還包括了提供渲染函數(shù)使得gpu可根據(jù)渲染函數(shù)進(jìn)行運(yùn)算而得到渲染后的視頻幀數(shù)據(jù)的渲染工具或平臺的上下文環(huán)境,其中工具可為前述opengl等應(yīng)用程序,平臺可以為搭載opengl工具的且opengl可進(jìn)行渲染操作的系統(tǒng)或者opengl等,系統(tǒng)如安卓系統(tǒng)、ios系統(tǒng)、windows系統(tǒng)等,平臺也可以是opengl,其他用于渲染的工具或者應(yīng)用程序同理,在此不做贅述,從而對第一視頻幀數(shù)據(jù)進(jìn)行運(yùn)算,實現(xiàn)對視頻幀進(jìn)行二維渲染或者三維渲染的特效渲染,初始化具體包括選擇像素格式、申請顯存、選擇顯示設(shè)備(有些設(shè)備可能有不只一個顯示器)、選擇某些特性(某一個特效所必須具備的屬性)、指定當(dāng)前的環(huán)境為繪制環(huán)境等;當(dāng)有多個繪制環(huán)境,每個環(huán)境有不同參數(shù),需要在這些環(huán)境中切換(如同時在兩個顯示器上繪制不同的畫面),所以必須指定當(dāng)前的繪制環(huán)境。

具體的,在此步驟中,opengl和承載opengl的系統(tǒng)之間還包括了一個中間的接口egl,使得opengl和本地系統(tǒng)可通過egl連接起來,因此,egl調(diào)用與其連接的數(shù)據(jù)庫中的eglgetcurrentcontext函數(shù)獲取opengl的上下文環(huán)境,使得在渲染過程中可以調(diào)用與opengl連接的數(shù)據(jù)庫中函數(shù)對視頻幀進(jìn)行渲染,換而言之,gpu可以通過與opengl連接的數(shù)據(jù)庫中的函數(shù)對第一視頻幀數(shù)據(jù)進(jìn)行處理,從而獲得第二視頻幀數(shù)據(jù),同理可得,egl調(diào)用與其連接的數(shù)據(jù)庫中的eglgetdisplay函數(shù)獲得以視頻幀形式顯示第二視頻幀數(shù)據(jù)的顯示設(shè)備對象,顯示設(shè)備對象可以為電腦的顯示屏、手機(jī)顯示屏等,且顯示屏以一對象的形式存在于系統(tǒng)的程序或者opengl中,且該對象可被其他的應(yīng)用程序和/或系統(tǒng)調(diào)用,如opengl和/或安卓等。

s212:創(chuàng)建用于處理所述第一視頻幀數(shù)據(jù)的對象。

在進(jìn)行視頻幀渲染過程中,第一視頻幀數(shù)據(jù)經(jīng)過底層的opengl、系統(tǒng)以及gpu中的處理之后才能得到第二視頻幀數(shù)據(jù),由于opengl為視頻幀的渲染過程僅提供了基本程序框架,因此為了方便處理第一視頻幀數(shù)據(jù),在opengl中和/或承載opengl的平臺中創(chuàng)建用于處理第一視頻幀的數(shù)據(jù)的對象,其具體創(chuàng)建的對象在后文詳述,在此不做贅述。

s213:加載用于執(zhí)行渲染操作的shader程序,對所述shader程序進(jìn)行編譯。

如前文所述,opengl為視頻幀的渲染過程提供了基本程序框架,為優(yōu)化其對視頻的渲染過程,創(chuàng)建了具有不同功能的對象,同樣opengl在本有的框架基礎(chǔ)上,為視頻幀渲染提供了一個固定管線的渲染管線,使視頻幀渲染過程在研發(fā)人員控制的范圍內(nèi),加載shader(著色器),shader是用來替代固定渲染管線的可編輯程序,主要目的是實現(xiàn)圖像渲染,shader可以直接從gpu的計算得到相應(yīng)的顏色參數(shù),編譯shader即為加載用于渲染視頻幀的程序,shader包括頂點(diǎn)shader和像素shader,頂點(diǎn)3d圖形都是由一個一個三角形組成的,頂點(diǎn)shader就是計算頂點(diǎn)位置,并為后期像素渲染做準(zhǔn)備的,像素shader以像素為單位,計算光照、顏色的一系列算法。在opengl中頂點(diǎn)shader也叫做vertexshader,像素shader叫做fragmentshader。

進(jìn)一步地,所述創(chuàng)建用于處理所述第一視頻幀數(shù)據(jù)的對象的步驟s212中,具體包括步驟s2121。

s2121:創(chuàng)建緩存所述渲染畫面數(shù)據(jù)的緩沖區(qū)對象。

創(chuàng)建緩存所述渲染畫面數(shù)據(jù)的緩沖區(qū)對象主要用來存儲gpu渲染后的畫面數(shù)據(jù),在渲染完成之后,可以從該存儲區(qū)讀取到渲染的畫面數(shù)據(jù),其中,緩沖區(qū)對象為一段程序,用于劃分存儲渲染后的畫面數(shù)據(jù)的內(nèi)存,緩沖區(qū)對象可以存在于對視頻幀進(jìn)行渲染的工具中,也可以是在搭載渲染工具的應(yīng)用程序或者系統(tǒng)中,劃分一部分渲染工具、應(yīng)用程序或者系統(tǒng)的存儲空間用于存儲gpu渲染后的畫面數(shù)據(jù),并在在渲染完成之后,可以從該存儲區(qū)讀取到渲染的畫面數(shù)據(jù),如果是在搭載渲染工具的應(yīng)用程序或者系統(tǒng)中,則該渲染緩沖區(qū)對象與渲染工具搭接,使得gpu渲染完成后的畫面數(shù)據(jù)可以存儲在渲染緩沖區(qū)對象中。

具體的,若渲染的工具為opengl,則緩沖區(qū)對象從opengl劃分出來的一部分存儲空間為緩沖區(qū),用于存儲gpu渲染后的畫面數(shù)據(jù),在渲染完成之后,可以從該存儲區(qū)讀取到渲染的畫面數(shù)據(jù),若渲染的工具為opengl,則緩沖區(qū)對象從內(nèi)存或硬盤虛擬內(nèi)存的一部分為所述緩沖區(qū),用于臨時存儲gpu渲染后的畫面數(shù)據(jù),在渲染完成之后,可以從該區(qū)中讀取到渲染的畫面數(shù)據(jù)。

進(jìn)一步地,所述緩沖區(qū)對象包括渲染緩存區(qū)對象和/或讀取緩存區(qū)對象。

緩沖區(qū)對象的緩存區(qū)對象用于存儲渲染視頻特效畫面數(shù)據(jù),讀取緩存區(qū)對象用于讀取渲染的視頻特效畫面數(shù)據(jù),渲染視頻特效畫面數(shù)據(jù)到渲染緩存區(qū),渲染完成后標(biāo)記該緩存區(qū)畫面數(shù)據(jù)有效;交換渲染緩存區(qū)和讀取緩存區(qū)對象;從讀取緩存區(qū)中讀取渲染畫面數(shù)據(jù),讀取完成后標(biāo)記該渲染緩存區(qū)畫面數(shù)據(jù)無效;兩個緩存區(qū)對象可以在多線程環(huán)境下同時進(jìn)行處理,減少渲染和讀取過程相互等待的時間,從而提高視頻特效渲染的處理效率,進(jìn)一步的,為了更快速的通過讀取緩存區(qū)讀取到渲染后的視頻特效畫面,egl還創(chuàng)建了eglimage對象,該對象主要是用來加速從gpu中讀取渲染后的畫面數(shù)據(jù),使得渲染后的畫面數(shù)據(jù)可以通過egl可以為本地系統(tǒng)利用。

進(jìn)一步地,所述創(chuàng)建用于處理所述第一視頻幀數(shù)據(jù)的對象的步驟s212中,具體包括步驟s2122。

s2122:創(chuàng)建用于繪制所述第一視頻幀數(shù)據(jù)經(jīng)渲染后的視頻幀數(shù)據(jù)的幀緩存對象。

幀緩存對象也簡稱為fbo,用來接收渲染工具或者渲染平臺的渲染結(jié)果,而不用將渲染結(jié)果直接繪制在默認(rèn)的幀緩存對象上,相對默認(rèn)的幀緩存對象,在需要顯示渲染的結(jié)果時,幀緩存對象可以直接將渲染結(jié)果顯示在顯示裝置上,而默認(rèn)的幀緩存對象是直接在顯示裝置上繪制結(jié)果,其效率相對新建的幀緩存對象慢得多,幀緩存對象由渲染工具創(chuàng)建且存在于渲染工具中,即使渲染工具搭載在系統(tǒng)或者應(yīng)用程序中,幀緩存對象完全受渲染工具的控制,fbo也包含一些存儲顏色、深度和模板數(shù)據(jù)的區(qū)域,為可以和幀緩存對象關(guān)聯(lián)起來的二維數(shù)組像素。

具體的,如若渲染工具為opengl,opengl搭載在系統(tǒng)或者應(yīng)用程序中,則glextframebufferobject提供了一種創(chuàng)建額外的不能顯示的幀緩存對象的接口,幀緩存對象與opengl連接,其完全受opengl的控制,通過使用幀緩存對象(fbo),opengl可以將顯示輸出到引用程序幀緩存對象,若opengl未有任何搭載,幀緩存對象存在與opengl中,其同樣完全受opengl的控制,通過使用幀緩存對象(fbo),opengl可以將顯示輸出到引用程序幀緩存對象。

進(jìn)一步地,所述創(chuàng)建用于處理所述第一視頻幀數(shù)據(jù)的對象的步驟s212中,具體包括步驟s2123至步驟s2124。

s2123:創(chuàng)建視頻圖像畫面紋理對象;

紋理對象是內(nèi)部數(shù)據(jù)類型,存儲著紋理數(shù)據(jù)和選項等,紋理對象封裝了和紋理貼圖或者視頻圖像畫面相關(guān)聯(lián)的各種狀態(tài)設(shè)置,紋理對象不能被直接訪問它,但是可以通過一個整數(shù)的id來作為其句柄(handler)進(jìn)行跟蹤;為了分配到一個唯一的id,opengl提供了glgentextures函數(shù)來獲取一個有效的id標(biāo)識值:voidglgentexture(glsizein,gluint*texture);texture是一個數(shù)組,用于存儲分配到的n個id值。在調(diào)用一次glgentextures后,會將分配到的id標(biāo)識為'已用'。

s2124:填充所述第一視頻幀數(shù)據(jù)到所述紋理對象中。

由前述可知,紋理對象創(chuàng)建時為空的數(shù)據(jù),需要在其中填充數(shù)據(jù),使得紋理才能在渲染的被使用,紋理對象封裝了和紋理貼圖相關(guān)的各種狀態(tài)的設(shè)置,因此填充所述第一視頻幀數(shù)據(jù)得到所述紋理對象中,使得紋理對象將所述第一視頻幀的數(shù)據(jù)封裝起來,即紋理對象與第一視頻幀數(shù)據(jù)以映射關(guān)系關(guān)聯(lián)起來。具體的,渲染工具為opengl時,紋理對象被創(chuàng)建在opengl中。

進(jìn)一步地,所述從gpu獲取第二視頻幀數(shù)據(jù)進(jìn)行編碼以得到目標(biāo)特效視頻,其中該第二視頻幀數(shù)據(jù)為gpu對所述第一視頻幀數(shù)據(jù)進(jìn)行渲染得到的步驟s300之后,具體包括步驟s310。

s310:顯示所述目標(biāo)特效視頻。

第一視頻幀數(shù)據(jù)經(jīng)特效渲染處理后得到第二視頻幀數(shù)據(jù),為了使用戶或者開發(fā)人員能直觀的觀看到特效渲染后的視頻幀,或者將第二視頻幀數(shù)據(jù)能被其他程序調(diào)用,將所述第二視頻幀數(shù)據(jù)進(jìn)行編碼壓縮,從而得到目標(biāo)特效視頻,編碼壓縮可以為轉(zhuǎn)換第二視頻幀數(shù)據(jù)的格式,壓縮為盡可能保證視覺效果的前提下減少視頻數(shù)據(jù)率,壓縮包括有損和無損壓縮、幀內(nèi)和幀間壓縮、對稱和不對稱編碼,無損壓縮也即壓縮前和解壓縮后的數(shù)據(jù)完全一致,多數(shù)的無損壓縮都采用rle行程編碼算法,有損壓縮意味著解壓縮后的數(shù)據(jù)與壓縮前的數(shù)據(jù)不一致。在壓縮的過程中要丟失一些人眼和人耳所不敏感的圖像或音頻信息;幀內(nèi)壓縮僅考慮一幀的數(shù)據(jù)而不考慮相鄰幀之間的冗余信息,這實際上與靜態(tài)圖像壓縮類似。幀內(nèi)一般采用有損壓縮算法,由于幀內(nèi)壓縮時各個幀之間沒有相互關(guān)系,所以壓縮后的視頻數(shù)據(jù)仍可以以幀為單位進(jìn)行編輯,幀間壓縮是基于許多視頻或動畫的連續(xù)前后兩幀具有很大的相關(guān)性,或者說前后兩幀信息變化很小的特點(diǎn),也即連續(xù)的視頻其相鄰幀之間具有冗余信息,壓縮相鄰幀之間的冗余量就可以進(jìn)一步提高壓縮量,幀間壓縮也稱為時間壓縮(temporalcompression),它通過比較時間軸上不同幀之間的數(shù)據(jù)進(jìn)行壓縮,幀間壓縮一般是無損的,幀差值(framedifferencing)算法是一種典型的時間壓縮法,它通過比較本幀與相鄰幀之間的差異,僅記錄本幀與其相鄰幀的差值,對稱性(symmetric)是壓縮編碼的一個關(guān)鍵特征;對稱編碼意味著壓縮和解壓縮占用相同的計算處理能力和時間,不對稱編碼意味著壓縮時需要花費(fèi)大量的處理能力和時間,而解壓縮時則能較好地實時回放,也即以不同的速度進(jìn)行壓縮和解壓縮;經(jīng)過前述的處理過程后得到的目標(biāo)視頻幀,就可以被顯示裝置顯示,具體的,如第一視頻幀數(shù)據(jù)經(jīng)opengl特效渲染后得到第二視頻幀數(shù)據(jù),第二視頻幀數(shù)據(jù)再經(jīng)過opengl的編碼壓縮得到目標(biāo)特效視頻,就可以被顯示裝置顯示了,其中顯示裝置可以為電腦顯示屏、電視或者手機(jī)等。

進(jìn)一步地,所述響應(yīng)于用戶指令,對獲取的視頻源進(jìn)行解碼,以得到特定格式的第一視頻幀數(shù)據(jù)的步驟s100中,具體包括步驟s110。

s110:轉(zhuǎn)換解碼后的所述視頻源的格式以得到特定格式的第一視頻幀數(shù)據(jù)。

由于gpu只能識別指定格式的數(shù)據(jù),視頻源的數(shù)據(jù)不是gpu能識別的數(shù)據(jù)格式時,需要將視頻源數(shù)據(jù)進(jìn)行轉(zhuǎn)換解碼為gpu能識別的數(shù)據(jù)格式,使得在后續(xù)對視頻源數(shù)據(jù)進(jìn)行特效渲染時,gpu可根據(jù)渲染工具的指令對視頻源的數(shù)據(jù)進(jìn)行運(yùn)算,從而得到渲染后的視頻幀數(shù)據(jù),即第二視頻幀數(shù)據(jù)。

具體的,視頻源經(jīng)過解碼后的數(shù)據(jù)通常都是yuv(4:2:0)平面格式的數(shù)據(jù)序列,但是gpu無法識別yuv(4:2:0)格式的數(shù)據(jù),因此,在圖像數(shù)據(jù)輸入到gpu之前必須先對其進(jìn)行格式轉(zhuǎn)換,變成yuv(4:4:4)格式排列的數(shù)據(jù)后才能輸入到gpu中去,opengl向gpu發(fā)送渲染指令后,gpu可根據(jù)opengl調(diào)用的函數(shù)對前述的第一視頻幀數(shù)據(jù)進(jìn)行處理從而得到第二視頻幀數(shù)據(jù)。

進(jìn)一步地,解碼后的所述視頻源的格式為4:2:0的yuv平面格式數(shù)據(jù)序列,所述第一視頻幀數(shù)據(jù)的特定格式為4:4:4的yuv平面格式數(shù)據(jù)序列。

如前所述,在其中一種實施例中,解碼后的所述視頻源的格式為4:2:0的yuv平面格式數(shù)據(jù)序列,所述第一視頻幀數(shù)據(jù)的特定格式為4:4:4的yuv平面格式數(shù)據(jù)序列,使得gpu可根據(jù)opengl調(diào)用的函數(shù)對第一視頻幀數(shù)據(jù)進(jìn)行處理得到第二視頻幀數(shù)據(jù)。

進(jìn)一步地,所述將所述第一視頻幀數(shù)據(jù)及預(yù)設(shè)的特效參數(shù)向gpu發(fā)送,以使得gpu完成對該第一視頻幀數(shù)據(jù)的渲染的步驟s200中,具體包括步驟s220至步驟s240。

s220:將所述第一視頻幀數(shù)據(jù)進(jìn)行初始化,保存所述第一平臺的初始環(huán)境狀態(tài)。

將所述第一視頻幀數(shù)據(jù)進(jìn)行初始化,主要是將第一視頻幀數(shù)據(jù)設(shè)為默認(rèn)值,使得第一視頻幀數(shù)據(jù)做好了被渲染的準(zhǔn)備,保存所述第一平臺的初始環(huán)境狀態(tài),即保存opengl渲染前為渲染做的前述準(zhǔn)備工作,也可以是保存搭載opengl的系統(tǒng)或者應(yīng)用程序在渲染前為渲染做的準(zhǔn)備,如前述的創(chuàng)建對象和/或獲取對象等,當(dāng)然opengl也可以是其他的前述的用于渲染的工具。

s230:將所述渲染程序與所述第一平臺中的函數(shù)進(jìn)行綁定,開啟所述渲染程序的屬性,并向所述渲染程序中傳入所述特效參數(shù),對所述第一視頻幀進(jìn)行渲染操作。

將渲染程序與所述第一平臺中函數(shù)進(jìn)行綁定,使得在渲染過程,渲染程序可以調(diào)用所述第一平臺中函數(shù)對所述第一視頻幀數(shù)據(jù)進(jìn)行處理,gpu也可以根據(jù)所述第一平臺中的函數(shù)對所述第一視頻幀數(shù)據(jù)進(jìn)行運(yùn)算以得到第二視頻幀數(shù)據(jù),為了使渲染的結(jié)果為預(yù)設(shè)效果,開啟渲染程序的屬性,可以增加或者減少渲染的流程,或者對數(shù)據(jù)處理的步驟,在渲染程序包含了預(yù)設(shè)特效的參數(shù)時,渲染程序以所述特效參數(shù)為依據(jù),將所述特效參數(shù)賦值到所述第一平臺中的函數(shù)中時,第一視頻幀數(shù)據(jù)才能被gpu運(yùn)算得到第二視頻幀數(shù)據(jù),即為對所述第一視頻幀進(jìn)行渲染操作。

具體的,將渲染程序與opengl中的函數(shù)綁定,其中,opengl可以是搭載在系統(tǒng)或者應(yīng)用程序中,也可以是單獨(dú)的opengl渲染工具,渲染程序可以是前述的對象或者是新建的與前述對象連接的,開啟渲染程序的屬性,可以增加或者減少渲染的流程,或者對數(shù)據(jù)處理的步驟,向所述渲染程序傳入所述特效參數(shù),渲染程序以所述特效參數(shù)為依據(jù),將所述特效參數(shù)賦值到opengl的函數(shù)中時,第一視頻幀數(shù)據(jù)才能被gpu運(yùn)算得到第二視頻幀數(shù)據(jù),即為對所述第一視頻幀進(jìn)行渲染操作,例如,執(zhí)行渲染操作,調(diào)用gluseprogram函數(shù)綁定渲染程序,調(diào)用glbindbuffer函數(shù)綁定頂點(diǎn)數(shù)組對象,調(diào)用glenablevertexattribarray開啟頂點(diǎn)數(shù)組屬性,調(diào)用glvertexattribpointer傳入頂點(diǎn)數(shù)據(jù)以及渲染顏色數(shù)據(jù),調(diào)用gldrawarrays函數(shù)執(zhí)行渲染操作。

s240:恢復(fù)所述第一平臺的環(huán)境狀態(tài)至初始環(huán)境狀態(tài)。

恢復(fù)所述第一平臺的環(huán)境狀態(tài)至初始環(huán)境,避免在對同一視頻源/特效進(jìn)行處理過程中,在每一幀或者連續(xù)部分幀視頻特效渲染完成后,需要每次對所述第一平臺的環(huán)境狀態(tài)進(jìn)行初始化,節(jié)約了特效渲染的流程和時間,降低了對內(nèi)存的占有率;具體的,如前所述,在每一幀或者連續(xù)部分幀視頻特效渲染完成后,將所述opengl環(huán)境狀態(tài)恢復(fù)至前述的初始化后的狀態(tài)。

進(jìn)一步地,所述將所述第一視頻幀數(shù)據(jù)進(jìn)行初始化,保存所述第一平臺的初始環(huán)境狀態(tài)的步驟s220中,具體包括步驟s221和s222。

s221:加載用于獲取所述第一視頻幀頂點(diǎn)數(shù)據(jù)的shader程序,對所述shader程序進(jìn)行編譯。

如前所述,shader著色器包括了頂點(diǎn)shader和像素shader,具體還包括了片元shader著色器,頂點(diǎn)著色器最基本的任務(wù)是接收三維空間中點(diǎn)的坐標(biāo),將其處理為二維空間中的坐標(biāo)并輸出;片元著色器最基本的任務(wù)是對需要處理的屏幕上的每個像素輸出一個顏色值,頂點(diǎn)著色器接受attribute變量和uniform變量,attribute變量存儲著關(guān)于點(diǎn)本身的數(shù)據(jù),其中最重要的當(dāng)然是點(diǎn)的位置,uniform變量存儲的數(shù)據(jù)僅僅幫助著色器完成任務(wù),著色器僅僅是需要uniform變量而并不處理他們,頂點(diǎn)著色器需要輸出varying變量給片元著色器。片元著色器的任務(wù)是給出屏幕上每個像素的顏色,片元著色器接受varying變量,varying變量是頂點(diǎn)著色器的輸出,片元著色器的處理單元是像素,將頂點(diǎn)轉(zhuǎn)化為像素的技術(shù)稱為“圖元光柵化”;對加載的頂點(diǎn)著色器和片元著色器進(jìn)行編譯鏈接,使得在渲染過程中可以調(diào)用所述頂點(diǎn)著色器和片元著色器對第一視頻幀數(shù)據(jù)進(jìn)行處理。

s222:通過函數(shù)創(chuàng)建用于渲染的程序。

如前所述,在進(jìn)行渲染前,需要創(chuàng)建渲染程序,使得渲染步驟可以跟隨渲染程序進(jìn)行,其中渲染程序有函數(shù)建成,具體的,在opengl中,創(chuàng)建渲染程序的函數(shù)是glcreatprogram。

進(jìn)一步地,所述將所述第一視頻幀數(shù)據(jù)進(jìn)行初始化,保存所述第一平臺的初始環(huán)境狀態(tài)的步驟s220中,具體包括步驟s223。

s223:創(chuàng)建用于執(zhí)行保存所述第一平臺的初始環(huán)境狀態(tài)的對象。

如前文所述,為了降低工作量以及節(jié)約渲染流程和時間,需要保存所述第一平臺的初始環(huán)境狀態(tài),即保存opengl渲染前為渲染做的前述準(zhǔn)備工作,也可以是保存搭載opengl的系統(tǒng)或者應(yīng)用程序在渲染前為渲染做的準(zhǔn)備,執(zhí)行保存opengl渲染前的初始環(huán)境狀態(tài)為一對象,所述對象包含了執(zhí)行保存opengl初始環(huán)境狀態(tài)的程序。

進(jìn)一步地,所述將所述第一視頻幀數(shù)據(jù)進(jìn)行初始化,保存所述第一平臺的初始環(huán)境狀態(tài)的的步驟s220中,具體包括步驟s224至步驟s226。

s224:綁定幀緩存對象和與所述幀緩對象掛接的紋理對象到所述第一平臺實現(xiàn)渲染的上下文中。

如前文所述,創(chuàng)建了幀緩存對象,幀緩存對象用于接收渲染工具或者所述第一平臺的渲染結(jié)果,而不用將渲染結(jié)果直接繪制在默認(rèn)的幀緩存對象上,在需要顯示渲染的結(jié)果時,幀緩存對象可以直接將渲染結(jié)果顯示在顯示裝置上,將幀緩存對象綁定到所述第一平臺的上下文中,以便于接下來的渲染工具的渲染操作都可以在創(chuàng)建的幀緩存對象上進(jìn)行,將紋理對象綁定到所述第一平臺的上下文環(huán)境中個,以便于對紋理對象進(jìn)行渲染操作,其中紋理對象與所述幀緩存對象掛接。

具體的,如前文所述,將幀緩存對象綁定到opengl的上下文中,以便于接下來的opengl渲染操作都在自定義的幀緩存對象上進(jìn)行,即opengl在幀緩存對象上繪制渲染結(jié)果,將紋理對象綁定到opengl的上下文環(huán)境中,以便opengl接下來對紋理對象進(jìn)行渲染操作,紋理對象通過著色器的處理后,將其渲染到幀緩存上,幀緩存由幀緩存對象得到,幀緩存將渲染后的紋理對象顯示在顯示裝置上。

s225:將所述特效參數(shù)傳入所述渲染程序。

所前文所述,在特效的參數(shù)傳入所述渲染程序時,gpu才能根據(jù)渲染程序?qū)λ龅谝灰曨l幀數(shù)據(jù)進(jìn)行運(yùn)算,從而得到第二視頻幀數(shù)據(jù)。

s226:調(diào)用所述第一平臺中的繪圖函數(shù)對所述第一視頻幀進(jìn)行特效渲染。

如前文所述在渲染時,渲染即為通過gpu依據(jù)第一平臺的繪圖函數(shù)和特效參數(shù)等對所述第一視頻幀進(jìn)行運(yùn)算得到第二視頻幀數(shù)據(jù)的過程。因此在渲染過程中,需要調(diào)用所述第一平臺中的繪圖函數(shù)。具體的,opengl調(diào)用與其連接的數(shù)據(jù)庫中繪圖函數(shù),并在函數(shù)中賦值特效參數(shù),gpu依據(jù)渲染程序和繪圖函數(shù)對所述第一視頻幀數(shù)據(jù)進(jìn)行運(yùn)算。

優(yōu)選地,所述特效參數(shù)包括所述特效的頂點(diǎn)數(shù)據(jù)和紋理數(shù)據(jù)。

如前文所述,必要的特效參數(shù)主要包括頂點(diǎn)數(shù)據(jù)和紋理數(shù)據(jù),具體的,如果是一個三角形,頂點(diǎn)數(shù)據(jù)為三角形的頂點(diǎn)左邊;紋理數(shù)據(jù)可以為一張圖片或者線或者點(diǎn)等。

進(jìn)一步地,所述調(diào)用所述第一平臺中的繪圖函數(shù)對所述第一視頻幀進(jìn)行特效渲染的步驟s226中,具體包括步驟s2261至步驟s2263。

s2261:初始化所述紋理對象以及所述第一平臺實現(xiàn)紋理渲染的環(huán)境,并為所述紋理對象創(chuàng)建用于紋理渲染的屬性,其中紋理渲染的環(huán)境通過eglgetcurrentcontext函數(shù)實現(xiàn)。

所述紋理對象的初始化為將添加數(shù)據(jù)后的所述紋理對象設(shè)為默認(rèn)值,并調(diào)用eglgetcurrentcontext函數(shù)獲取當(dāng)前的egl上下文,調(diào)用glgentextures產(chǎn)生一個opengl的紋理id,具體id已在前文描述,常見默認(rèn)的渲染對象,新渲染對象未附加任何值。

s2262:依據(jù)所述紋理渲染的屬性,將所述紋理數(shù)據(jù)映射到所述屬性中,設(shè)置所述紋理對象參數(shù)。

依據(jù)前文所述的紋理渲染的屬性,opengl調(diào)用glteximage2d函數(shù)將渲染畫面數(shù)據(jù)填充到opengl的紋理對象中,并設(shè)置紋理對象參數(shù),以通過前述的對象或者步驟實現(xiàn)對所述視頻幀的渲染操作,紋理對象參數(shù)在后文詳述。

s2263:創(chuàng)建渲染對象,對所述第一視頻幀進(jìn)行特效渲染。

創(chuàng)建渲染對象,創(chuàng)建的渲染對象代表將要渲染到所述視頻幀上的特效,且創(chuàng)建的一個渲染對象代表著一種特效效果,opengl調(diào)用performrender函數(shù)進(jìn)行特效畫面渲染操作。

優(yōu)選地,所述紋理對象參數(shù)包括任意一個或多個以下參數(shù),包括:頂點(diǎn)坐標(biāo)、紋理坐標(biāo)、背景顏色、旋轉(zhuǎn)角度。

如前文所述,在進(jìn)行紋理參數(shù)設(shè)置時,主要參數(shù)包括任意一個或多個以下參數(shù)頂點(diǎn)坐標(biāo)、紋理坐標(biāo)、背景顏色、旋轉(zhuǎn)角度,頂點(diǎn)坐標(biāo)為特效圖形頂點(diǎn)的坐標(biāo),頂點(diǎn)坐標(biāo)即為幾何坐標(biāo),在繪制紋理映射場景時,不僅要給每個頂點(diǎn)定義幾何坐標(biāo),而且也要定義紋理坐標(biāo)。經(jīng)過多種變換后,幾何坐標(biāo)決定頂點(diǎn)在屏幕上繪制的位置,而紋理坐標(biāo)決定紋理圖像中的哪一個紋理賦予該頂點(diǎn)。紋理圖像是方形數(shù)組,紋理坐標(biāo)通常可定義成一、二、三或四維形式,稱為s,t,r和q坐標(biāo),以區(qū)別于物體坐標(biāo)(x,y,z,w)和其他坐標(biāo)。一維紋理常用s坐標(biāo)表示,二維紋理常用(s,t)坐標(biāo)表示,目前忽略r坐標(biāo),q坐標(biāo)象w一樣,一半值為1,主要用于建立齊次坐標(biāo)。opengl坐標(biāo)定義的函數(shù)是:voidgltexcoord{1234}{sifd}[v](typecoords);設(shè)置當(dāng)前紋理坐標(biāo),此后調(diào)用glvertex*()所產(chǎn)生的頂點(diǎn)都賦予當(dāng)前的紋理坐標(biāo),對于gltexcoord1*(),s坐標(biāo)被設(shè)置成給定值,t和r設(shè)置為0,q設(shè)置為1,用gltexcoord2*()可以設(shè)置s和t坐標(biāo)值,r設(shè)置為0,q設(shè)置為1,對于gltexcoord3*(),q設(shè)置為1,其它坐標(biāo)按給定值設(shè)置,用gltexcoord4*()可以給定所有的坐標(biāo),使用適當(dāng)?shù)暮缶Y(s,i,f或d)和type的相應(yīng)值(glshort、glint、glfloat或gldouble)來說明坐標(biāo)的類型;在某些場合(環(huán)境映射等)下,為獲得特殊效果需要自動產(chǎn)生紋理坐標(biāo),并不要求為用函數(shù)gltexcoord*()為每個物體頂點(diǎn)賦予紋理坐標(biāo)值,opengl提供了自動產(chǎn)生紋理坐標(biāo)的函數(shù),其如:voidgltexgen{if}[v](glenumcoord,glenumpname,typeparam);自動產(chǎn)生紋理坐標(biāo),第一個參數(shù)必須是gl_s、gl_t、gl_r或gl_q,它指出紋理坐標(biāo)s,t,r,q中的哪一個要自動產(chǎn)生;第二個參數(shù)值為gl_texture_gen_mode、gl_object_plane或gl_eye_plane;第三個參數(shù)param是一個定義紋理產(chǎn)生參數(shù)的指針,其值取決于第二個參數(shù)pname的設(shè)置,當(dāng)pname為gl_texture_gen_mode時,param是一個常量,即gl_object_linear、gl_eye_linear或gl_sphere_map,它們決定用哪一個函數(shù)來產(chǎn)生紋理坐標(biāo)。背景顏色是紋理的背景色,如前述三角形,背景顏色為三角形填充顏色,旋轉(zhuǎn)角度為當(dāng)三角形渲染到視頻幀中時,三角形在視頻幀中旋轉(zhuǎn)的角度,旋轉(zhuǎn)角度為任意方向任意角度。

進(jìn)一步地,所述恢復(fù)所述第一平臺的環(huán)境狀態(tài)至初始環(huán)境狀態(tài)的步驟s240中,具體包括步驟s241。

s241:從所述第一平臺中解綁所述渲染程序。

如前文所述,渲染完成后,為了能在初始環(huán)境的條件下對其他幀進(jìn)行特效渲染,需要恢復(fù)所述第一平臺中所綁定的前述程序,具體的,如在opengl中,即為恢復(fù)opengl的初始環(huán)境狀態(tài),如從opengl上下文環(huán)境中解綁幀緩存對象,從opengl中解綁紋理對象等,opengl可以一次恢復(fù)一個或者多個前述綁定的特征屬性。

一種視頻特效渲染裝置,如圖2所示,包括響應(yīng)單元10、渲染單元20、編碼單元30。

所述響應(yīng)單元10,用于響應(yīng)于用戶指令,對獲取的視頻源進(jìn)行解碼,以得到特定格式的第一視頻幀數(shù)據(jù);

所述渲染單元20,用于將所述第一視頻幀數(shù)據(jù)及預(yù)設(shè)的特效參數(shù)向gpu發(fā)送,以使得gpu完成對該第一視頻幀數(shù)據(jù)的渲染;

所述編碼單元30,用于從gpu獲取第二視頻幀數(shù)據(jù)進(jìn)行編碼以得到目標(biāo)特效視頻,其中該第二視頻幀數(shù)據(jù)為gpu對所述第一視頻幀數(shù)據(jù)進(jìn)行渲染得到。

一種視頻特效渲染終端,包括:存儲器、處理器,所述存儲器存儲有計算機(jī)程序,其特征在于,所述計算機(jī)程序被所述處理器執(zhí)行時實現(xiàn)上述方法的步驟。

本技術(shù)領(lǐng)域技術(shù)人員可以理解,本發(fā)明包括關(guān)聯(lián)用于執(zhí)行本申請中所述操作中的一項或多項的設(shè)備。這些設(shè)備可以為所需的目的而專門設(shè)計和制造,或者也可以包括通用計算機(jī)中的已知設(shè)備。這些設(shè)備具有存儲在其內(nèi)的計算機(jī)程序,這些計算機(jī)程序選擇性地激活或重構(gòu)。這樣的計算機(jī)程序可以被存儲在設(shè)備(例如,計算機(jī)、手機(jī)、電視)可讀介質(zhì)中或者存儲在適于存儲電子指令并分別耦聯(lián)到總線的任何類型的介質(zhì)中,所述計算機(jī)可讀介質(zhì)包括但不限于任何類型的盤(包括軟盤、硬盤、光盤、cd-rom、和磁光盤)、rom(read-onlymemory,只讀存儲器)、ram(randomaccessmemory,隨即存儲器)、eprom(erasableprogrammableread-onlymemory,可擦寫可編程只讀存儲器)、eeprom(electricallyerasableprogrammableread-onlymemory,電可擦可編程只讀存儲器)、閃存、磁性卡片或光線卡片。也就是,可讀介質(zhì)包括由設(shè)備(例如,計算機(jī))以能夠讀的形式存儲或傳輸信息的任何介質(zhì)。

本技術(shù)領(lǐng)域技術(shù)人員可以理解,可以用計算機(jī)程序指令來實現(xiàn)這些結(jié)構(gòu)圖和/或框圖和/或流圖中的每個框以及這些結(jié)構(gòu)圖和/或框圖和/或流圖中的框的組合。本技術(shù)領(lǐng)域技術(shù)人員可以理解,可以將這些計算機(jī)程序指令提供給通用計算機(jī)、專業(yè)計算機(jī)或其他可編程數(shù)據(jù)處理方法的處理器來實現(xiàn),從而通過計算機(jī)或其他可編程數(shù)據(jù)處理方法的處理器來執(zhí)行本發(fā)明公開的結(jié)構(gòu)圖和/或框圖和/或流圖的框或多個框中指定的方案。

本技術(shù)領(lǐng)域技術(shù)人員可以理解,本發(fā)明中已經(jīng)討論過的各種操作、方法、流程中的步驟、措施、方案可以被交替、更改、組合或刪除。進(jìn)一步地,具有本發(fā)明中已經(jīng)討論過的各種操作、方法、流程中的其他步驟、措施、方案也可以被交替、更改、重排、分解、組合或刪除。進(jìn)一步地,現(xiàn)有技術(shù)中的具有與本發(fā)明中公開的各種操作、方法、流程中的步驟、措施、方案也可以被交替、更改、重排、分解、組合或刪除。

以上所述僅是本發(fā)明的部分實施方式,應(yīng)當(dāng)指出,對于本技術(shù)領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明原理的前提下,還可以做出若干改進(jìn)和潤飾,這些改進(jìn)和潤飾也應(yīng)視為本發(fā)明的保護(hù)范圍。

當(dāng)前第1頁1 2 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1
太原市| 江源县| 崇信县| 忻城县| 崇信县| 沐川县| 杭锦旗| 寻乌县| 镇康县| 蒙山县| 井研县| 文山县| 河南省| 江山市| 越西县| 惠州市| 镇平县| 德清县| 桦甸市| 江城| 银川市| 江永县| 抚宁县| 河东区| 定安县| 屏东市| 东阿县| 台中市| 调兵山市| 高碑店市| 中宁县| 临洮县| 翁牛特旗| 平潭县| 昌都县| 永仁县| 沂水县| 海伦市| 虞城县| 治多县| 乐清市|