0

我正在尝试使用 android NDK 渲染视频帧。

我使用这个 google Native-Codec NDK 示例代码示例并对其进行了修改,以便我可以手动显示每个视频帧(非隧道)。

所以我添加了这段代码来获取 YUV 中的输出缓冲区。

  ANativeWindow_setBuffersGeometry(mWindow, bufferWidth, bufferHeight,
                                     WINDOW_FORMAT_RGBA_8888
  uint8_t *decodedBuff = AMediaCodec_getOutputBuffer(d->codec, status, &bufSize);
  auto format = AMediaCodec_getOutputFormat(d->codec);
  LOGV("VOUT: format %s", AMediaFormat_toString(format));
  AMediaFormat *myFormat = format;
  int32_t w,h;
  AMediaFormat_getInt32(myFormat, AMEDIAFORMAT_KEY_HEIGHT, &h);
  AMediaFormat_getInt32(myFormat, AMEDIAFORMAT_KEY_WIDTH, &w);
  err = ANativeWindow_lock(mWindow, &buffer, nullptr);

这些代码将 YUV 转换为 RGB 并使用本机窗口显示。

  if (err == 0) {
            LOGV("ANativeWindow_lock()");
            int width =w;
            int height=h;
            int const frameSize = width * height;
            int *line = reinterpret_cast<int *>(buffer.bits);
            for (int y= 0; y < height; y++) {
                for (int x = 0; x < width; x++) {
                /*accessing YUV420SP elements*/
                int indexY = y * width + x;
                int indexU = (size + (y / 2) * (width ) + (x / 2) *2);
                int indexV = (int) (size + (y / 2) * (width) + (x / 2) * 2 + 1);

                /*todo; this conversion to int and then later back to int really isn't required.
                There's room for better work here.*/
                int Y = 0xFF & decodedBuff[indexY];
                int U = 0xFF & decodedBuff[indexU];
                int V = 0xFF & decodedBuff[indexV];

                /*constants picked up from http://www.fourcc.org/fccyvrgb.php*/
                    int R = (int) (Y + 1.402f * (V - 128));
                    int G = (int) (Y - 0.344f * (U - 128) - 0.714f * (V - 128));
                    int B = (int) (Y + 1.772f * (U - 128));

                /*clamping values*/
                R = R < 0 ? 0 : R;
                G = G < 0 ? 0 : G;
                B = B < 0 ? 0 : B;
                R = R > 255 ? 255 : R;
                G = G > 255 ? 255 : G;
                B = B > 255 ? 255 : B;

                line[buffer.stride * y + x] = 0xff000000 + (B << 16) + (G << 8) + R;
            }
        }
ANativeWindow_unlockAndPost(mWindow);

最后,我能够在我的设备上显示视频。现在我的问题是视频无法缩放以适应表面视图:(

在此处输入图像描述

非常感谢您的想法。

4

0 回答 0