Как читать исходные значения аудиоформата 3gp/AMR-NB?

В моем приложении для Android я записываю голос пользователя, который я сохраняю как .3gp закодированный аудиофайл.

Что я хочу сделать, так это открыть его, то есть последовательность x [n], представляющую образец аудио, чтобы выполнить некоторый анализ аудиосигнала.

Кто-нибудь знает, как я могу это сделать?

Ответ 1

Вы можете использовать класс MeidiaCodec для декодирования 3gp или других файлов. Выход декодера является стандартным массивом байтов PCM. Вы можете напрямую отправить этот вывод в класс Android AudioTrack для воспроизведения или продолжения с этим выходным байтовым массивом для дальнейшей обработки, такой как DSP. Чтобы применить алгоритм DSP, массив байтов должен быть преобразован в массив float/double. Для получения байтового массива существует несколько шагов. В итоге это выглядит следующим образом:

  • Мгновенный запуск MediaCodec

    String mMime = "audio/3gpp"
    MediaCodec  mMediaCodec = MediaCodec.createDecoderByType(mMime);
    
  • Создать медиа-формат и настроить медиакодек

    MediaFormat mMediaFormat = new MediaFormat();
    mMediaFormat = MediaFormat.createAudioFormat(mMime,
        mMediaFormat.getInteger(MediaFormat.KEY_SAMPLE_RATE),
        mMediaFormat.getInteger(MediaFormat.KEY_CHANNEL_COUNT));
    
    mMediaCodec.configure(mMediaFormat, null, null, 0);
    mMediaCodec.start();
    
  • Захват вывода из MediaCodec (должен обрабатываться внутри потока)

    MediaCodec.BufferInfo buf_info = new MediaCodec.BufferInfo();
    int outputBufferIndex = mMediaCodec.dequeueOutputBuffer(buf_info, 0);
    byte[] pcm = new byte[buf_info.size];
    mOutputBuffers[outputBufferIndex].get(pcm, 0, buf_info.size);
    

Этот Google IO talk может иметь значение здесь.