1. 程式人生 > >音視訊直播技術--視訊渲染之EGL

音視訊直播技術--視訊渲染之EGL

前言

我們在Andriod系統下做視訊渲染時要使用 OpengGL ES, 而使用 OpengGL ES 就不得不提到 EGL。那麼EGL是什麼呢?它又在渲染時起到什麼作用呢?今天我就給大家介紹一下 EGL.

什麼是EGL

EGL是一套用於管理繪製Surface的API。它的執行機制如下:

  • 與系統的本地視窗進行通訊。
  • 查詢繪製Surface的有效型別與配置。
  • 建立會制Surface。
  • 建立Context來管理渲染資源,如OpenGL ES 的 Shader 陣列資料。
  • 將 OpengGL ES 渲染的資料輸出到 Surface中,並最終將 Surface中的內容輸出到本地視窗。

下圖展示了 EGL 在視訊渲染中的作用:

  • Display(EGLDisplay) 是對實際顯示裝置的抽象。
  • Surface(EGLSurface)是對用來儲存影象的記憶體區域FrameBuffer的抽象,包括Color Buffer, Stencil Buffer ,Depth Buffer.
  • Context (EGLContext) 儲存OpenGL ES繪圖的一些狀態資訊及Shader陣列資料。

使用 EGL 的步驟

可以把 EGL 看作是 OpenGL ES 與 本地視窗系統之間的膠水層。使用EGL需按如下步聚操作:

獲取EGLDisplay物件

在EGL能夠確定什麼型別的會制Surface或底層系統的其它特性之前,需要先與系統視窗建立通訊。EGL提供了一個型別EGLDisplay,它封裝了所有操作本地視窗的API。使用EGL時,第一步操作就是建立並初始化與EGLDisplay的連線。下面是連線EGLDisplay的具體函式:

EGLDisplay eglGetDisplay(EGLNativeDisplayType display_id);

初始化與EGL之間的連線

EGL成功與EGLDisplay連線後,需要初始化EGL,呼叫eglInitialize函式完這成這個作務。函式如下:

EGLBoolean eglInitialize(
        EGLDisplay display,
        int
[] major, int majorOffset, int[] minor, int minorOffset );

eglInitialize函式初始化EGL的內部資料結構,如果EGL初始化失敗,就會返回EGL_FALSE。

獲取EGLConfig物件

EGL初始化完成後,我們就可以獲取渲染Surfaces的型別和配置了。EGLConfig包括所有關於Surface的配置資訊。這些資訊包括可用顏色數,與配置相關的額外緩衝區(如深度和模板緩衝),Surface的型別和眾多的其他特點。函式如下:

boolean eglChooseConfig(
        EGLDisplay display,
        int[] attrib_list,
        int attrib_listOffset,
        EGLConfig[] configs,
        int configsOffset,
        int config_size,
        int[] num_config,
        int num_configOffset
);

建立EGLContext例項

EGLContext結構內部包含OpenGL ES 2所有的狀態及所需的操作。例如,它包含引用到頂點和片段著色器的陣列資料。在OpenGL ES 2可以繪製之前,需要先建立好EGLContext。函式如下:

EGLContext eglCreateContext(
        EGLDisplay display,
        EGLConfig config,
        EGLContext share_context,
        int[] attrib_list,
        int offset
);

建立EGLSurface例項

建立完EGLConfig後,可根據EGLConfig建立EGLSurface。EGLSurface相當於一塊畫布(一塊記憶體空間),使用者想繪製的資訊首先都要先繪製到EGLSurface上。

EGLSurface eglCreateWindowSurface(
        EGLDisplay dpy,
        EGLConfig config,
        Object win,
        int[] attrib_list,
        int offset
);

連線EGLContext和EGLSurface

通過上面的步驟,我們已經有了 EGLContext 和 EGLSurface 物件。下面我們需要將二者關聯在一起,這樣 EGL 就可以控制 OpenGL ES 從 EGLContext 讀取 shader 資料,並向 EGLSurface 中繪製內容了。

boolean eglMakeCurrent(
        EGLDisplay dpy,
        EGLSurface draw,
        EGLSurface read,
        EGLContext ctx
);

使用GL指令繪製圖形

EGL將EGLSurface中的內容通過 EGLDisplay 輸出到本地視窗上。

boolean eglSwapBuffers(
        EGLDisplay dpy,
        EGLSurface surface
);

