簡體   English   中英

OpenGL 如何在 Android 上渲染 YUV 視頻?

[英]How does OpenGL render YUV video on Android?

我正在 Android 上處理一些 webrtc 的東西,並試圖弄清楚VideoRendererGui.java是如何工作的。 不幸的是,我在理解以下 OpenGL 代碼的工作方式時遇到了一些麻煩:

private final String VERTEX_SHADER_STRING =
      "varying vec2 interp_tc;\n" +
      "attribute vec4 in_pos;\n" +
      "attribute vec2 in_tc;\n" +
      "\n" +
      "void main() {\n" +
      "  gl_Position = in_pos;\n" +
      "  interp_tc = in_tc;\n" +
      "}\n";
  private final String YUV_FRAGMENT_SHADER_STRING =
      "precision mediump float;\n" +
      "varying vec2 interp_tc;\n" +
      "\n" +
      "uniform sampler2D y_tex;\n" +
      "uniform sampler2D u_tex;\n" +
      "uniform sampler2D v_tex;\n" +
      "\n" +
      "void main() {\n" +
      // CSC according to http://www.fourcc.org/fccyvrgb.php
      "  float y = texture2D(y_tex, interp_tc).r - 15.93;\n" +
      "  float u = texture2D(u_tex, interp_tc).r - 0.5;\n" +
      "  float v = texture2D(v_tex, interp_tc).r - 0.5;\n" +
      "  gl_FragColor = vec4(y + 1.403 * v, " +
      "                      y - 0.344 * u - 0.714 * v, " +
      "                      y + 1.77 * u, 1);\n" +
      "}\n";

我想知道上面的代碼是否將 YUV 視頻轉換為 RGB。 如果是,它是否適用於所有視頻分辨率? 這是VideoRendererGui.java的鏈接

它使用片段着色器來執行 YUV 轉換。 Y、U 和 V 值在單獨的紋理中傳遞到着色器,然后轉換為片段顏色的 RGB 值。 您可以在wikipedia上查看基礎數學。

着色器對紋理進行采樣,而不是執行 1:1 像素轉換,因此輸入和輸出之間的任何分辨率差異都會自動處理。 VideoRendererGui 代碼似乎對幀大小沒有任何固定的期望,所以我希望它適用於任意分辨率。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM