Android 使用MediaCodec實(shí)現(xiàn)視頻的無(wú)縫切換

一薪韩、功能說(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)方案

流程圖.png

三捉偏、實(shí)現(xiàn)效果

效果圖.gif

四、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 生命周期控制

  1. 切換至后臺(tái)的時(shí)候會(huì)調(diào)用onSurfaceTextureDestroyed秉馏,從后臺(tái)切換回來(lái)會(huì)調(diào)用onSurfaceTextureAvailable。
  2. 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方法。
  3. 當(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市预茄,隨后出現(xiàn)的幾起案子兴溜,更是在濱河造成了極大的恐慌,老刑警劉巖耻陕,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拙徽,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡诗宣,警方通過(guò)查閱死者的電腦和手機(jī)膘怕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)召庞,“玉大人岛心,你說(shuō)我怎么就攤上這事±鹤疲” “怎么了忘古?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)诅诱。 經(jīng)常有香客問(wèn)我髓堪,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任干旁,我火速辦了婚禮驶沼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘争群。我一直安慰自己回怜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布换薄。 她就那樣靜靜地躺著玉雾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪专控。 梳的紋絲不亂的頭發(fā)上抹凳,一...
    開(kāi)封第一講書(shū)人閱讀 49,929評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音伦腐,去河邊找鬼。 笑死失都,一個(gè)胖子當(dāng)著我的面吹牛柏蘑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播粹庞,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼咳焚,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了庞溜?” 一聲冷哼從身側(cè)響起革半,我...
    開(kāi)封第一講書(shū)人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎流码,沒(méi)想到半個(gè)月后又官,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡漫试,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年六敬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驾荣。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡外构,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出播掷,到底是詐尸還是另有隱情审编,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布歧匈,位于F島的核電站垒酬,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜伤溉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一般码、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧乱顾,春花似錦板祝、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至伏伯,卻和暖如春橘洞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背说搅。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工炸枣, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人弄唧。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓适肠,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親候引。 傳聞我的和親對(duì)象是個(gè)殘疾皇子侯养,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350