我的代码运行之后 mediaCodec.queueInputBuffer(inIndex, 0, sampleSize, extractor.getSampleTime(), 0);这一行报错:
2023-12-07 17:59:36.928 4101-4126/com.eyetracking.mediademo E/AndroidRuntime: FATAL EXCEPTION: Thread-2
Process: com.eyetracking.mediademo, PID: 4101
android.media.MediaCodec$CodecException: Error 0xfffffff3
at android.media.MediaCodec.native_queueInputBuffer(Native Method)
at android.media.MediaCodec.queueInputBuffer(MediaCodec.java:2769)
public void run() {
try {
//根据视频源获取MediaFormat
extractor = new MediaExtractor();
extractor.setDataSource("sdcard/test.mp4");
int numTracks = extractor.getTrackCount();
//只有一个曲目时直接获取它的MediaFormat和mime
if (numTracks > 0) {
format = extractor.getTrackFormat(0);
mime = format.getString(MediaFormat.KEY_MIME);
extractor.selectTrack(0);
}
mediaCodec = MediaCodec.createDecoderByType(mime);
mediaCodec.configure(format, surface, null, 0);
mediaCodec.start();
MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
//获取输入缓冲器授权
int inIndex = mediaCodec.dequeueInputBuffer(10000);
//获取输出缓冲区授权
int outIndex = mediaCodec.dequeueOutputBuffer(info, 100000);
long startMs = System.currentTimeMillis();
ByteBuffer inputBuffer;
while (true) {
if (inIndex >= 0) {
//获取实际的buffer数据
inputBuffer = mediaCodec.getInputBuffer(inIndex);
//加入解码队列
mediaCodec.queueInputBuffer(inIndex, 0, 0, 0, 1);
int sampleSize = extractor.readSampleData(inputBuffer, 0);
if (sampleSize < 0) {
mediaCodec.queueInputBuffer(inIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);
} else {
mediaCodec.queueInputBuffer(inIndex, 0, sampleSize, extractor.getSampleTime(), 0);
extractor.advance(); //下一帧数据
}
}
// ByteBuffer outBuffer =mediaCodec.getOutputBuffer(outIndex);
mediaCodec.releaseOutputBuffer(outIndex, true);
}
} catch (IOException e) {
e.printStackTrace();
mediaCodec.stop();
mediaCodec.release();// 释放组件
extractor.release();
}
}