我正在使用Android MediaCodec API来解码h264帧。我可以解码和渲染视图上的帧。我的问题是解码器错过了很多帧,尤其是第一些帧。 DecodeMediaCodec.dequeueOutputBuffer()返回-1。 a约150 h264帧,仅解码43帧。我找不到问题所在。这是我的代码。Android MediaCodec解码h264原始帧
/**
* init decoder
*/
private void initDecodeMediaCodec()
{
mDecodeMediaCodec = MediaCodec.createDecoderByType(MIME_TYPE);
MediaFormat format = MediaFormat.createVideoFormat(MIME_TYPE,
VIDEO_WIDTH_640,
VIDEO_HEIGHT_480);
mDecodeMediaCodec.configure(format,
new Surface(mRemoteVideoView.getSurfaceTexture()),
null,
0);
mDecodeMediaCodec.start();
mDecodeInputBuffers = mDecodeMediaCodec.getInputBuffers();
System.out.println("decode-----"
+ mDecodeMediaCodec.getCodecInfo().getName());
}
解码器初始化后,我将启动解码器线程。
/**
*
* @param frameData
*/
private void decode()
{
new Thread(new Runnable()
{
@Override
public void run()
{
while (true)
{
ByteBuffer decodeDataBuffer = null;
try
{
//take h264 frame from cache queue
decodeDataBuffer = decodeDataQuene.take();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
BufferInfo info = new BufferInfo();
int inputBufferIndex = mDecodeMediaCodec.dequeueInputBuffer(-1);
System.out.println("inputBufferIndex: " + inputBufferIndex);
if (inputBufferIndex >= 0)
{
ByteBuffer buffer = mDecodeInputBuffers[inputBufferIndex];
buffer.clear();
buffer.put(decodeDataBuffer.array());
mDecodeMediaCodec.queueInputBuffer(inputBufferIndex,
0,
decodeDataBuffer.array().length,
0,
0);
decodeDataBuffer.clear();
decodeDataBuffer = null;
}
int outputBufferIndex = mDecodeMediaCodec.dequeueOutputBuffer(info,
1000);
System.out.println("outputBufferIndex: "
+ outputBufferIndex);
do
{
if (outputBufferIndex == MediaCodec.INFO_TRY_AGAIN_LATER)
{
//no output available yet
}
else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED)
{
//encodeOutputBuffers = mDecodeMediaCodec.getOutputBuffers();
}
else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED)
{
MediaFormat formats = mDecodeMediaCodec.getOutputFormat();
//mediaformat changed
}
else if (outputBufferIndex < 0)
{
//unexpected result from encoder.dequeueOutputBuffer
}
else
{
mDecodeMediaCodec.releaseOutputBuffer(outputBufferIndex,
true);
outputBufferIndex = mDecodeMediaCodec.dequeueOutputBuffer(info,
0);
System.out.println("inner outputBufferIndex: "
+ outputBufferIndex);
}
} while (outputBufferIndex > 0);
}
}
}).start();
}
任何人都知道这是为什么呢?我希望你help.My Android设备的Nexus 7
我查看了您提供的资源,我对此有一些疑问。 ** 1)是否有任何方法可以让解码器快速解码帧?** ** 2)我应该将第一个编码帧的cds-0添加到解码器格式吗?** ** 3)PresentationTime是必须的吗?** –
(1)您可以通过提前配置和启动解码器来节省一些时间。我没有尝试过。你看到多少延迟? (2)您可以将CSD添加到“MediaFormat”中,或者将其作为第一帧与“CODEC_CONFIG”标志设置一起提交。不要这样做。 (3)我认为编解码器在解码时没有注意PTS。 (虽然编码时它*是重要的)。如果你从源头获得时间戳,尽管保留它们是一个不错的主意 - 例如以防你的视频源不能以恒定速率提供帧。 – fadden
我的Nexus 7上的延迟大约是19帧,而我的三星S3上有6帧。达赖相对稳定。它似乎与硬件有关系,但我不确定。 –