斷開並釋放與EGLSurface關聯的EGLContext物件

使用 eglMakeCurrent 函式,將 EGLSurface 和 EGLContext 分別設定為 EGL14.EGL_NO_SURFACE 和 EGL14.EGL_NO_CONTEXT,這樣就將兩者的關係斷開了。

eglMakeCurrent(
          mEGLDisplay,
          EGL14.EGL_NO_SURFACE, 
          EGL14.EGL_NO_SURFACE,
          EGL14.EGL_NO_CONTEXT
);

刪除EGLSurface物件

boolean eglDestroySurface(
        EGLDisplay dpy,
        EGLSurface surface
);

刪除EGLContext物件

boolean eglDestroyContext(
        EGLDisplay dpy,
        EGLContext ctx
);

終止與EGLDisplay之間的連線

boolean eglTerminate(
        EGLDisplay dpy
);

微信公眾號

相關推薦

視訊直播技術--視訊渲染EGL

前言 我們在Andriod系統下做視訊渲染時要使用 OpengGL ES, 而使用 OpengGL ES 就不得不提到 EGL。那麼EGL是什麼呢?它又在渲染時起到什麼作用呢?今天我就給大家介紹一下 EGL. 什麼是EGL EGL是一套用於管理繪製Su

視訊直播技術詳解推流和傳輸

宣告:本文為CSDN原創投稿文章,未經許可,禁止任何形式的轉載。 作者:七牛雲 責編:錢曙光,關注架構和演算法領域,尋求報道或者投稿請發郵件[email protected],另有「CSDN 高階架構師群」,內有諸多知名網際網路公司的大牛架構師,

視訊直播技術詳解處理

宣告:本文為CSDN原創投稿文章,未經許可,禁止任何形式的轉載。 作者:七牛雲 責編:錢曙光,關注架構和演算法領域,尋求報道或者投稿請發郵件[email protected],另有「CSDN 高階架構師群」,內有諸多知名網際網路公司的大牛架構師,

視訊直播技術詳解編碼和封裝

七牛雲於6月底釋出了一個針對視訊直播的實時流網路LiveNet和完整的直播雲解決方案,很多開發者對這個網路和解決方案的細節和使用場景非常感興趣。 結合該實時流網路LiveNet和直播雲解決方案的實踐,我們將用七篇文章,更系統化地介紹當下大熱的視訊直播各環節的關鍵技術,幫

視訊直播技術」OpenGL渲染距陣變換

