【问题标题】:decode h264 packets via mediaCodec dequeueInputBuffer() returns "no such buffer is currently available"通过 mediaCodec dequeueInputBuffer() 解码 h264 数据包返回“当前没有可用的缓冲区”
【发布时间】:2014-08-17 05:27:42
【问题描述】:

我想用 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();
}

感谢您抽出宝贵时间。

【问题讨论】:

  • 我遇到了类似的问题,并且能够通过减少调用之间的毫秒数将编码器耗尽到复用器来解决它。在我的代码库中,解码和排水步骤都调用 dequeueOutputBuffer,并且在我的活动中以某种方式切换屏幕会无限期地锁定缓冲区。

标签: android h.264 decoding android-mediacodec decoder


【解决方案1】:

你试过改变超时参数吗?-1表示无限:

codec.dequeueInputBuffer(-1);

以防万一输入缓冲区稍后可用。请注意,超时以微秒为单位。

【讨论】:

  • 我尝试更改它但没有工作,但现在它工作了,不是 100% 确定这是问题
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2017-09-15
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 2016-05-01
    • 2018-10-17
    • 1970-01-01
    • 2019-06-21
    • 2014-01-04
    相关资源
    最近更新 更多