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

时间:2015-07-21 08:53:48

标签: android mediacodec yuv glsurfaceview

我需要使用GLSurfaceView播放视频流。我试图获得输出并渲染它们。但颜色不正确。

我将outputbuffer转储到文件并用yuv viewer打开它,颜色也不正确。所以我怀疑我使用错误的方法来获取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());
}

0 个答案:

没有答案