getOutputImage(index); 报异常
感谢您的开源。
我现在是从rtsp流中解码了h264的数据出来,所以没有mediaextractor , 模仿您的写法,为什么getOutputImage一直是空的呢?
感谢 ` do { if (frameInfo != null) { byte[] pBuf = frameInfo.buffer; index = mCodec.dequeueInputBuffer(10); if (index >= 0) { ByteBuffer buffer = mCodec.getInputBuffers()[index]; buffer.clear(); if (pBuf.length > buffer.remaining()) { mCodec.queueInputBuffer(index, 0, 0, frameInfo.stamp, 0); } else { buffer.put(pBuf, frameInfo.offset, frameInfo.length); mCodec.queueInputBuffer(index, 0, buffer.position(), frameInfo.stamp + differ, 0); } frameInfo = null; } } index = mCodec.dequeueOutputBuffer(info, 10); // //此处回调数据出去 if (index > 0) { //这里的image一直是空的 Image image = mCodec.getOutputImage(index); if (image != null) { byte[] dataFromImage = getDataFromImage(image, COLOR_FormatNV21); if (i420callback != null) { i420callback.onI420Data(dataFromImage, frameInfo); } }
}
switch (index) {
case MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED:
Log.i(TAG, "INFO_OUTPUT_BUFFERS_CHANGED");
break;
case MediaCodec.INFO_OUTPUT_FORMAT_CHANGED:
MediaFormat mf = mCodec.getOutputFormat();
Log.i(TAG, "INFO_OUTPUT_FORMAT_CHANGED :" + mf);
break;
case MediaCodec.INFO_TRY_AGAIN_LATER:
// 输出为空
break;
default:
// 输出队列不为空
// -1表示为第一帧数据
long newSleepUs = -1;
boolean firstTime = previewStampUs == 0l;
if (!firstTime) {
long sleepUs = (info.presentationTimeUs - previewStampUs);
if (sleepUs > 50000) {
// 时间戳异常,可能服务器丢帧了。
Log.w(TAG, "sleep time.too long:" + sleepUs);
sleepUs = 50000;
}
{
long cache = mNewestStample - previewStampUs;
newSleepUs = fixSleepTime(sleepUs, cache, 0);
}
}
previewStampUs = info.presentationTimeUs;
if (false && Build.VERSION.SDK_INT >= 21) {
Log.d(TAG, String.format("releaseoutputbuffer:%d,stampUs:%d", index, previewStampUs));
mCodec.releaseOutputBuffer(index, previewStampUs);
} else {
if (newSleepUs < 0) {
newSleepUs = 0;
}
// Log.i(TAG,String.format("sleep:%d", newSleepUs/1000)); Thread.sleep(newSleepUs / 1000); mCodec.releaseOutputBuffer(index, true); } if (firstTime) { Log.i(TAG, String.format("POST VIDEO_DISPLAYED!!!")); ResultReceiver rr = mRR; if (rr != null) rr.send(RESULT_VIDEO_DISPLAYED, null); } } } while (frameInfo != null || index < MediaCodec.INFO_TRY_AGAIN_LATER);
`