Android Проблема кодирования AMR-WB - PullRequest
0 голосов
/ 26 апреля 2020

Я пытаюсь использовать функцию кодирования AMR-WB Android Oreo для кодирования захвата живого микрофона PCM с помощью AudioRecorder. Кодирование работает без каких-либо исключений, но закодированные голосовые данные кажутся не идеальными. Вот как выглядит код:

Настройки My AudioRecord:

        int audioSource = MediaRecorder.AudioSource.MIC;
        int sampleRateInHz = 8000;
        int channelConfig = AudioFormat.CHANNEL_IN_MONO;
        int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
        int bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat);
        AudioRecord ar = new AudioRecord(audioSource, sampleRateInHz, channelConfig, audioFormat, bufferSize);

MediaCode c Настройки:

        MediaCodec mc = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_AUDIO_AMR_WB);
        MediaFormat mf = MediaFormat.createAudioFormat(MediaFormat.MIMETYPE_AUDIO_AMR_WB, 4000, 1);
        mf.setInteger(MediaFormat.KEY_BIT_RATE, 6600);
        mc.configure(mf, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
        mc.start();

Запись l oop:

                    int srcLength = ar.read(buffer, 0, bufferSize); // reads 640 bytes


                    int ibufferId = mc.dequeueInputBuffer(-1);
                    ByteBuffer ibuffer = mc.getInputBuffer(ibufferId);
                    ibuffer.position();
                    ibuffer.put(buffer, 0, srcLength);
                    mc.queueInputBuffer(ibufferId, 0, srcLength, 0, 0);
                    int obufferId = mc.dequeueOutputBuffer(bufferInfo, -1);
                    if (obufferId == INFO_OUTPUT_FORMAT_CHANGED) {
                        obufferId = mc.dequeueOutputBuffer(bufferInfo, -1);
                    }
                    ByteBuffer obuffer = mc.getOutputBuffer(obufferId); // has 18 bytes                        

                    mc.releaseOutputBuffer(obufferId, false);

Если я записываю выходные байты (obuffer) в файл и пытаюсь воспроизвести его с помощью проигрывателя VL C, он воспроизводит звук быстрее, чем обычно.

Есть ли возможное решение этой проблемы?

1 Ответ

1 голос
/ 26 апреля 2020

Я нашел ответ сам. Частота дискретизации исходного ИКМ должна быть 16000 для разборчивого аудио AMR. Я не знаю, почему это так.

...