Dummy Surface 實(shí)現(xiàn)原理

Dummy Surface 的內(nèi)部實(shí)現(xiàn)主要依賴(lài)于 Android 的圖形渲染機(jī)制,特別是 Surface 和 SurfaceTexture。Dummy Surface 是一個(gè)沒(méi)有實(shí)際顯示輸出的表面(Surface)歌懒,它主要用于保持視頻解碼器的工作狀態(tài)拒名,即使沒(méi)有實(shí)際的渲染需求安寺。下面是對(duì) Dummy Surface 內(nèi)部實(shí)現(xiàn)原理的詳細(xì)說(shuō)明凡壤。

  • 核心概念
    Surface 和 SurfaceTexture:
    Surface 是 Android 提供的一個(gè)用于繪圖的類(lèi),可以將繪圖輸出發(fā)送到顯示設(shè)備上橙喘。
    SurfaceTexture 是一個(gè)可以從 OpenGL ES 接收?qǐng)D像流的類(lèi)时鸵,通常用于將視頻幀發(fā)送到一個(gè)紋理中。
    EGL (Embedded-System Graphics Library):
    EGL 是一個(gè)接口渴杆,連接 OpenGL ES 和底層的本地窗口系統(tǒng)寥枝。
    它提供了創(chuàng)建繪圖上下文和同步繪圖操作的功能宪塔。
    Dummy Surface 的實(shí)現(xiàn)
    Dummy Surface 利用 SurfaceTexture 和 EGL 來(lái)創(chuàng)建一個(gè)虛擬的渲染目標(biāo),而不需要實(shí)際的顯示輸出囊拜。

  • 實(shí)現(xiàn)步驟
    創(chuàng)建 SurfaceTexture:
    創(chuàng)建一個(gè) SurfaceTexture 對(duì)象某筐,它可以接收 OpenGL ES 繪制的圖像。
    創(chuàng)建 Surface:
    使用 SurfaceTexture 創(chuàng)建一個(gè) Surface 對(duì)象冠跷。這個(gè) Surface 對(duì)象不會(huì)顯示在屏幕上南誊,而是作為一個(gè)虛擬的目標(biāo)。
    與 EGL 結(jié)合:
    創(chuàng)建一個(gè) EGL 顯示和上下文蜜托,將 SurfaceTexture 綁定到 EGL 的繪圖上下文中抄囚,以便接收?qǐng)D像流。
    維持視頻解碼器的工作狀態(tài):
    使用 Dummy Surface 作為視頻解碼器的輸出目標(biāo)橄务,保持解碼器的工作狀態(tài)幔托,即使沒(méi)有實(shí)際的視頻輸出需求。

  • 代碼示例
    以下是一個(gè)簡(jiǎn)化的 DummySurface 實(shí)現(xiàn)示例:

java
復(fù)制代碼
import android.graphics.SurfaceTexture;
import android.view.Surface;
import javax.microedition.khronos.egl.EGL10;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.egl.EGLContext;
import javax.microedition.khronos.egl.EGLDisplay;
import javax.microedition.khronos.egl.EGLSurface;

public final class DummySurface extends Surface {
    private SurfaceTexture surfaceTexture;
    private EGL10 egl;
    private EGLDisplay eglDisplay;
    private EGLContext eglContext;
    private EGLSurface eglSurface;

    public DummySurface() {
        super(createSurfaceTexture());
        surfaceTexture = (SurfaceTexture) getSurfaceTexture();
        initializeEGL();
    }

    private static SurfaceTexture createSurfaceTexture() {
        int[] textureId = new int[1];
        // Generate a texture object
        GLES20.glGenTextures(1, textureId, 0);
        return new SurfaceTexture(textureId[0]);
    }

