Android 通过mediaCodec解码h264数据包dequeueInputBuffer()返回;“目前没有此类缓冲区可用”;
我想用mediaDecoder解码包含H264视频的数据报数据包。 (数据包通过rtp从rtsp服务器发送) 我想我做错了什么,因为我从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()
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
}