一薪韩、功能說(shuō)明:
在不同控件之間實(shí)現(xiàn)視頻的無(wú)縫切換。不會(huì)黑屏捌锭,也不需要重新創(chuàng)建解碼器俘陷。
百度上面很多視頻播放都是利用MediaPlayer+顯示視圖(SurfaceView、TextureView)進(jìn)行本地或者網(wǎng)絡(luò)視頻的播放观谦。那么利用MediaCodec對(duì)視頻流進(jìn)行硬解碼的小伙伴該如何在不同的控件之間無(wú)縫切換呢拉盾?是不是TextureView的生命周期很難控制?
二豁状、實(shí)現(xiàn)方案
三捉偏、實(shí)現(xiàn)效果
四、TextureView
4.1 與SurfaceTexture的關(guān)系
TextureView與SurfaceTexture構(gòu)成了組合關(guān)系泻红,可見(jiàn)SurfaceTexture的確是由TextureView給『包辦』了夭禽。在程序世界中,一個(gè)對(duì)象被『包辦』無(wú)非是指:
(1)這個(gè)對(duì)象什么時(shí)候被創(chuàng)建谊路?
(2)這個(gè)對(duì)象如何被創(chuàng)建讹躯?
(3)這個(gè)對(duì)象的產(chǎn)生帶來(lái)了哪些變化,或者說(shuō)程序自從有了它有哪些不同缠劝?
(4)這個(gè)對(duì)象什么時(shí)候被銷(xiāo)毀潮梯?
之所以對(duì)SurfaceTexture這個(gè)對(duì)象要大動(dòng)筆墨,因?yàn)樗钦麄€(gè)顯示框架的『連接者』惨恭。
4.2 生命周期控制
- 切換至后臺(tái)的時(shí)候會(huì)調(diào)用onSurfaceTextureDestroyed秉馏,從后臺(tái)切換回來(lái)會(huì)調(diào)用onSurfaceTextureAvailable。
- TextureView的ViewGroup remove TextureView的時(shí)候會(huì)調(diào)用onSurfaceTextureDestroyed方法脱羡。相同萝究,TextureView的ViewGroup add TextureView的時(shí)候會(huì)調(diào)用onSurfaceTextureAvailable。這些都是建立在視圖可見(jiàn)的基礎(chǔ)上,如果視圖不可見(jiàn)轻黑,add也不會(huì)調(diào)用onSurfaceTextureAvailable方法糊肤,remove也不會(huì)調(diào)用onSurfaceTextureDestroyed方法。
- 當(dāng)TextureView設(shè)置為Gone的時(shí)候氓鄙,并不會(huì)調(diào)用onSurfaceTextureDestroyed方法法馆揉。
4.3設(shè)置SurfaceView
是不是遇到過(guò)在播放視頻返回后臺(tái)再回來(lái),發(fā)現(xiàn)TextureView顯示視圖是一片黑色抖拦?監(jiān)聽(tīng)TextureView的生命周期你會(huì)發(fā)現(xiàn)升酣,返回后臺(tái)是調(diào)用了銷(xiāo)毀方法的舷暮。那你就會(huì)問(wèn)銷(xiāo)毀之后豈不是有需要重新創(chuàng)建?重新創(chuàng)建會(huì)引來(lái)更多的問(wèn)題噩茄,解碼去也需要重新初始化下面。所以我們只能另尋他法,下面方法就是無(wú)縫切換的核心部分绩聘。
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
Log.d(TAG, "onSurfaceTextureDestroyed: ");
mSurfaceTexture = surface;
return false;
}
在銷(xiāo)毀方法中我們注意沥割,有一個(gè)返回參數(shù)。官方的解釋如下
Invoked when the specified SurfaceTexture is about to be destroyed. If returns true, no rendering should happen inside the surface texture after this method is invoked. If returns false, the client needs to call release(). Most applications should return true.
大致的意思是如果返回ture凿菩,SurfaceTexture會(huì)自動(dòng)銷(xiāo)毀机杜,如果返回false,SurfaceTexture不會(huì)銷(xiāo)毀衅谷,需要用戶(hù)手動(dòng)調(diào)用release()進(jìn)行銷(xiāo)毀椒拗。
現(xiàn)在恍然大悟了吧,我們?cè)阡N(xiāo)毀的時(shí)候返回false,并保存SurfaceTexture對(duì)象获黔,然后從后臺(tái)返回界面的時(shí)候在onSurfaceTextureAvailable()方法中蚀苛,調(diào)用setSurfaceTexture(mSurfaceTexture)方法,這樣就會(huì)恢復(fù)之前的畫(huà)面了玷氏。
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface,
int width, int height) {
Log.d(TAG, "onSurfaceTextureAvailable: ");
if(mSurfaceTexture!=null){
mTextureView.setSurfaceTexture(mSurfaceTexture);
}
}
五堵未、可拖拽效果
使用ItemTouchHelper輕松實(shí)現(xiàn)RecyclerView拖拽排序和滑動(dòng)刪除
源碼地址:https://github.com/chezi008/VideoSurveillance