Ответ 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 может иметь значение здесь.