最近在做视频解码的项目,用到了android MediaCodec有解码功能,出现了下面的问题,求大牛指点一二。
以下内容为解码时出现的错误。
11-08 18:28:01.886: E/开始解码(20450): 开始解码
11-08 18:28:17.498: E/all length(20450): 2418
11-08 18:28:17.498: E/screencmd3(20450): 2398
11-08 18:28:17.498: E/tag(20450): 2398videobyte.length
11-08 18:28:17.499: E/Decode(20450): inputBufferIndex===0
11-08 18:28:17.500: E/Decode(20450): inputBufferIndex===9
11-08 18:28:17.501: E/Decode(20450): inputBufferIndex===8
11-08 18:28:17.502: E/Decode(20450): inputBufferIndex===7
11-08 18:28:17.502: E/Decode(20450): inputBufferIndex===6
11-08 18:28:17.506: E/ACodec(20450): [OMX.MTK.VIDEO.DECODER.AVC] ERROR(0x80001005)
11-08 18:28:17.506: E/MediaCodec(20450): Codec reported an error. (omx error 0x80001005, internalError -1103)
11-08 18:28:17.509: E/AndroidRuntime(20450): FATAL EXCEPTION: Thread-1056
11-08 18:28:17.509: E/AndroidRuntime(20450): java.lang.IllegalStateException
11-08 18:28:17.509: E/AndroidRuntime(20450): at android.media.MediaCodec.getBuffers(Native Method)
11-08 18:28:17.509: E/AndroidRuntime(20450): at android.media.MediaCodec.getInputBuffers(MediaCodec.java:472)
11-08 18:28:17.509: E/AndroidRuntime(20450): at com.aaa.bbb.VideoActivity.onFrame(VideoActivity.java:286)
11-08 18:28:17.509: E/AndroidRuntime(20450): at com.aaa.bbb.VideoActivity$PlayerThread.run(VideoActivity.java:240)
没有人知道吗?请大牛帮忙看看。
解码
public void offerDecoder(byte[] buf, int offset, int length, int flag) {
ByteBuffer[] inputBuffers = mediaCodec.getInputBuffers();
int inputBufferIndex = mediaCodec.dequeueInputBuffer(-1);
if (inputBufferIndex >= 0) {
ByteBuffer inputBuffer = inputBuffers[inputBufferIndex];
inputBuffer.clear();
inputBuffer.put(buf, offset, length);
mediaCodec.queueInputBuffer(inputBufferIndex, 0, length, mCount * 1000000 / FRAME_RATE, 0);
mCount++;
}
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
int outputBufferIndex = mediaCodec.dequeueOutputBuffer(bufferInfo,0);
while (outputBufferIndex >= 0) {
mediaCodec.releaseOutputBuffer(outputBufferIndex, true);
outputBufferIndex = mediaCodec.dequeueOutputBuffer(bufferInfo, 0);
}
}
下面是我的解码代码:
/**
* 解码 处理数据
*
* @param buf
* h264字节视频数据
*/
public void onFrame(byte[] buf) {
ByteBuffer[] inputBuffers = decoder.getInputBuffers();
int inputBufferIndex = decoder.dequeueInputBuffer(-1);
Log.e(TAG, "inputBufferIndex===" + inputBufferIndex);
if (inputBufferIndex >= 0) {
ByteBuffer inputBuffer = inputBuffers[inputBufferIndex];
inputBuffer.clear();
inputBuffer.put(buf, 0, buf.length);
decoder.queueInputBuffer(inputBufferIndex, 0, buf.length,
presentationTimeStamp, 0);
presentationTimeStamp++;
}
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
int outputBufferIndex = decoder.dequeueOutputBuffer(bufferInfo, 0);// 延迟输出缓冲区 // 微秒时间
while (outputBufferIndex >= 0) {
decoder.releaseOutputBuffer(outputBufferIndex, true);
outputBufferIndex = decoder.dequeueOutputBuffer(bufferInfo, 0);
}
}
下面是初始化方法,放在线程里执行了
private class PlayerThread extends Thread {
private Surface surface;
public PlayerThread(Surface surface) {
// TODO Auto-generated constructor stub
this.surface = surface;
}
@Override
public void run() {
// 循环
while (!Thread.interrupted()) {
// 判断是否为空
if(decoder == null){
decoder = MediaCodec.createDecoderByType(type);
MediaFormat mediaformat = MediaFormat.createVideoFormat(type, width,
height);
decoder.configure(mediaformat, surface, null, 0);
if (decoder == null) {
Log.e("DecodeActivity", "Can't find video info!");
return;
}
Log.e("开始解码 ", "开始解码");
decoder.start();// 开始解码
}
if (videobyte != null) {
onFrame(videobyte);
}
}
// decoder.stop();
// decoder.release();
}
}