Android 通过mediaCodec解码h264数据包dequeueInputBuffer()返回;“目前没有此类缓冲区可用”;

Android 通过mediaCodec解码h264数据包dequeueInputBuffer()返回;“目前没有此类缓冲区可用”;,android,h.264,decoding,android-mediacodec,decoder,Android,H.264,Decoding,Android Mediacodec,Decoder,我想用mediaDecoder解码包含H264视频的数据报数据包。 (数据包通过rtp从rtsp服务器发送) 我想我做错了什么,因为我从dequeueInputBuffer() 我搜索了好几天,但找不到合适的解决方案 这个结果的意思是什么?我做错了什么 这是我的密码请帮我让它工作起来 private void decodeVideo() { new Thread(new Runnable() { @Override public void run()

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

我想我做错了什么,因为我从
dequeueInputBuffer()

我搜索了好几天,但找不到合适的解决方案

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

这是我的密码帮我让它工作起来

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();
}
私有视频(){
新线程(newrunnable()){
@凌驾
公开募捐{
MediaCodec codec=MediaCodec.createDecoderByType(“视频/avc”);
MediaFormat MediaFormat=MediaFormat.createVideoFormat(
“视频/avc”,640480);
MediaCodec.BufferInfo=新的MediaCodec.BufferInfo();
configure(mediaFormat,mHolder.getSurface(),null,0);
codec.start();
ByteBuffer[]inputBuffers=codec.getInputBuffers();
ByteBuffer[]outputBuffers=codec.getOutputBuffers();
while(旗帜){
int-inputBufferIndex=codec.dequeueInputBuffer(10000);
如果(inputBufferIndex>=0){
而(mpackes.size()=0){
releaseOutputBuffer(outputBufferIndex,true);
}else if(outputBufferIndex==MediaCodec.INFO\u输出\u缓冲区\u已更改){
outputBuffers=codec.getOutputBuffers();
}else if(outputBufferIndex==MediaCodec.INFO\u输出\u格式\u更改){
//后续数据将符合新格式。
MediaFormat=codec.getOutputFormat();
}
}
codec.stop();
codec.release();
编解码器=空;
}
}).start();
}

感谢您抽出时间。

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

codec.dequeueInputBuffer(-1);

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

我也有同样的问题。也许您可以尝试以下方法:

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


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

我尝试过更改它,但没有成功,但现在它成功了,不是100%确定这是问题。我也有类似的问题,并且能够通过减少调用之间的毫秒数来修复它在我的代码库中,解码和排水步骤都调用dequeueOutputBuffer,在我的活动中切换屏幕会无限期地锁定缓冲区。
if (inputBufferIndex >= 0) {
    ...
}
else {
   continue;  //maybe infinite
}