本發(fā)明涉及視頻解碼技術領域,尤其涉及一種視頻解碼裝置及方法。
背景技術:
隨著科技的迅速發(fā)展,智能手機、PAD(平板電腦)、臺式計算機等終端已經成為用戶生活中不可或缺的設備,為用戶的日常生活提供了極大的便利,比如通過終端播放視頻。在播放視頻前,通常需要對視頻進行解碼,現(xiàn)有技術中一般通過硬解碼方式或者軟解碼方式對視頻進行解碼。而隨著用戶對視頻質量的要求越來越高,比如4k(4096*2160)超高清視頻逐漸成為各大商家主推的視頻,由于視頻的高分辨率、高壓縮比、高編碼復雜度等特性,通過硬解碼方式或者軟解碼方式對視頻進行解碼效率并不高。
技術實現(xiàn)要素:
本發(fā)明的主要目的在于提出一種視頻解碼裝置及方法,旨在解決現(xiàn)有技術中視頻解碼效率不高的技術問題。
為實現(xiàn)上述目的,本發(fā)明提供的一種視頻解碼裝置,所述視頻解碼裝置包括:
解析模塊,用于對待解碼視頻進行解析,獲取所述待解碼視頻對應的多個視頻幀;
處理模塊,用于將所述多個視頻幀區(qū)分為第一類型視頻幀和第二類型視頻幀;
解碼模塊,用于分別對所述第一類型視頻幀進行硬解碼,對所述第二類型視頻幀進行軟解碼;
緩存模塊,用于將硬解碼后的所述第一類型視頻幀與軟解碼后的所述第二類型視頻幀匯總緩存,獲得所述待解碼視頻對應的解碼視頻幀。
可選地,所述處理模塊包括:
獲取單元,用于獲取每個視頻幀的幀序號;
處理單元,用于根據(jù)所述每個視頻幀的幀序號將所述多個視頻幀區(qū)分為第一類型視頻幀和第二類型視頻幀。
可選地,所述處理單元用于:
若視頻幀的幀序號為8的整倍數(shù),則將所述視頻幀標記分為第二類型視頻幀;
若視頻幀的幀序號不為8的整倍數(shù),則將所述視頻幀標記分為第一類型視頻幀。
可選地,所述解碼模塊包括:
發(fā)送單元,用于將所述第一類型視頻幀發(fā)送至Codec編譯碼器芯片,以通過所述Codec芯片對所述第一類型視頻幀進行硬解碼;
解碼單元,用于對所述第二類型視頻幀進行軟解碼。
可選地,所述視頻解碼裝置還包括:
檢測模塊,用于檢測分布式解碼模式是否開啟;
所述處理模塊,用于當所述分布式解碼模式開啟時,將所述多個視頻幀區(qū)分為第一類型視頻幀和第二類型視頻幀。
此外,為實現(xiàn)上述目的,本發(fā)明還提出一種視頻解碼方法,所述視頻解碼方法包括以下步驟:
對待解碼視頻進行解析,獲取所述待解碼視頻對應的多個視頻幀;
將所述多個視頻幀區(qū)分為第一類型視頻幀和第二類型視頻幀;
分別對所述第一類型視頻幀進行硬解碼,對所述第二類型視頻幀進行軟解碼;
將硬解碼后的所述第一類型視頻幀與軟解碼后的所述第二類型視頻幀匯總緩存,獲得所述待解碼視頻對應的解碼視頻幀。
可選地,所述將所述多個視頻幀區(qū)分為第一類型視頻幀和第二類型視頻幀的步驟包括:
獲取每個視頻幀的幀序號;
根據(jù)所述每個視頻幀的幀序號將所述多個視頻幀區(qū)分為第一類型視頻幀和第二類型視頻幀。
可選地,所述根據(jù)所述每個視頻幀的幀序號將所述多個視頻幀區(qū)分為第一類型視頻幀和第二類型視頻幀的步驟包括:
若視頻幀的幀序號為8的整倍數(shù),則將所述視頻幀標記分為第二類型視頻幀;
若視頻幀的幀序號不為8的整倍數(shù),則將所述視頻幀標記分為第一類型視頻幀。
可選地,所述對所述第一類型視頻幀進行硬解碼的步驟包括:
將所述第一類型視頻幀發(fā)送至Codec編譯碼器芯片,以通過所述Codec芯片對所述第一類型視頻幀進行硬解碼。
可選地,所述將所述多個視頻幀區(qū)分為第一類型視頻幀和第二類型視頻幀的步驟之前,還包括:
檢測分布式解碼模式是否開啟;
當所述分布式解碼模式開啟時,執(zhí)行所述將所述多個視頻幀區(qū)分為第一類型視頻幀和第二類型視頻幀的步驟。
本發(fā)明提出的視頻解碼裝置及方法,在需要對帶解碼視頻進行解碼時,首先通過解析模塊解析該待解碼視頻,獲取該待解碼視頻對應的多個視頻幀,然后處理模塊將這些視頻幀區(qū)分為第一類型視頻幀和第二類型視頻幀,解碼模塊分別對第一類型視頻幀進行硬解碼,對第二類型視頻幀進行軟解碼,緩存模塊將硬解碼后的第一類型視頻幀和軟解碼后的第二類型視頻幀匯總緩存,獲得該待解碼視頻對應的解碼視頻幀,從而完成了該待解碼視頻的解碼。由于將視頻幀分為了兩類分別進行硬解碼和軟解碼,相比于僅采用硬解碼方式解碼視頻或者僅采用軟解碼方式解碼視頻,本實施例提高了視頻解碼的效率。
附圖說明
圖1為實現(xiàn)本發(fā)明各個實施例的終端的硬件結構示意圖;
圖2為本發(fā)明視頻解碼裝置第一實施例的模塊示意圖;
圖3為本發(fā)明視頻解碼裝置第二實施例中處理模塊的模塊示意圖;
圖4為本發(fā)明視頻解碼裝置第二實施例中解碼模塊的模塊示意圖;
圖5為本發(fā)明視頻解碼裝置第三實施例的模塊示意圖;
圖6為本發(fā)明各個實施例一個可選的開啟或關閉分布式解碼模式的示意圖;
圖7為本發(fā)明視頻解碼方法第一實施例的流程示意圖;
圖8為本發(fā)明視頻解碼方法第二實施例中將所述多個視頻幀區(qū)分為第一類型視頻幀和第二類型視頻幀的細化流程示意圖。
本發(fā)明目的的實現(xiàn)、功能特點及優(yōu)點將結合實施例,參照附圖做進一步說明。
具體實施方式
應當理解,此處所描述的具體實施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
現(xiàn)在將參考附圖描述實現(xiàn)本發(fā)明各個實施例的終端。在后續(xù)的描述中,使用用于表示元件的諸如“模塊”、“部件”或“單元”的后綴僅為了有利于本發(fā)明的說明,其本身并沒有特定的意義。因此,“模塊”與“部件”可以混合地使用。
終端可以以各種形式來實施。例如,本發(fā)明中描述的終端可以包括諸如移動電話、智能電話、筆記本電腦、數(shù)字廣播接收器、PDA(個人數(shù)字助理)、PAD(平板電腦)、PMP(便攜式多媒體播放器)、導航裝置等等的移動終端以及諸如數(shù)字TV、臺式計算機等等的固定終端。
本發(fā)明實施例提供的一種終端1100的硬件結構示意圖,如圖1所示,該終端1100包括:
處理器1110,是一個通用中央處理器(CPU),微處理器,特定應用集成電路(application-specific integrated circuit,ASIC),或一個或多個用于控制本發(fā)明方案S10-S14執(zhí)行的集成電路。
存儲器1120,用于完成終端的各種軟件程序的存儲、數(shù)據(jù)的存儲,以及軟件程序的運行等。該存儲器1120可以是RAM,EPROM,SSD,SD卡,HD硬盤中的一種或者多種。本發(fā)明實施例提供的視頻文件和特效,也在存儲器1120上運行和存儲。
傳感器1130,用于測量和記錄數(shù)據(jù),該傳感器1130可以包括下列中的任一種或多種:攝像頭、GPS模塊、重力傳感器、加速度傳感器、距離傳感器、光學傳感器、麥克風、揚聲器。
收發(fā)電路1140,用于提供通信功能,包括蜂窩網絡(GSM/UMTS/LTE/CDMA等)、無線局域網(WLAN)、近距離通信(NFC)、藍牙等中的一種或者多種。
電源1150,用于提供直流供電,或者將交流供電轉換成直流供電。
I/O接口電路1160,用于提供對外接口??蛇x地,該I/O接口電路1160可以包括下列接口中的任一種或多種:USB接口、SD卡接口、按鍵接口。
顯示器1170,可以是終端的顯示屏和/或觸摸屏,在顯示屏的顯示視頻文件和特效;觸摸屏用于接收用戶觸摸操作并轉換成用戶操作指令。
I/O控制電路1180,用于控制各種輸入輸出電路部件之間的數(shù)據(jù)交互,特別地,例如處理器1110與I/O接口電路1160、顯示器1170之間的數(shù)據(jù)交互。
基于上述終端硬件結構,提出本發(fā)明視頻解碼裝置各個實施例。
參照圖2,圖2為本發(fā)明視頻解碼裝置第一實施例的模塊示意圖,在第一實施例中,該視頻解碼裝置包括:
解析模塊10,用于對待解碼視頻進行解析,獲取所述待解碼視頻對應的多個視頻幀;
本實施例中,視頻解碼裝置應用于智能手機、PAD(平板電腦)、計算機等終端。可選地,該視頻解碼裝置設置于終端中。當用戶要通過終端播放某一個視頻時,由于視頻通常都是編碼視頻,無法直接播放,因此,需要先對該視頻進行解碼,解碼后的視頻才能進行播放。為了便于對方案進行描述,下文統(tǒng)一將該視頻稱為待解碼視頻。可選地,該待解碼視頻為HEVC High tier超高分辨率格式的視頻。
本實施例中,通過本發(fā)明的視頻解碼裝置對該待解碼視頻進行解碼。具體地,首先解析模塊10對該待解碼視頻進行解析,獲取該待解碼視頻對應的音頻和該待解碼視頻對應的視頻幀,可以理解的是,該視頻幀的數(shù)量為多個,每個視頻幀為編碼壓縮的圖像數(shù)據(jù)。
處理模塊20,用于將所述多個視頻幀區(qū)分為第一類型視頻幀和第二類型視頻幀;
當解析模塊10解析獲取到待解碼視頻對應的多個視頻幀后,處理模塊20將這些視頻幀分為兩大類,為了便于描述,下文將分為的兩大類視頻幀中的其中一類稱為第一類型視頻幀,另外一類稱為第二類型視頻幀。比如,將視頻幀平均分為兩部分,其中的一部分為第一類型視頻幀,另外一部分為第二類型視頻幀。可以理解的是,處理模塊20將視頻幀分類的方式并不限于上述列舉的方式,在此不作限制。
解碼模塊30,用于分別對所述第一類型視頻幀進行硬解碼,對所述第二類型視頻幀進行軟解碼;
緩存模塊40,用于將硬解碼后的所述第一類型視頻幀與軟解碼后的所述第二類型視頻幀匯總緩存,獲得所述待解碼視頻對應的解碼視頻幀。
為了提高視頻的解碼效率,本實施例中,在處理模塊20將待解碼視頻所對應的視頻幀區(qū)分為第一類型視頻幀和第二類型視頻幀后,解碼模塊30對第一類型視頻幀和第二類型視頻幀分別進行解碼??蛇x地,解碼模塊30對第一類型視頻幀進行硬解碼,對第二類型視頻幀進行軟解碼,也即調用終端的硬件來對第一類型視頻幀進行解碼。
當解碼模塊30對第一類型視頻幀進行硬解碼,以及對第二類型視頻幀進行軟解碼完成之后,緩存模塊40將硬解碼后的第一類型視頻幀與軟解碼后的第二類型視頻幀匯總緩存,從而獲得該待解碼視頻對應的解碼視頻幀,也即完成對該待解碼視頻的解碼。之后,將此解碼視頻幀輸出實現(xiàn)該待解碼視頻的播放。
通過將硬解碼和軟解碼結合對視頻進行解碼,提高了視頻解碼的效率,從而避免了視頻在播放時會出現(xiàn)jitter抖動,使得播放畫面不夠流暢的問題,也就保證了視頻的流暢播放,提高了用戶的觀看體驗。
下面以在終端中加載一HEVC分布式解碼器為例,對本發(fā)明的視頻解碼裝置進行詳細說明。
首先創(chuàng)建分布式解碼器HEVCHighTierDistributedDecoder,并定義類HEVCHighTierDistributedDecoder供其他模塊調用的接口,包括:
extractorPickVideoFrame(video_file_handle*),用于解析并標記第一類型視頻幀和第二類型視頻幀;
transportToHEVCCodecHwDecoder(),用于將第一類型視頻幀傳送至HEVC硬解碼模塊;
transportToHEVCSoftDecoder(),用于將第二類型視頻幀傳送至HEVC軟解碼模塊;
releaseHEVCHighTierDistributedDecoder(),用于釋放并銷毀HEVC分布式解碼器。
之后,生成公用動態(tài)鏈接庫(.so)供多個平臺使用,具體包括:
1)配置Android.mk文件:
設置LOCAL_MODULE=HEVCHighTierDistributedDecoder,引用變量include$((BUILD_SHARED_LIBRARY);
2)根據(jù)配置屬性,編譯生成一個公用的動態(tài)庫:
libHEVCHighTierDistributedDecoder.so,供多個不同平臺或模塊使用;
3)動態(tài)庫的生成路徑:例如:
/out/target/項目名/system/lib/libHEVCHighTierDistributedDecoder.so。
當采用該HEVC分布式解碼器對HEVC High tier超高分辨率格式的視頻進行解碼時,如4k(4096*2160)、8k(8192*4320)的視頻時,該HEVC分布式解碼器通過調用extractorPickVideoFrame(video_file_handle*)將待解碼視頻解析并標記分為第一類型視頻幀和第二類型視頻幀,然后通過調用transportToHEVCCodecHwDecoder()將第一類型視頻幀傳送至終端的硬件模塊進行硬解碼,并通過調用transportToHEVCSoftDecoder()將第二類型視頻幀傳送至HEVC軟解碼模塊進行軟解碼,從而完成對待解碼視頻的解碼。
本實施例提出的方案,在需要對帶解碼視頻進行解碼時,首先通過解析模塊10解析該待解碼視頻,獲取該待解碼視頻對應的多個視頻幀,然后處理模塊20將這些視頻幀區(qū)分為第一類型視頻幀和第二類型視頻幀,解碼模塊30分別對第一類型視頻幀進行硬解碼,對第二類型視頻幀進行軟解碼,緩存模塊40將硬解碼后的第一類型視頻幀和軟解碼后的第二類型視頻幀匯總緩存,獲得該待解碼視頻對應的解碼視頻幀,從而完成了該待解碼視頻的解碼。由于將視頻幀分為了兩類分別進行硬解碼和軟解碼,相比于僅采用硬解碼方式解碼視頻或者僅采用軟解碼方式解碼視頻,本實施例提高了視頻解碼的效率。
進一步地,如圖3所示,提出本發(fā)明視頻解碼裝置第二實施例。視頻解碼裝置第二實施例與視頻解碼裝置第一實施例的區(qū)別在于,在視頻解碼裝置第二實施例中,所述處理模塊20包括:
獲取單元21,用于獲取每個視頻幀的幀序號;
處理單元22,用于根據(jù)所述每個視頻幀的幀序號將所述多個視頻幀區(qū)分為第一類型視頻幀和第二類型視頻幀。
本實施例中,每一個視頻幀都有對應唯一的幀序號,例如若待解碼視頻包括64個視頻幀,其對應的幀序號依次為1,2,3,……,64。獲取單元21依次獲取每個視頻幀對應的幀序號。然后處理單元22根據(jù)每個視頻幀對應的幀序號,將視頻幀區(qū)分為第一類型視頻幀和第二類型視頻幀。可選地,所述處理單元22用于:
若視頻幀的幀序號為8的整倍數(shù),則將所述視頻幀標記分為第二類型視頻幀;
若視頻幀的幀序號不為8的整倍數(shù),則將所述視頻幀標記分為第一類型視頻幀。
由于硬解碼效率高,因此,處理單元22可以將大部分視頻幀分為第一類型視頻幀,第一類型視頻幀進行硬解碼,將小部分視頻幀分為第二類型視頻幀,第二類型視頻幀進行軟解碼。例如,若視頻幀的幀序號為8的整倍數(shù),則將此視頻幀標記分為第二類型視頻幀;若視頻幀的幀序號不為8的整倍數(shù),則將此視頻幀標記分為第一類型視頻幀,這樣第一類型視頻幀的數(shù)量與第二類型視頻幀的數(shù)量的比例為7:1,也即大部分視頻幀被分為第一類型視頻幀,小部分視頻幀被分為第二類型視頻幀,從而使得解碼效率進一步提高。
本實施例中,如圖4所示,所述解碼模塊30包括:
發(fā)送單元31,用于將所述第一類型視頻幀發(fā)送至Codec編譯碼器芯片,以通過所述Codec芯片對所述第一類型視頻幀進行硬解碼;
解碼單元32,用于對所述第二類型視頻幀進行軟解碼。
通常,終端都配置有Codec編譯碼器芯片。在處理模塊20將視頻幀區(qū)分為第一類型視頻幀和第二類型視頻幀之后,發(fā)送單元31將第一類型視頻幀發(fā)送至終端的Codec芯片,通過終端的Codec芯片對第一類型視頻幀進行硬解碼,Codec芯片對視頻幀進行硬解碼的方式在此不作贅述。對于第二類型視頻幀,通過解碼單元32對第二類型視頻幀進行軟解碼。
當通過Codec芯片對第一類型視頻幀進行硬解碼,解碼單元32對第二類型視頻幀進行軟解碼之后,緩存模塊40將硬解碼后的第一類型視頻幀和軟解碼后的第二類型視頻幀進行匯總緩存,獲得該待解碼視頻對應的解碼視頻幀,也即完成對該待解碼視頻的解碼。
本實施例提出的方案,根據(jù)視頻幀的幀序號將視頻幀區(qū)分為第一類型視頻幀和第二類型視頻幀,把幀序號為8的整數(shù)倍的視頻幀分為第二類型視頻幀,幀序號不為8的整數(shù)倍的視頻幀分為第一類型視頻幀,這樣大部分視頻幀被分為第一類型視頻幀,小部分視頻幀被分為第二類型視頻幀,第一類型視頻幀進行硬解碼,第二類型視頻幀進行軟解碼,由于硬解碼的效率高于軟解碼的效率,因此,達到了進一步提高視頻解碼效率的效果。
進一步地,如圖5所示,提出本發(fā)明視頻解碼裝置第三實施例。視頻解碼裝置第三實施例與視頻解碼裝置第一實施例或第二實施例的區(qū)別在于,在視頻解碼裝置第三實施例中,所述視頻解碼裝置還包括:
檢測模塊50,用于檢測分布式解碼模式是否開啟;
所述處理模塊20,用于當所述分布式解碼模式開啟時,將所述多個視頻幀區(qū)分為第一類型視頻幀和第二類型視頻幀。
雖然通過硬解碼和軟解碼結合的方式能夠提高視頻解碼的效率,但有些情況下,僅通過硬解碼方式或者軟解碼方式,就能夠實現(xiàn)視頻的流暢播放,滿足用戶需求。因此,在本實施例中,預設硬解碼和軟解碼結合的方式的相應的開關。為了便于描述,下文將硬解碼和軟解碼結合的方式稱為分布式解碼模式。例如,如圖6所示,預設分布式解碼模式對應的控件開關,當用戶點擊打開控件開關時,開啟分布式解碼模式;當用戶點擊關閉控件開關時,分布式解碼模式關閉。本實施例中,在對待解碼視頻進行解碼前,檢測模塊50先檢測分布式解碼模式是否開啟,當分布式解碼模式開啟時,處理模塊20才將待解碼視頻所對應的多個視頻幀區(qū)分為第一類型視頻幀和第二類型視頻幀。否則,當分布式解碼模式關閉時,處理模塊20不進行響應,解碼模塊30直接對視頻幀進行軟解碼或者硬解碼。
例如,仍以HEVCHighTierDistributedDecoder分布式解碼器為例,通過配置HEVCHighTierDistributedDecoder的開關:
video.hightier.distributed.decoder.enable;
通過adb端口設置video.hightier.distributed.decoder.enable的屬性值0或1,其中:
若adb shell setprop video.hightier.distributed.decoder.enable 1,則分布式解碼模式開啟;
若adb shell setprop video.hightier.distributed.decoder.enable 0,則分布式解碼模式開啟關閉。
本實施例提出的方案,在對待解碼視頻進行解碼前,檢測模塊50先檢測分布式解碼模式是否開啟,當分布式解碼模式開啟時,處理模塊20才將待解碼視頻所對應的多個視頻幀區(qū)分為第一類型視頻幀和第二類型視頻幀,然后通過解碼模塊30對第一類型視頻幀進行硬解碼,對第二類型視頻幀進行軟解碼,用戶可以根據(jù)需求設置是否開啟分布式解碼模式,因此,提高了用戶的交互體驗。
本發(fā)明進一步提供一種視頻解碼方法。
參照圖7,圖7為本發(fā)明視頻解碼方法第一實施例的流程示意圖,在第一實施例中,該視頻解碼方法包括以下步驟:
步驟S10,對待解碼視頻進行解析,獲取所述待解碼視頻對應的多個視頻幀;
本實施例中,當用戶要通過智能手機、PAD(平板電腦)、計算機等終端播放某一個視頻時,由于視頻通常都是編碼視頻,無法直接播放,因此,需要先對該視頻進行解碼,解碼后的視頻才能進行播放。為了便于對方案進行描述,下文統(tǒng)一將該視頻稱為待解碼視頻??蛇x地,該待解碼視頻為HEVC High tier超高分辨率格式的視頻。
具體地,首先對該待解碼視頻進行解析,獲取該待解碼視頻對應的音頻和該待解碼視頻對應的視頻幀,可以理解的是,該視頻幀的數(shù)量為多個,每個視頻幀為編碼壓縮的圖像數(shù)據(jù)。
步驟S20,將所述多個視頻幀區(qū)分為第一類型視頻幀和第二類型視頻幀;
當解析獲取到待解碼視頻對應的多個視頻幀后,將這些視頻幀分為兩大類,為了便于描述,下文將分為的兩大類視頻幀中的其中一類稱為第一類型視頻幀,另外一類稱為第二類型視頻幀。比如,將視頻幀平均分為兩部分,其中的一部分為第一類型視頻幀,另外一部分為第二類型視頻幀??梢岳斫獾氖牵瑢⒁曨l幀分類的方式并不限于上述列舉的方式,在此不作限制。
步驟S30,分別對所述第一類型視頻幀進行硬解碼,對所述第二類型視頻幀進行軟解碼;
步驟S40,將硬解碼后的所述第一類型視頻幀與軟解碼后的所述第二類型視頻幀匯總緩存,獲得所述待解碼視頻對應的解碼視頻幀。
為了提高視頻的解碼效率,本實施例中,在將待解碼視頻所對應的視頻幀區(qū)分為第一類型視頻幀和第二類型視頻幀后,對第一類型視頻幀和第二類型視頻幀分別進行解碼??蛇x地,對第一類型視頻幀進行硬解碼,對第二類型視頻幀進行軟解碼,也即調用終端的硬件來對第一類型視頻幀進行解碼。
當對第一類型視頻幀進行硬解碼,以及對第二類型視頻幀進行軟解碼完成之后,將硬解碼后的第一類型視頻幀與軟解碼后的第二類型視頻幀匯總緩存,從而獲得該待解碼視頻對應的解碼視頻幀,也即完成對該待解碼視頻的解碼。之后,將此解碼視頻幀輸出實現(xiàn)該待解碼視頻的播放。
通過將硬解碼和軟解碼結合對視頻進行解碼,提高了視頻解碼的效率,從而避免了視頻在播放時會出現(xiàn)jitter抖動,使得播放畫面不夠流暢的問題,也就保證了視頻的流暢播放,提高了用戶的觀看體驗。
下面以在終端中加載一HEVC分布式解碼器為例,對本發(fā)明的視頻解碼方法進行詳細說明。
首先創(chuàng)建分布式解碼器HEVCHighTierDistributedDecoder,并定義類HEVCHighTierDistributedDecoder供其他模塊調用的接口,包括:
extractorPickVideoFrame(video_file_handle*),用于解析并標記第一類型視頻幀和第二類型視頻幀;
transportToHEVCCodecHwDecoder(),用于將第一類型視頻幀傳送至HEVC硬解碼模塊;
transportToHEVCSoftDecoder(),用于將第二類型視頻幀傳送至HEVC軟解碼模塊;
releaseHEVCHighTierDistributedDecoder(),用于釋放并銷毀HEVC分布式解碼器。
之后,生成公用動態(tài)鏈接庫(.so)供多個平臺使用,具體包括:
1)配置Android.mk文件:
設置LOCAL_MODULE=HEVCHighTierDistributedDecoder,引用變量include$((BUILD_SHARED_LIBRARY);
2)根據(jù)配置屬性,編譯生成一個公用的動態(tài)庫:
libHEVCHighTierDistributedDecoder.so,供多個不同平臺或模塊使用;
3)動態(tài)庫的生成路徑:例如:
/out/target/項目名/system/lib/libHEVCHighTierDistributedDecoder.so。
當采用該HEVC分布式解碼器對HEVC High tier超高分辨率格式的視頻進行解碼時,如4k(4096*2160)、8k(8192*4320)的視頻時,該HEVC分布式解碼器通過調用extractorPickVideoFrame(video_file_handle*)將待解碼視頻解析并標記分為第一類型視頻幀和第二類型視頻幀,然后通過調用transportToHEVCCodecHwDecoder()將第一類型視頻幀傳送至終端的硬件模塊進行硬解碼,并通過調用transportToHEVCSoftDecoder()將第二類型視頻幀傳送至HEVC軟解碼模塊進行軟解碼,從而完成對待解碼視頻的解碼。
本實施例提出的方案,在需要對帶解碼視頻進行解碼時,首先解析該待解碼視頻,獲取該待解碼視頻對應的多個視頻幀,然后將這些視頻幀區(qū)分為第一類型視頻幀和第二類型視頻幀,分別對第一類型視頻幀進行硬解碼,對第二類型視頻幀進行軟解碼,將硬解碼后的第一類型視頻幀和軟解碼后的第二類型視頻幀匯總緩存,獲得該待解碼視頻對應的解碼視頻幀,從而完成了該待解碼視頻的解碼。由于將視頻幀分為了兩類分別進行硬解碼和軟解碼,相比于僅采用硬解碼方式解碼視頻或者僅采用軟解碼方式解碼視頻,本實施例提高了視頻解碼的效率。
進一步地,如圖8所示,提出本發(fā)明視頻解碼方法第二實施例。視頻解碼方法第二實施例與視頻解碼方法第一實施例的區(qū)別在于,在視頻解碼方法第二實施例中,所述步驟S20包括:
步驟S21,獲取每個視頻幀的幀序號;
步驟S22,根據(jù)所述每個視頻幀的幀序號將所述多個視頻幀區(qū)分為第一類型視頻幀和第二類型視頻幀。
本實施例中,每一個視頻幀都有對應唯一的幀序號,例如若待解碼視頻包括64個視頻幀,其對應的幀序號依次為1,2,3,……,64。在解析獲取了待解碼視頻對應的多個視頻幀后,依次獲取每個視頻幀對應的幀序號,然后根據(jù)每個視頻幀對應的幀序號,將視頻幀區(qū)分為第一類型視頻幀和第二類型視頻幀??蛇x地,所述步驟S22包括:
步驟a,若視頻幀的幀序號為8的整倍數(shù),則將所述視頻幀標記分為第二類型視頻幀;
步驟b,若視頻幀的幀序號不為8的整倍數(shù),則將所述視頻幀標記分為第一類型視頻幀。
由于硬解碼效率高,因此,可以將大部分視頻幀分為第一類型視頻幀,第一類型視頻幀進行硬解碼,將小部分視頻幀分為第二類型視頻幀,第二類型視頻幀進行軟解碼。例如,若視頻幀的幀序號為8的整倍數(shù),則將此視頻幀標記分為第二類型視頻幀;若視頻幀的幀序號不為8的整倍數(shù),則將此視頻幀標記分為第一類型視頻幀,這樣第一類型視頻幀的數(shù)量與第二類型視頻幀的數(shù)量的比例為7:1,也即大部分視頻幀被分為第一類型視頻幀,小部分視頻幀被分為第二類型視頻幀,從而使得解碼效率進一步提高。
本實施例中,所述步驟S30包括:
步驟c,將所述第一類型視頻幀發(fā)送至Codec編譯碼器芯片,以通過所述Codec芯片對所述第一類型視頻幀進行硬解碼。
通常,終端都配置有Codec編譯碼器芯片。在將視頻幀區(qū)分為第一類型視頻幀和第二類型視頻幀之后,將第一類型視頻幀發(fā)送至終端的Codec芯片,通過終端的Codec芯片對第一類型視頻幀進行硬解碼,Codec芯片對視頻幀進行硬解碼的方式在此不作贅述。在Codec芯片對第一類型視頻幀進行硬解碼時,同時,對于第二類型視頻幀,對第二類型視頻幀進行軟解碼。
當通過Codec芯片對第一類型視頻幀進行硬解碼,同時對第二類型視頻幀進行軟解碼之后,將硬解碼后的第一類型視頻幀和軟解碼后的第二類型視頻幀進行匯總緩存,獲得該待解碼視頻對應的解碼視頻幀,也即完成對該待解碼視頻的解碼。
本實施例提出的方案,根據(jù)視頻幀的幀序號將視頻幀區(qū)分為第一類型視頻幀和第二類型視頻幀,把幀序號為8的整數(shù)倍的視頻幀分為第二類型視頻幀,幀序號不為8的整數(shù)倍的視頻幀分為第一類型視頻幀,這樣大部分視頻幀被分為第一類型視頻幀,小部分視頻幀被分為第二類型視頻幀,第一類型視頻幀進行硬解碼,第二類型視頻幀進行軟解碼,由于硬解碼的效率高于軟解碼的效率,因此,達到了進一步提高視頻解碼效率的效果。
進一步地,提出本發(fā)明視頻解碼方法第三實施例。視頻解碼方法第三實施例與視頻解碼方法第一實施例或第二實施例的區(qū)別在于,在視頻解碼方法第三實施例中,所述步驟S20之前,還包括:
步驟d,檢測分布式解碼模式是否開啟;
所述步驟S20包括:
步驟e,當所述分布式解碼模式開啟時,將所述多個視頻幀區(qū)分為第一類型視頻幀和第二類型視頻幀。
雖然通過硬解碼和軟解碼結合的方式能夠提高視頻解碼的效率,但有些情況下,僅通過硬解碼方式或者軟解碼方式,就能夠實現(xiàn)視頻的流暢播放,滿足用戶需求。因此,在本實施例中,預設硬解碼和軟解碼結合的方式的相應的開關。為了便于描述,下文將硬解碼和軟解碼結合的方式稱為分布式解碼模式。例如,如圖6所示,預設分布式解碼模式對應的控件開關,當用戶點擊打開控件開關時,開啟分布式解碼模式;當用戶點擊關閉控件開關時,分布式解碼模式關閉。本實施例中,在對待解碼視頻進行解碼前,先檢測分布式解碼模式是否開啟,當分布式解碼模式開啟時,才將待解碼視頻所對應的多個視頻幀區(qū)分為第一類型視頻幀和第二類型視頻幀。否則,當分布式解碼模式關閉時,直接對視頻幀進行軟解碼或者硬解碼??梢岳斫獾氖?,也可以在步驟步驟S10之前,先檢測分布式解碼模式是否開啟,也即在對待解碼視頻進行解析之前,先檢測分布式解碼模式是否開啟。
例如,仍以HEVCHighTierDistributedDecoder分布式解碼器為例,通過配置HEVCHighTierDistributedDecoder的開關:
video.hightier.distributed.decoder.enable;
通過adb端口設置video.hightier.distributed.decoder.enable的屬性值0或1,其中:
若adb shell setprop video.hightier.distributed.decoder.enable 1,則分布式解碼模式開啟;
若adb shell setprop video.hightier.distributed.decoder.enable 0,則分布式解碼模式開啟關閉。
本實施例提出的方案,在對待解碼視頻進行解碼前,先檢測分布式解碼模式是否開啟,當分布式解碼模式開啟時,才將待解碼視頻所對應的多個視頻幀區(qū)分為第一類型視頻幀和第二類型視頻幀,然后對第一類型視頻幀進行硬解碼,對第二類型視頻幀進行軟解碼,用戶可以根據(jù)需求設置是否開啟分布式解碼模式,因此,提高了用戶的交互體驗。
需要說明的是,在本文中,術語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、物品或者裝置不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、物品或者裝置所固有的要素。在沒有更多限制的情況下,由語句“包括一個……”限定的要素,并不排除在包括該要素的過程、方法、物品或者裝置中還存在另外的相同要素。
上述本發(fā)明實施例序號僅僅為了描述,不代表實施例的優(yōu)劣。
通過以上的實施方式的描述,本領域的技術人員可以清楚地了解到上述實施例方法可借助軟件加必需的通用硬件平臺的方式來實現(xiàn),當然也可以通過硬件,但很多情況下前者是更佳的實施方式?;谶@樣的理解,本發(fā)明的技術方案本質上或者說對現(xiàn)有技術做出貢獻的部分可以以軟件產品的形式體現(xiàn)出來,該計算機軟件產品存儲在一個存儲介質(如ROM/RAM、磁碟、光盤)中,包括若干指令用以使得一臺終端設備(可以是手機,計算機,服務器,或者網絡設備等)執(zhí)行本發(fā)明各個實施例所述的方法。
以上僅為本發(fā)明的優(yōu)選實施例,并非因此限制本發(fā)明的專利范圍,凡是利用本發(fā)明說明書及附圖內容所作的等效結構或等效流程變換,或直接或間接運用在其他相關的技術領域,均同理包括在本發(fā)明的專利保護范圍內。