通过mediaCodec解码h264数据包dequeueInputBuffer()返回"当前没有这样的缓冲区"

时间:2014-06-26 11:21:42

标签: android h.264 decoding mediacodec decoder

我想用mediaDecoder解码包含H264视频的数据报包。 (数据包通过rtp从rtsp服务器发送)

我想我做错了因为我从dequeueInputBuffer()获得了-1(这意味着目前没有这样的缓冲区

我正在寻找几天但找不到合适的解决方案。

这个结果的意思是什么?我做错了什么?

这是我的代码。 帮助我让它发挥作用。

private void decodeVideo() {

    new Thread(new Runnable() {

        @Override
        public void run() {
            MediaCodec codec = MediaCodec.createDecoderByType("video/avc");
            MediaFormat mediaFormat = MediaFormat.createVideoFormat(
                    "video/avc", 640, 480);
            MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
            codec.configure(mediaFormat, mHolder.getSurface(), null, 0);
            codec.start();
            ByteBuffer[] inputBuffers = codec.getInputBuffers();
            ByteBuffer[] outputBuffers = codec.getOutputBuffers();
            while (flag) {
                int inputBufferIndex = codec.dequeueInputBuffer(10000);
                if (inputBufferIndex >= 0) {
                    while (mPackets.size() <= 0) {
                        try {
                            Log.d(TAG, "nopackets");
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    Log.d(TAG, "now I have packets!");
                    DatagramPacket currentDatagram = mPackets.remove();
                    inputBuffers[inputBufferIndex] = ByteBuffer
                            .wrap(currentDatagram.getData());

                    codec.queueInputBuffer(inputBufferIndex, 0,
                            currentDatagram.getData().length, 10000, 0);
                }
                int outputBufferIndex = codec.dequeueOutputBuffer(info,
                        10000);
                if (outputBufferIndex >= 0) {

                    codec.releaseOutputBuffer(outputBufferIndex, true);
                } else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
                    outputBuffers = codec.getOutputBuffers();
                } else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
                    // Subsequent data will conform to new format.
                    MediaFormat format = codec.getOutputFormat();

                }
            }
            codec.stop();
            codec.release();
            codec = null;

        }
    }).start();
}
谢谢你抽出时间。

2 个答案:

答案 0 :(得分:1)

您是否尝试更改超时参数?,-1表示无限:

codec.dequeueInputBuffer(-1);

以防稍后将提供输入缓冲区。请注意,超时以微秒为单位。

答案 1 :(得分:0)

我有同样的问题。也许你可以试试这些:

codec.dequeueInputBuffer(1000000);  //this is 1 second.

if (inputBufferIndex >= 0) {
    ...
}
else {
   continue;  //maybe infinite
}

我在三星note2 android4.1上遇到了这个问题。它在三星note4 android4.4上没问题。这通常只发生在第一帧时。