我需要使用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());
}