前言 在前面的幾篇文章中我介紹了以下幾種音視訊直播技術: 接下來幾篇文章為大家介紹一下Android下如何使用OpenGL進行渲染。 OpenGLES 在Android下進行視訊渲染使用的是 OpenGLES。OpenGLES(OpenG

視訊直播技術」OpenGL渲染著色器

前言 本文介紹一下OpenGL的基本概念。在OpenGL中,只能畫三種圖元,點、線、三角型。在OpenGLES2.0之後,引用也GLSL(OpenGL Shader Languge),它類似於C語言的語法。 著色器型別 有兩種常用著色器,分別是

視訊直播技術iOS端推流

隨著網路基礎建設的發展和資費的下降,在這個內容消費升級的時代,文字、圖片無法滿足人們對視覺的需求,因此視訊直播應運而生。承載了實時性Real-Time和互動性的直播雲服務是直播覆蓋各行各業的新動力。網易雲信推出一系列文章,對視訊直播技術進行深入講解,本篇文章將向大家介紹iOS

視訊直播--技術架構

前言 今天和大家講一下音視訊直播技術架構。之前的關注點主要放在客戶端如何採集音訊資料上,經過這兩天的思考,我覺得應該先給大家講一下音視訊直播技術架構,這樣更容易從整體上理解視訊直播技術是如何運轉的,之後再逐步的介紹每一個主題。 簡單的音視訊直播架構

視訊直播技術詳解》系列二:處理

視訊或者音訊完成採集之後得到原始資料,為了增強一些現場效果或者加上一些額外的效果,我們一般會在將其編碼壓縮前進行處理,比如打上時間戳或者公司 Logo 的水印,祛斑美顏和聲音混淆等處理。在主播和觀眾連麥場景中,主播需要和某個或者多個觀眾進行對話,並將對話結果實時分享給其他所

視訊直播技術」Android下H264解碼

前言 上一篇文章中我介紹瞭如何使用MediaCodec編碼,今天我們再來分析一下如何通過 MediaCodec 進行解碼。 為了講解的方便,我們引入了 MediaExtractor 類。它用於開啟MP4等媒體檔案,並從中抽取出音視訊資料。 開啟

視訊直播技術詳解》系列五:推流和傳輸

七牛雲於 6 月底釋出了一個針對視訊直播的實時流網路 LiveNet 和完整的直播雲解決方案,很多開發者對這個網路和解決方案的細節和使用場景非常感興趣。結合七牛實時流網路 LiveNet 和直播雲解決方案的實踐,我們用八篇文章,更系統化地介紹當下大熱的視訊直播各環節的關鍵技

視訊直播技術--10分鐘搭建好直播平臺

前言 今天給大家講一下如何搭建最簡單的音視訊直播平臺。在之前的文章中我已經給大家介紹過音視訊直播技術架構,沒看過的同學可以看一下。瞭解了直播的技術架構,我們就親手把它搭建出來,也讓自己有點成就感。 我今天教給大家搭建的這個直播平臺是一個實驗平臺與音

視訊直播技術漫談

前言 今天的給大家簡單的介紹一下音視訊技術主要應用於哪些產品, 以及這些產品都涉及到哪些技術,並簡單講一下每種技術的難點,最後我想談一談音視訊直播的未來。 產品分類 現在大家一談到音視訊直播就會想到花椒、映客等娛樂直播,還有鬥魚、熊貓等遊戲直播,這

視訊直播技術:最大限度保障流暢性和清晰度

直播和互動直播在2017年引起了人們的極大關注,應運而生的各種直播類APP多如牛毛。隨著互動直播的逐漸興起,互動成為直播APP的強需求。然而,實際網路中的丟包、延遲、抖動等問題仍然嚴重影響了直播的效果。 針對上述問題,本文介紹了網易雲信直播的網路QoS技術,旨在幫助讀者瞭解在極差網路環境下如何最

視訊直播技術詳解:直播的推流排程

作為直播傳輸的第一步,推流排程對於直播鏈路的影響非常大。本篇文章將針對這個話題,從傳輸的角度,講一講網易雲信直播是如何做好推流排程的。 直播推流是什麼 首先,直播推流,即主播將自己的本地客戶端採集編碼後的視訊資料“推”出去。推流會涉及到兩個問題:視訊推到哪裡去了以

視訊直播技術詳解》系列之一:開篇

作者:七牛雲 隨著網際網路使用者消費內容和互動方式的升級,支撐這些內容和互動方式的基礎設施也正在悄悄發生變革。手機裝置拍攝視訊能力和網路的升級催生了大家對視訊直播領域的關注,吸引了很多網際網路創業者或者成熟企業進入該領域。 七牛雲作為一家以基礎服務能力見長的雲端計

視訊直播技術詳解》系列:(4)採集

原文來自七牛雲,感謝原作者。 採集是整個視訊推流過程中的第一個環節,它從系統的採集裝置中獲取原始視訊資料,將其輸出到下一個環節。視訊的採集涉及兩方面資料的採集:音訊採集和影象採集,它們分別對應

視訊直播技術的基本概念入門

本文章只介紹視訊轉碼,上圖也省略音訊部分,主播用手機開播,通過攝像頭採集資料,編碼上傳到服務端,服務端解碼還原資料,再進行轉碼成各樣視訊流,再編碼給觀看端。 這裡介紹幾個概念: 編碼:指通過特定的壓縮技術,將某個視訊格式的檔案轉換成另一種視訊格式檔案的方式,由於原始視訊資料

視訊直播技術詳解」系列之一:採集

關於直播的技術文章不少,成體系的不多。我們將用七篇文章,更系統化地介紹當下大熱的視訊直播各環節的關鍵技術,幫助視訊直播創業者們更全面、深入地瞭解視訊直播技術,更好地技術選型。 本系列文章大綱如下: (一)採集 (二)處理 (三)編碼和封裝 (四)推流和傳輸 (

視訊直播技術詳解》系列:(5)處理

原文來自七牛雲,感謝原作者。 本片我們將介紹處理部分。網際網路直播中,常見視訊處理功能如美顏、視訊水印、濾鏡、連麥等。 視訊或者音訊完成採集之後得到原始資料,為了增強一些現場效果或者加上一些