Метод dequeOutputBuffers декодера генерирует исключение IllegalStateException - PullRequest
0 голосов
/ 31 января 2020

Я запускаю тестовое приложение, чтобы проверить, работает ли кодер / декодер успешно, и я получаю исключение 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;
            }
...