一種基于移動終端的視頻數(shù)據(jù)處理方法及系統(tǒng)的制作方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及數(shù)據(jù)處理技術(shù)領(lǐng)域,特別是涉及一種基于移動終端的視頻數(shù)據(jù)處理方法及系統(tǒng)。
【背景技術(shù)】
[0002]當(dāng)今,隨著4G網(wǎng)絡(luò)的普及和視頻監(jiān)控在個人、物業(yè)及智能樓宇上的廣泛應(yīng)用,人們越來越關(guān)注和重視基于移動終端的遠程視頻監(jiān)控。
[0003]在實際應(yīng)用中,具有視頻監(jiān)控功能的移動終端主要通過通信網(wǎng)絡(luò)獲取攝像頭端采集到的視頻數(shù)據(jù),然后在對視頻數(shù)據(jù)進行拆包、組幀、解碼以及渲染等處理之后進行顯示。
[0004]然而,在Android移動終端對視頻數(shù)據(jù)進行處理的過程中,存在如下問題:在對組幀后的視頻數(shù)據(jù)進行解碼的過程中,需要Android端(S卩SDK層)與底層解碼端(即NDK層)進行頻繁的數(shù)據(jù)交互并且是基于拷貝機制實現(xiàn)數(shù)據(jù)的交互。頻繁的數(shù)據(jù)交互意味著頻繁的拷貝操作,并且當(dāng)兩端運行的程序語言是不一樣時需要互相轉(zhuǎn)換來適應(yīng)彼此,而頻繁的拷貝操作和轉(zhuǎn)換操作都需要消耗一段時間,這樣易造成解碼不及時進而造成數(shù)據(jù)交互出現(xiàn)阻塞,最終會造成前端顯示出現(xiàn)抖動、大量花屏甚至程序崩潰的問題。
【發(fā)明內(nèi)容】
[0005]有鑒于此,本發(fā)明提供了一種基于移動終端的視頻數(shù)據(jù)處理方法及系統(tǒng),以解決現(xiàn)有技術(shù)中因頻繁的拷貝操作和轉(zhuǎn)換操作導(dǎo)致解碼不及時進而造成數(shù)據(jù)交互出現(xiàn)阻塞的問題。
[0006]為解決上述技術(shù)問題,本發(fā)明提供一種基于移動終端的H264視頻數(shù)據(jù)處理方法,該方法包括:
[0007]Andro id端接收來自視頻采集端的H264視頻數(shù)據(jù)包,對所述H264視頻數(shù)據(jù)包進行拆包組幀操作,得到組幀后的視頻數(shù)據(jù),并將所述組幀后的視頻數(shù)據(jù)存入共享內(nèi)存;
[0008]底層解碼端通過所述共享內(nèi)存與所述Android端進行對所述組幀后的視頻數(shù)據(jù)進行解碼過程中的數(shù)據(jù)交互,得到解碼后的視頻數(shù)據(jù);
[0009]所述Android端從所述共享內(nèi)存提取所述解碼后的視頻數(shù)據(jù)。
[0010]上述方法中,優(yōu)選的,所述Android端與所述底層解碼端之間通過共享內(nèi)存地址來實現(xiàn)所述數(shù)據(jù)交互。
[0011 ]上述方法中,優(yōu)選的,在所述Android端從所述共享內(nèi)存提取所述解碼后的視頻數(shù)據(jù)之后,還包括:
[0012]對所述解碼后的視頻數(shù)據(jù)進行渲染操作,并將渲染得到的視頻數(shù)據(jù)轉(zhuǎn)為位圖數(shù)據(jù)。
[0013]上述方法中,優(yōu)選的,在將所述渲染得到的視頻數(shù)據(jù)轉(zhuǎn)為所述位圖數(shù)據(jù)之后,還包括:
[0014]將所述位圖數(shù)據(jù)按預(yù)設(shè)分段規(guī)則分段緩存至環(huán)形數(shù)據(jù)緩沖區(qū);
[0015]利用SurfaceView組件將所述環(huán)形數(shù)據(jù)緩沖區(qū)中的緩存數(shù)據(jù)繪制到播放面板并進行播放。
[0016]上述方法中,優(yōu)選的,所述底層解碼端利用FFmpeg解碼庫對所述組幀后的視頻數(shù)據(jù)進行解碼。
[0017]本發(fā)明還提供了一種基于移動終端的H264視頻數(shù)據(jù)處理系統(tǒng),該系統(tǒng)包括:
[0018]Android端,用于接收來自視頻采集端的H264視頻數(shù)據(jù)包,對所述H264視頻數(shù)據(jù)包進行拆包組幀操作,得到組幀后的視頻數(shù)據(jù),并將所述組幀后的視頻數(shù)據(jù)存入共享內(nèi)存;
[0019]底層解碼端,用于通過所述共享內(nèi)存與所述Android端進行對所述組幀后的視頻數(shù)據(jù)進行解碼過程中的數(shù)據(jù)交互,得到解碼后的視頻數(shù)據(jù);
[0020]所述Android端還用于從所述共享內(nèi)存提取所述解碼后的視頻數(shù)據(jù)。
[0021]上述系統(tǒng)中,優(yōu)選的,所述Android端與所述底層解碼端之間通過共享內(nèi)存地址來實現(xiàn)所述數(shù)據(jù)交互。
[0022]上述系統(tǒng)中,優(yōu)選的,所述Android端還用于在從所述共享內(nèi)存提取所述解碼后的視頻數(shù)據(jù)之后,對所述解碼后的視頻數(shù)據(jù)進行渲染操作,并將渲染得到的視頻數(shù)據(jù)轉(zhuǎn)為位圖數(shù)據(jù)。
[0023]上述系統(tǒng)中,優(yōu)選的,所述Android端還用于在將所述渲染得到的視頻數(shù)據(jù)轉(zhuǎn)為所述位圖數(shù)據(jù)之后,將所述位圖數(shù)據(jù)按預(yù)設(shè)分段規(guī)則分段緩存至環(huán)形數(shù)據(jù)緩沖區(qū);利用SurfaceView組件將所述環(huán)形數(shù)據(jù)緩沖區(qū)中的緩存數(shù)據(jù)繪制到播放面板并進行播放。
[0024]上述系統(tǒng)中,優(yōu)選的,所述底層解碼端用于對所述組幀后的視頻數(shù)據(jù)進行解碼,包括:
[0025]所述底層解碼端具體用于利用FFmpeg解碼庫對所述組幀后的視頻數(shù)據(jù)進行解碼。
[0026]以上本發(fā)明提供的一種基于移動終端的視頻數(shù)據(jù)處理方法及系統(tǒng),能夠在An droid移動終端實現(xiàn)H264視頻數(shù)據(jù)的穩(wěn)定播放顯示,具體地,An droid端接收來自視頻采集端的H264視頻數(shù)據(jù)包,對所述H264視頻數(shù)據(jù)包進行拆包組幀操作,得到組幀后的視頻數(shù)據(jù),并將所述組幀后的視頻數(shù)據(jù)存入共享內(nèi)存;底層解碼端通過所述共享內(nèi)存與所述Android端進行對所述組幀后的視頻數(shù)據(jù)進行解碼過程中的數(shù)據(jù)交互,得到解碼后的視頻數(shù)據(jù);所述Android端從所述共享內(nèi)存提取所述解碼后的視頻數(shù)據(jù)??梢?,本發(fā)明充分利用了移動終端的內(nèi)存空間,在Android端與底層解碼端進行頻繁的數(shù)據(jù)交互時,可以直接從共享內(nèi)存中讀取或?qū)懭霐?shù)據(jù),并不需要拷貝操作,同時也減少了兩端所用編程語言不一致需要轉(zhuǎn)換所需時耗。因此,本發(fā)明有效解決了現(xiàn)有技術(shù)中因頻繁的拷貝操作和轉(zhuǎn)換操作導(dǎo)致解碼不及時進而造成數(shù)據(jù)交互出現(xiàn)阻塞的問題。
【附圖說明】
[0027]為了更清楚地說明本發(fā)明實施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的實施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)提供的附圖獲得其他的附圖。
[0028]圖1為本發(fā)明實施例提供的一種基于移動終端的H264視頻數(shù)據(jù)處理方法的流程圖;
[0029]圖2為本發(fā)明實施例提供的Android端和底層解碼端之間的數(shù)據(jù)交互示意圖;
[0030]圖3為本發(fā)明實施例提供的一種輕量級的高性能異步處理框架示意圖;
[0031]圖4為本發(fā)明實施例提供的一種基于移動終端的H264視頻數(shù)據(jù)處理系統(tǒng)的結(jié)構(gòu)框圖示意圖。
【具體實施方式】
[0032]下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分實施例,而不是全部的實施例。基于本發(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本發(fā)明保護的范圍。
[0033]本發(fā)明的核心是提供一種基于移動終端的視頻數(shù)據(jù)處理方法及系統(tǒng),以解決現(xiàn)有技術(shù)中因頻繁的拷貝操作和轉(zhuǎn)換操作導(dǎo)致解碼不及時進而造成數(shù)據(jù)交互出現(xiàn)阻塞的問題。
[0034]為了使本技術(shù)領(lǐng)域的人員更好地理解本發(fā)明方案,下面結(jié)合附圖和【具體實施方式】對本發(fā)明作進一步的詳細說明。
[0035]參考圖1,圖1示出了本發(fā)明實施例提供的一種基于移動終端的H264視頻數(shù)據(jù)處理方法的流程圖,該方法具體可以包括如下步驟:
[0036]步驟SlOO、Android端接收來自視頻采集端的H264視頻數(shù)據(jù)包,對H264視頻數(shù)據(jù)包進行拆包組幀操作,得到組幀后的視頻數(shù)據(jù),并將組幀后的視頻數(shù)據(jù)存入共享內(nèi)存。
[0037]本發(fā)明實施例提供的方法的執(zhí)行主體為基于移動終端的H264視頻數(shù)據(jù)處理系統(tǒng),在實際應(yīng)用中,該系統(tǒng)以軟件的形式承載于移動終端,并且,本發(fā)明主要針對的是基于Android的移動終端,比如智能手機、平板等等。為便于本領(lǐng)域技術(shù)人員理解本發(fā)明所提供的技術(shù)方案,以下以移動終端為執(zhí)行主體進行方案闡述。
[0038]本發(fā)明中,移動終端包括Android端和底層解碼端,底層解碼端負責(zé)與Android端進行數(shù)據(jù)交互實現(xiàn)解碼操作,其它的操作內(nèi)容有由Android端來處理。具體地,Android端包括預(yù)處理模塊和播放模塊:
[0039]預(yù)處理模塊主要負責(zé)執(zhí)行步驟S100,其目的在于提供一種自定義的基于Java語言的RTP(Real_time Transport Protocol,實時傳輸協(xié)議)拆包方法及實現(xiàn)RTP數(shù)據(jù)包信息緩存的序列化組件,以實現(xiàn)基于Android平臺下的針對H264視頻數(shù)據(jù)的拆包組幀組件,進而解決與Android系統(tǒng)內(nèi)核的兼容性問題及在碼流不穩(wěn)定的情況下視頻數(shù)據(jù)會出現(xiàn)亂序、丟包情況的問題。在具體實施過程中,對預(yù)處理模塊進行自定義設(shè)置,具體地,預(yù)處理模塊可以包括RTP包信息緩存序列化組件!12641^1^1^€6廠1^13緩存拆包組件!12641^1306111111丨丨?1616『及RTP包分析組件H264BufferUtils。這三個組件能夠配合協(xié)作實現(xiàn)RTP包的拆包組幀,并將組幀后的視頻數(shù)據(jù)通過共享內(nèi)存?zhèn)鬟f至底層解碼端。
[0040]其中,上述H264RTPBuff er組件用于緩存RTP荷載、視頻文件數(shù)據(jù)格式、幀率、分辨率、時間戳等信息,并提供一個掩模標(biāo)志FLAG描述當(dāng)前H264RTPBuffer的布爾屬性。上述H264RTPDemultiplexer組件主要實現(xiàn)RTP包的解耦合,并緩存組幀數(shù)據(jù)。上述H264BufferUtils用于對分片包數(shù)據(jù)類型進行分析,判斷每一個輸入分片包的幀類型,如單幀、分片幀判斷,SPS, PPS、I幀及P幀判斷。
[0041]對于上述預(yù)處理模塊而言,其使用Java語言能實現(xiàn)與Android平臺無縫對接。通過H264RTPBufTer組件緩存數(shù)據(jù),對于荷載數(shù)據(jù)的讀取更加方便,且可根據(jù)需要擴展數(shù)據(jù)類型,序列號及FLAG掩模標(biāo)志的設(shè)置則能避免幀亂序的發(fā)生。
[0042 ]另外,對于Andro i d端中的播放模塊,其詳細內(nèi)容參見后文。
[0043]步驟SlOl、底層解碼端通過共享內(nèi)存與Android端進行對組幀后的視頻數(shù)據(jù)進行解碼過程中的數(shù)據(jù)交互,得到解碼后的視頻數(shù)據(jù)。
[0044]本發(fā)明中,底層解碼端利用FFmpeg解碼庫對組幀后的視頻數(shù)據(jù)進行解碼。
[0045]參考圖2示出的Android端和底層解碼端之間的數(shù)據(jù)交互示意圖,具體地,在實際應(yīng)用中,執(zhí)行視頻數(shù)據(jù)拆包組幀及播放的Android端是基于Java語言實現(xiàn)的,而執(zhí)行解碼操作的底層解碼端是通過C語言實現(xiàn)的。為了減少兩端所用編程語言不一致需要轉(zhuǎn)換所需時耗,本發(fā)明利用移動終端的內(nèi)存空間,為Android端和底層解碼端在解碼過程中的數(shù)據(jù)交互分配共享內(nèi)存,并且兩者通過共享JNI層內(nèi)存地址的傳遞,底層代碼可以直接對內(nèi)存中數(shù)據(jù)進行處理,實現(xiàn)Android