MediaCodec returns -1,-2,-3 第一秒
MediaCodec returns -1,-2,-3 in first seconds
我使用 MediaCodec 解码视频数据,但是当我使用 dequeueOutputBuffer 方法时,在第一个 seconds.I 中得到结果 MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED、MediaCodec.INFO_OUTPUT_FORMAT_CHANGED 和 MediaCodec.INFO_TRY_AGAIN_LATER 想要得到使用此方法后,它的正常结果。
String mime = format.getString(MediaFormat.KEY_MIME);
mMediaCodec = MediaCodec.createDecoderByType(mime);
mMediaCodec.configure(format, mSurface , null , 0 );
mMediaCodec.start();
try{
ByteBuffer[] inputBuffers = mMediaCodec.getInputBuffers();
ByteBuffer[] outputBuffers = mMediaCodec.getOutputBuffers();
int inputBufferIndex = mMediaCodec.dequeueInputBuffer(TLMediaCodec.TIMEOUT_USEC);
if (inputBufferIndex >= 0) {
ByteBuffer inputBuffer = inputBuffers[inputBufferIndex];
inputBuffer.clear();
inputBuffer.put(data);
mMediaCodec.queueInputBuffer(inputBufferIndex, 0, data.length, ultimestamp, 0);
int outputBufferIndex = mMediaCodec.dequeueOutputBuffer(mBufferInfo, 100);
if (outputBufferIndex >= 0)
{
try
{
mVideoDecodeDelay = System.currentTimeMillis() - mVideoDecodeDelay;
boolean render = mBufferInfo.size > 0;
mMediaCodec.releaseOutputBuffer(outputBufferIndex, render);
}
catch (Exception e)
{
TLLogger.trace(TAG, "decodeOutput failed -- > " + e.toString());
e.printStackTrace();
}
}
else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED)
{
outputBuffers = mMediaCodec.getOutputBuffers();
}
else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED)
{
MediaFormat format = mMediaCodec.getOutputFormat();
}
}
} catch{
e.printStackTrace();
}
以上是我的代码,我找不到任何解决方法来改善这个问题。
谢谢帮忙!!!
这很正常。您不会将一帧发送到 MediaCodec 并得到一帧;您传入一系列框架,并在它们可用时将它们拉出。 start()
和第一帧可用性之间的一些延迟是预期的 (e.g. this)。如果您更愿意收到通知而不是轮询,请尝试较新的异步 API 方法。
查看 bigflake page 顶部附近的 "basic usage" 注释。
我使用 MediaCodec 解码视频数据,但是当我使用 dequeueOutputBuffer 方法时,在第一个 seconds.I 中得到结果 MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED、MediaCodec.INFO_OUTPUT_FORMAT_CHANGED 和 MediaCodec.INFO_TRY_AGAIN_LATER 想要得到使用此方法后,它的正常结果。
String mime = format.getString(MediaFormat.KEY_MIME);
mMediaCodec = MediaCodec.createDecoderByType(mime);
mMediaCodec.configure(format, mSurface , null , 0 );
mMediaCodec.start();
try{
ByteBuffer[] inputBuffers = mMediaCodec.getInputBuffers();
ByteBuffer[] outputBuffers = mMediaCodec.getOutputBuffers();
int inputBufferIndex = mMediaCodec.dequeueInputBuffer(TLMediaCodec.TIMEOUT_USEC);
if (inputBufferIndex >= 0) {
ByteBuffer inputBuffer = inputBuffers[inputBufferIndex];
inputBuffer.clear();
inputBuffer.put(data);
mMediaCodec.queueInputBuffer(inputBufferIndex, 0, data.length, ultimestamp, 0);
int outputBufferIndex = mMediaCodec.dequeueOutputBuffer(mBufferInfo, 100);
if (outputBufferIndex >= 0)
{
try
{
mVideoDecodeDelay = System.currentTimeMillis() - mVideoDecodeDelay;
boolean render = mBufferInfo.size > 0;
mMediaCodec.releaseOutputBuffer(outputBufferIndex, render);
}
catch (Exception e)
{
TLLogger.trace(TAG, "decodeOutput failed -- > " + e.toString());
e.printStackTrace();
}
}
else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED)
{
outputBuffers = mMediaCodec.getOutputBuffers();
}
else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED)
{
MediaFormat format = mMediaCodec.getOutputFormat();
}
}
} catch{
e.printStackTrace();
}
以上是我的代码,我找不到任何解决方法来改善这个问题。 谢谢帮忙!!!
这很正常。您不会将一帧发送到 MediaCodec 并得到一帧;您传入一系列框架,并在它们可用时将它们拉出。 start()
和第一帧可用性之间的一些延迟是预期的 (e.g. this)。如果您更愿意收到通知而不是轮询,请尝试较新的异步 API 方法。
查看 bigflake page 顶部附近的 "basic usage" 注释。