我想用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();
}
谢谢你抽出时间。
答案 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上没问题。这通常只发生在第一帧时。