【发布时间】:2014-04-15 10:27:03
【问题描述】:
我想在 Android 中解码和显示原始 h264 视频字节流,因此我目前正在使用 MediaCodec/Format 类。我通过 Udp 从服务器获取帧数据。
但是,不幸的是,目前没有显示任何内容。
这是我目前所拥有的。
初始化 MediaCodec 类:
codec = MediaCodec.createDecoderByType("video/avc");
MediaFormat format = new MediaFormat();
format.setString(MediaFormat.KEY_MIME, "video/avc");
format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 100000);
format.setInteger(MediaFormat.KEY_WIDTH, 800);
format.setInteger(MediaFormat.KEY_HEIGHT, 600);
format.setInteger("max-width", 800);
format.setInteger("max-height", 600);
format.setInteger("push-blank-buffers-on-shutdown", 1);
codec.configure(format, surface, null, 0);
解码器的使用:
int inIndex = codec.dequeueInputBuffer(10000);
if(inIndex >= 0)
{
ByteBuffer inputBuffer = codecInputBuffers[inIndex];
inputBuffer.clear();
inputBuffer.put(frameData);
codec.queueInputBuffer(inIndex, 0, frameSize, 33, 0);
}
int outIndex = codec.dequeueOutputBuffer(null, 10000);
switch(outIndex)
{
case MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED:
codecOutputBuffers = codec.getOutputBuffers();
System.out.println("OB Changed");
break;
case MediaCodec.INFO_OUTPUT_FORMAT_CHANGED:
System.out.println("OF Changed");
break;
case MediaCodec.INFO_TRY_AGAIN_LATER:
System.out.println("l8r");
break;
default:
ByteBuffer buffer = codecOutputBuffers[outIndex];
codec.releaseOutputBuffer(outIndex, true);
}
我正在测试此代码的设备是 Google Nexus 5。当我运行它时,outIndex 始终等于 MediaCodec.INFO_TRY_AGAIN_LATER。
我之前写过一个笔记本的客户端,效果很好,所以我猜来自服务器的h264流应该没问题。
感谢您的帮助
编辑: 如果有人遇到同样的问题,fadden 的提议修正案(1)解决了这个问题。我更正了上面的代码。它现在工作。我展示的示例的另一个错误是,您不能将 null 传递给 .dequeueOutputBuffers(...);。你必须做类似的事情
BufferInfo buffInfo = new MediaCodec.BufferInfo();
int outIndex = codec.dequeueOutputBuffer(buffInfo, 10000);
即使您对此不感兴趣。 ;)
【问题讨论】:
-
你能把更正后的代码分享给我们吗?
标签: java android video decode android-mediacodec