Android 如何从MediaCodec的解码输出中获取YUV并将其绘制在GLSurfaceView上?

Android 如何从MediaCodec的解码输出中获取YUV并将其绘制在GLSurfaceView上?,android,android-mediacodec,yuv,glsurfaceview,Android,Android Mediacodec,Yuv,Glsurfaceview,我需要使用GLSURFACHEVIEW播放视频流。我试着获取输出并渲染它们。但是颜色不正确 我将outputbuffer转储到文件并用yuv查看器打开它,颜色也不正确。所以我怀疑我使用了错误的方法来获取outputbuffer?代码如下: mediaCodec = MediaCodec.createDecoderByType("video/avc"); MediaFormat mediaFormat = MediaFormat.createVideoFormat("video/avc", wid

我需要使用GLSURFACHEVIEW播放视频流。我试着获取输出并渲染它们。但是颜色不正确

我将outputbuffer转储到文件并用yuv查看器打开它,颜色也不正确。所以我怀疑我使用了错误的方法来获取outputbuffer?代码如下:

mediaCodec = MediaCodec.createDecoderByType("video/avc");
MediaFormat mediaFormat = MediaFormat.createVideoFormat("video/avc", width, height);
mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 500000);
mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 15);
mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420PackedSemiPlanar);
mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5);
mediaCodec.configure(mediaFormat, null, null, 0);
mediaCodec.start();

ByteBuffer[] inputBuffers = mediaCodec.getInputBuffers();

int inputBufferIndex = mediaCodec.dequeueInputBuffer(-1);
if (inputBufferIndex >= 0) {
   ByteBuffer inputBuffer = inputBuffers[inputBufferIndex];
   inputBuffer.clear();
   inputBuffer.put(avFrame.frmData);
   mediaCodec.queueInputBuffer(inputBufferIndex, 0, avFrame.frmData.length, 0L, 0);
  }

MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
ByteBuffer[] outputBuffers = mediaCodec.getOutputBuffers();
int outputBufferIndex = mediaCodec.dequeueOutputBuffer(bufferInfo, 0);
byte[] outData = new byte[bufferInfo.size];
while (outputBufferIndex >= 0) {
    ByteBuffer outputBuffer = outputBuffers[outputBufferIndex];

    outputBuffer.position(bufferInfo.offset);
    outputBuffer.limit(bufferInfo.offset + bufferInfo.size);
    outputBuffer.get(outData);

    mediaCodec.releaseOutputBuffer(outputBufferIndex, true);
    outputBufferIndex = mediaCodec.dequeueOutputBuffer(bufferInfo, 0);
    mRenderer.setFrame(outData, avFrame.getVideoWidth(), avFrame.getVideoHeight());
}

您是否试图以某种方式修改数据?如果您只想播放视频帧,您可以直接将其发送到曲面。有关各种示例,请参见Grafika()。如果您确实需要原始YUV,请理解解码器会忽略KEY_COLOR_格式——解码器可以使用它想要的任何格式。关于的其他信息。谢谢,法登。现在我知道输出YUV的格式与SoC有关。我决定改用SurfaceView。