    private void initializeEGL() {
        egl = (EGL10) EGLContext.getEGL();
        eglDisplay = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
        egl.eglInitialize(eglDisplay, null);

        int[] configAttribs = {
            EGL10.EGL_RED_SIZE, 8,
            EGL10.EGL_GREEN_SIZE, 8,
            EGL10.EGL_BLUE_SIZE, 8,
            EGL10.EGL_RENDERABLE_TYPE, EGL10.EGL_WINDOW_BIT,
            EGL10.EGL_NONE
        };
        EGLConfig[] configs = new EGLConfig[1];
        int[] numConfigs = new int[1];
        egl.eglChooseConfig(eglDisplay, configAttribs, configs, 1, numConfigs);

        eglContext = egl.eglCreateContext(eglDisplay, configs[0], EGL10.EGL_NO_CONTEXT, null);
        eglSurface = egl.eglCreateWindowSurface(eglDisplay, configs[0], surfaceTexture, null);
        egl.eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext);
    }

    @Override
    public void release() {
        egl.eglDestroySurface(eglDisplay, eglSurface);
        egl.eglDestroyContext(eglDisplay, eglContext);
        egl.eglTerminate(eglDisplay);
        surfaceTexture.release();
        super.release();
    }
}
  • 代碼解析
    • 創(chuàng)建 SurfaceTexture:
      • createSurfaceTexture() 方法生成一個(gè) OpenGL ES 紋理并創(chuàng)建一個(gè) SurfaceTexture 對(duì)象
    • 初始化 EGL:
      • initializeEGL() 方法初始化 EGL 顯示蜂挪、上下文和表面重挑。將 SurfaceTexture 作為 EGL 的繪圖目標(biāo)。
    • 清理資源:
      • release() 方法用于釋放 EGL 和 SurfaceTexture 資源棠涮,確保資源正確釋放以避免內(nèi)存泄漏谬哀。
    • Dummy Surface 的實(shí)現(xiàn)利用了 SurfaceTexture 和 EGL,通過(guò)創(chuàng)建一個(gè)虛擬的渲染目標(biāo)严肪,使得視頻解碼器能夠正常工作而不需要實(shí)際的顯示輸出史煎。這個(gè)技術(shù)在播放器開(kāi)發(fā)中非常有用,尤其是在處理后臺(tái)播放或純音頻播放等場(chǎng)景時(shí)驳糯。理解其實(shí)現(xiàn)原理篇梭,可以幫助開(kāi)發(fā)者更好地應(yīng)用這一技術(shù)來(lái)優(yōu)化多媒體應(yīng)用的性能和用戶(hù)體驗(yàn)。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末结窘,一起剝皮案震驚了整個(gè)濱河市很洋,隨后出現(xiàn)的幾起案子充蓝,更是在濱河造成了極大的恐慌隧枫,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谓苟,死亡現(xiàn)場(chǎng)離奇詭異官脓,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)涝焙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)卑笨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人仑撞,你說(shuō)我怎么就攤上這事赤兴⊙希” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵桶良,是天一觀(guān)的道長(zhǎng)座舍。 經(jīng)常有香客問(wèn)我,道長(zhǎng)陨帆,這世上最難降的妖魔是什么曲秉? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮疲牵,結(jié)果婚禮上承二,老公的妹妹穿的比我還像新娘。我一直安慰自己纲爸,他們只是感情好亥鸠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著识啦,像睡著了一般读虏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上袁滥,一...
    開(kāi)封第一講書(shū)人閱讀 51,488評(píng)論 1 302
  • 那天盖桥,我揣著相機(jī)與錄音,去河邊找鬼题翻。 笑死揩徊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的嵌赠。 我是一名探鬼主播塑荒,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼姜挺!你這毒婦竟也來(lái)了齿税?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤炊豪,失蹤者是張志新(化名)和其女友劉穎凌箕,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體词渤,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡牵舱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缺虐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芜壁。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出慧妄,到底是詐尸還是另有隱情顷牌,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布塞淹,位于F島的核電站韧掩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏窖铡。R本人自食惡果不足惜疗锐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望费彼。 院中可真熱鬧滑臊,春花似錦、人聲如沸箍铲。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)颠猴。三九已至关划,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間翘瓮,已是汗流浹背贮折。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留资盅,地道東北人调榄。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像呵扛,于是被迫代替她去往敵國(guó)和親每庆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容