Android 視頻預(yù)覽的兩種方案對(duì)比

SurfaceView是什么 ?

SurfaceView優(yōu)點(diǎn)及缺點(diǎn)?

SurfaceView中雙緩沖?

TextureView是什么?

TextureView優(yōu)點(diǎn)及缺點(diǎn)?

兩者的性能相比如何?

播放器應(yīng)該選擇誰(shuí)?

1.SurfaceView是什么

它繼承自類View,因此它本質(zhì)上是一個(gè)View。但與普通View不同的是,它有自己的Surface。有自己的Surface,在WMS中有對(duì)應(yīng)的WindowState,在SurfaceFlinger中有Layer。我們知道,一般的Activity包含的多個(gè)View會(huì)組成View hierachy的樹形結(jié)構(gòu),只有最頂層的DecorView,也就是根結(jié)點(diǎn)視圖,才是對(duì)WMS可見的。這個(gè)DecorView在WMS中有一個(gè)對(duì)應(yīng)的WindowState。相應(yīng)地,在SF中對(duì)應(yīng)的Layer。而SurfaceView自帶一個(gè)Surface,這個(gè)Surface在WMS中有自己對(duì)應(yīng)的WindowState,在SF中也會(huì)有自己的Layer。雖然在App端它仍在View hierachy中,但在Server端(WMS和SF)中,它與宿主窗口是分離的。這樣的好處是對(duì)這個(gè)Surface的渲染可以放到單獨(dú)線程去做,渲染時(shí)可以有自己的GL context。這對(duì)于一些游戲、視頻等性能相關(guān)的應(yīng)用非常有益,因?yàn)樗粫?huì)影響主線程對(duì)事件的響應(yīng)。但它也有缺點(diǎn),因?yàn)檫@個(gè)Surface不在View hierachy中,它的顯示也不受View的屬性控制,所以不能進(jìn)行平移,縮放等變換,也不能放在其它ViewGroup中,一些View中的特性也無(wú)法使用。

2.SurfaceView優(yōu)點(diǎn)及缺點(diǎn)

優(yōu)點(diǎn):可以在一個(gè)獨(dú)立的線程中進(jìn)行繪制,不會(huì)影響主線程 使用雙緩沖機(jī)制,播放視頻時(shí)畫面更流暢
缺點(diǎn):Surface不在View hierachy中,它的顯示也不受View的屬性控制,所以不能進(jìn)行平移,縮放等變換,也不能放在其它ViewGroup中。SurfaceView 不能嵌套使用

3.SurfaceView中雙緩沖

雙緩沖:在運(yùn)用時(shí)可以理解為:SurfaceView在更新視圖時(shí)用到了兩張Canvas,一張frontCanvas和一張backCanvas,每次實(shí)際顯示的是frontCanvas,backCanvas存儲(chǔ)的是上一次更改前的視圖,當(dāng)使用lockCanvas()獲取畫布時(shí),得到的實(shí)際上是backCanvas而不是正在顯示的frontCanvas,之后你在獲取到的backCanvas上繪制新視圖,再unlockCanvasAndPost(canvas)此視圖,那么上傳的這張canvas將替換原來(lái)的frontCanvas作為新的frontCanvas,原來(lái)的frontCanvas將切換到后臺(tái)作為backCanvas。例如,如果你已經(jīng)先后兩次繪制了視圖A和B,那么你再調(diào)用lockCanvas()獲取視圖,獲得的將是A而不是正在顯示的B,之后你講重繪的C視圖上傳,那么C將取代B作為新的frontCanvas顯示在SurfaceView上,原來(lái)的B則轉(zhuǎn)換為backCanvas。

4.TextureView是什么?

在4.0(API level 14)中引入,與SurfaceView一樣繼承View, 它可以將內(nèi)容流直接投影到View中,它可以將內(nèi)容流直接投影到View中,可以用于實(shí)現(xiàn)Live preview等功能。和SurfaceView不同,它不會(huì)在WMS中單獨(dú)創(chuàng)建窗口,而是作為View hierachy中的一個(gè)普通View,因此可以和其它普通View一樣進(jìn)行移動(dòng),旋轉(zhuǎn),縮放,動(dòng)畫等變化。值得注意的是TextureView必須在硬件加速的窗口中。它顯示的內(nèi)容流數(shù)據(jù)可以來(lái)自App進(jìn)程或是遠(yuǎn)端進(jìn)程。從類圖中可以看到,TextureView繼承自View,它與其它的View一樣在View hierachy中管理與繪制。TextureView重載了draw()方法,其中主要SurfaceTexture中收到的圖像數(shù)據(jù)作為紋理更新到對(duì)應(yīng)的HardwareLayer中。SurfaceTexture.OnFrameAvailableListener用于通知TextureView內(nèi)容流有新圖像到來(lái)。SurfaceTextureListener接口用于讓TextureView的使用者知道SurfaceTexture已準(zhǔn)備好,這樣就可以把SurfaceTexture交給相應(yīng)的內(nèi)容源。Surface為BufferQueue的Producer接口實(shí)現(xiàn)類,使生產(chǎn)者可以通過(guò)它的軟件或硬件渲染接口為SurfaceTexture內(nèi)部的BufferQueue提供graphic buffer。

5.TextureView優(yōu)點(diǎn)及缺點(diǎn)?

優(yōu)點(diǎn):支持移動(dòng)、旋轉(zhuǎn)、縮放等動(dòng)畫,支持截圖
缺點(diǎn):必須在硬件加速的窗口中使用,占用內(nèi)存比SurfaceView高,在5.0以前在主線程渲染,5.0以后有單獨(dú)的渲染線程。

5.兩者的性能相比如何
圖片.png
5.播放器應(yīng)該選擇誰(shuí)

從性能和安全性角度出發(fā),使用播放器優(yōu)先選SurfaceView。
1、在android 7.0上系統(tǒng)surfaceview的性能比TextureView更有優(yōu)勢(shì),支持對(duì)象的內(nèi)容位置和包含的應(yīng)用內(nèi)容同步更新,平移、縮放不會(huì)產(chǎn)生黑邊。 在7.0以下系統(tǒng)如果使用場(chǎng)景有動(dòng)畫效果,可以選擇性使用TextureView
2、由于失效(invalidation)和緩沖的特性,TextureView增加了額外1~3幀的延遲顯示畫面更新
3、TextureView總是使用GL合成,而SurfaceView可以使用硬件overlay后端,可以占用更少的內(nèi)存帶寬,消耗更少的能量
4、TextureView的內(nèi)部緩沖隊(duì)列導(dǎo)致比SurfaceView使用更多的內(nèi)存
5、SurfaceView: 內(nèi)部自己持有surface,surface 創(chuàng)建、銷毀、大小改變時(shí)系統(tǒng)來(lái)處理的,通過(guò)surfaceHolder 的callback回調(diào)通知。當(dāng)畫布創(chuàng)建好時(shí),可以將surface綁定到MediaPlayer中。SurfaceView如果為用戶可見的時(shí)候,創(chuàng)建SurfaceView的SurfaceHolder用于顯示視頻流解析的幀圖片,如果發(fā)現(xiàn)SurfaceView變?yōu)橛脩舨豢梢姷臅r(shí)候,則立即銷毀SurfaceView的SurfaceHolder,以達(dá)到節(jié)約系統(tǒng)資源的目的

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容