Я запускаю тестовое приложение, чтобы проверить, работает ли кодер / декодер успешно, и я получаю исключение IllegalState от декодера. Кажется, кодировщик работает нормально (выдает данные). я уже видел это ( PCM -> AA C (кодировщик) -> PCM (декодер) в режиме реального времени с правильной оптимизацией ). Приложение аварийно завершает работу, когда достигает команды outputBufferId1 = decoder.dequeueOutputBuffer (bufferInfo2,0); пожалуйста, игнорируйте переменную состояния.
AudioRecord recorder;
recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, 44100, 1, AudioFormat.ENCODING_PCM_16BIT, minBufSize );
recorder.startRecording();
MediaCodec encoder = MediaCodec.createEncoderByType("audio/mp4a-latm");
MediaFormat format = new MediaFormat();
format.setString(MediaFormat.KEY_MIME, "audio/mp4a-latm");
format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 1);
format.setInteger(MediaFormat.KEY_SAMPLE_RATE, 44100);
format.setInteger(MediaFormat.KEY_BIT_RATE, 64 * 1024);//AAC-HE 64kbps
format.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectHE);
format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, buffer1.length);
encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
MediaCodec decoder = MediaCodec.createDecoderByType("audio/mp4a-latm");
MediaFormat format2 = new MediaFormat();
format2.setString(MediaFormat.KEY_MIME, "audio/mp4a-latm");
format2.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 1);
format2.setInteger(MediaFormat.KEY_SAMPLE_RATE, 44100);
format2.setInteger(MediaFormat.KEY_BIT_RATE, 64 * 1024);//AAC-HE 64kbps
format2.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectHE);
decoder.configure(format2, null, null, 0);
encoder.start();
decoder.start();
while (MainActivity.isRunning) {
recorder.read(buffer1, 0, buffer1.length);
status = String.valueOf(buffer1.length);
inputBufferId = encoder.dequeueInputBuffer(-1);
if (inputBufferId >= 0) {
inputBuffer = encoder.getInputBuffer(inputBufferId);
inputBuffer.clear();
inputBuffer.put(buffer1);
encoder.queueInputBuffer(inputBufferId,0, buffer1.length, 0, 0);
}
bufferInfo = new MediaCodec.BufferInfo();
outputBufferId = encoder.dequeueOutputBuffer(bufferInfo,0);
if (outputBufferId >= 0) {
outputBuffer = encoder.getOutputBuffer(outputBufferId);
MediaFormat bufferFormat = encoder.getOutputFormat(outputBufferId); // option A
buffer2 = new byte[bufferInfo.size];
outputBuffer.get(buffer2);
status = status + "//" + buffer2.length;
encoder.releaseOutputBuffer(outputBufferId, false);
if(buffer2.length < 200) { continue; }
encout = Arrays.copyOf(buffer2, buffer2.length);
status = encout.toString();
} else if (outputBufferId == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
continue;
}
inputBufferId1 = decoder.dequeueInputBuffer(-1);
if (inputBufferId1 >= 0) {
inputBuffer2 = decoder.getInputBuffer(inputBufferId1);
inputBuffer2.clear();
inputBuffer2.put(encout);
decoder.queueInputBuffer(inputBufferId1,0, encout.length, 0, 0);
}
bufferInfo2 = new MediaCodec.BufferInfo();
outputBufferId1 = decoder.dequeueOutputBuffer(bufferInfo2,0);
if (outputBufferId1 >= 0) {
outputBuffer2 = decoder.getOutputBuffer(outputBufferId1);
MediaFormat bufferFormat = decoder.getOutputFormat(outputBufferId1); // option A
buffer3 = new byte[bufferInfo2.size];
outputBuffer.get(buffer3);
decoder.releaseOutputBuffer(outputBufferId1, false);
if(buffer3.length < 200) { continue; }
encout = Arrays.copyOf(buffer3, buffer3.length);
} else if (outputBufferId1 == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
continue;
}