2017-09-15 586 views
1

我目前正在嘗試開發Android上的視頻播放器,但我正在努力使用彩色格式。Android MediaCodec輸出格式:GLES外部紋理(YUV/NV12)到GLES紋理(RGB)

上下文:我提取並通過MediaExtractor/MediaCodec的標準combinaison解碼的視頻。因爲我需要提取的幀是可用作爲OpenGLES紋理(RGB),設置我的解碼器(MediaCodec),使得其通過表面紋理饋送外部GLES紋理(GL_TEXTURE_EXTERNAL_OES)。我知道我的硬件解碼器輸出的數據是在NV12YUV420SemiPlanar)格式,我需要通過渲染將其轉換爲RGB(使用片段着色器進行轉換)。

MediaCodec ---> GLES外部紋理(NV12)[1] --->渲染---> GLES紋理(RGB)

其中I鬥爭的要點是 :如何訪問GLES外部紋理中包含的特定Y,U和V值([1])。我不知道如何設置GLES紋理內存,也不知道如何訪問它(除了「texture()」和「texelFetch()」GLSL函數)。

  • 有沒有辦法訪問數據,因爲我會訪問一個簡單的數組(指針+偏移)?
  • 我是否過時了整件事?
  • 請執行表面SurfaceTexture是否需要照顧轉換? (I不這樣認爲)
  • 執行下列任表面表面紋理改變數據的存儲器佈局,同時填充GLES外部紋理([1]),以便組件可以通過GLES紋理訪問功能訪問?

回答

2

是的,我會說你正在超越它。你是否測試了一些事情並遇到了一個你可以描述的實際問題,或者這只是迄今爲止的理論?然後你訪問它的任何RGB紋理 -

即使原始解碼器本身輸出NV12,當您通過SufaceTexture訪問這個細節被隱藏。由於紋理的物理內存佈局是隱藏的,你真的不知道,如果它實際上被轉換一次全部得到它之前,或者如果紋理存取每次做對的即時轉換你品嚐它。據我所知,實現可以通過任何這些方式自由執行,而實現細節如何完成通過公共API完全不可觀察。

+0

我實施了一些測試,你是對的。我的問題只是理論上的,並且運行一些例子讓我意識到這些麻煩對我來說是隱藏的。感謝你的回答 –