MediaCodec在第一秒返回-1,-2,-3

时间:2016-04-25 10:56:35

标签: android mediacodec

我使用MediaCodec解码视频数据,但是当我使用dequeueOutputBuffer方法时,在第一秒内得到结果MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED,MediaCodec.INFO_OUTPUT_FORMAT_CHANGED和MediaCodec.INFO_TRY_AGAIN_LATER。我想在我使用后立即得到它的正常结果这种方法。

String mime = format.getString(MediaFormat.KEY_MIME);
mMediaCodec = MediaCodec.createDecoderByType(mime);
mMediaCodec.configure(format, mSurface , null , 0 );
mMediaCodec.start();
try{
    ByteBuffer[] inputBuffers = mMediaCodec.getInputBuffers();
    ByteBuffer[] outputBuffers = mMediaCodec.getOutputBuffers();
    int inputBufferIndex = mMediaCodec.dequeueInputBuffer(TLMediaCodec.TIMEOUT_USEC);
    if (inputBufferIndex >= 0) {
        ByteBuffer inputBuffer = inputBuffers[inputBufferIndex];
        inputBuffer.clear();
        inputBuffer.put(data);
        mMediaCodec.queueInputBuffer(inputBufferIndex, 0, data.length, ultimestamp, 0);
        int outputBufferIndex = mMediaCodec.dequeueOutputBuffer(mBufferInfo, 100);

        if (outputBufferIndex >= 0)
        {
            try
            {
                mVideoDecodeDelay = System.currentTimeMillis() - mVideoDecodeDelay;
                boolean render = mBufferInfo.size > 0;
                mMediaCodec.releaseOutputBuffer(outputBufferIndex, render);
            }
            catch (Exception e)
            {
                TLLogger.trace(TAG, "decodeOutput failed -- > " + e.toString());
                e.printStackTrace();
            }
        }
        else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED)
        {
            outputBuffers = mMediaCodec.getOutputBuffers();
        }
        else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED)
        {
            MediaFormat format = mMediaCodec.getOutputFormat();
        }
    }
} catch{
    e.printStackTrace();
}

上面是我的代码,我找不到任何解决方法来改善这个问题。 谢谢你的帮助!!!

1 个答案:

答案 0 :(得分:0)

这是正常的。你不能将一帧发送到MediaCodec并获得一个帧;你传递一系列帧并在它们可用时将它们拉出来。预计start()与第一帧的可用性之间存在一些延迟(e.g. this)。如果您希望收到通知而不是poll,请尝试使用较新的异步API方法。

参见"基本用法"靠近bigflake page顶部的笔记。