【发布时间】: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