Форум программистов, компьютерный форум CyberForum.ru

MediaCodec - декодирование сжатого звука - Android

Восстановить пароль Регистрация
 
Mike1991
3 / 3 / 0
Регистрация: 26.08.2013
Сообщений: 13
22.03.2016, 20:10     MediaCodec - декодирование сжатого звука #1
Здравствуйте, уважаемые форумчане.

Пытаюсь при помощи MediaCodec из сжатых звуковых файлов формата MPEG Layer-3 получить исходные звуковые сэмплы.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//Фреймы из mp3-файла достаю при помощи MediaExtractor:
MediaExtractor me = new MediaExtractor();
me.setDataSource(srcFileName); //srcFileName - исходный mp3-файл
me.selectTrack(0);
MediaFormat mf = me.getTrackFormat(0);
 
//Затем, создаю экземпляр MediaCodec, настраиваю его, после чего вызываю метод start():
 
MediaCodec mc = MediaCodec.createDecoderByType(mf.getString(MediaFormat.KEY_MIME));
mc.configure(mf, null, null, 0);
mc.start();
 
//Создаю 2 ссылки на массивы входного и выходного буферов
ByteBuffer[] inputBuffers = mc.getInputBuffers();
ByteBuffer[] outputBuffers = mc.getOutputBuffers();
 
//Далее запрашиваем входной буфер и получаем его индекс
int ib_ind = mc.dequeueInputBuffer(10000);
if(ib_ind>=0){
    ByteBuffer ib = inputBuffers[ib_ind];
    int sampleSize = me.readSampleData(ib, 0);
    mc.queueInputBuffer(ib_ind, 0, sampleSize, me.getSampleTime(), MediaCodec.BUFFER_FLAG_END_OF_STREAM);
}
//Приведённый выше код работает нормально, данные из mp3-фрейма записываются в inputbuffer и он возвращается обратно в очередь
 
//Далее создаём экземпляр BufferInfo и пытаемся получить output-буфер
MediaCodec.BufferInfo b_info = new MediaCodec.BufferInfo();
int ob_ind = mc.dequeueOutputBuffer(b_info, 10000);
Но в ob_ind у нас в итоге всё время выходит значение -2 (INFO_OUTPUT_FORMAT_CHANGED). При помощи метода getOutputFormat получаем выходной формат - audio/raw, вроде бы как раз то, что мне нужно.

Вызываю повторно метод mc.dequeueOutputBuffer(...) с теми же параметрами, получаю индекс буфера - 0. Однако работать с этим буфером невозможно, поскольку limit у него выставлен в 0.

Может, я что-то делаю неправильно? Объясните, если не трудно. Официальную документацию по MediaCodec перечитал раз 10, на разных форумах искал примеры, вроде всё верно делаю, но то ли лыжи не едут, то ли я не совсем адекватный человек. Тестирую код на эмуляторе.

Заранее спасибо за любую помощь.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.03.2016, 20:10     MediaCodec - декодирование сжатого звука
Посмотрите здесь:

Декодирование входящего звука! C++ Builder
Android Воспроизведение звука (ничего не получается)
Android запись и сравнение звука с имеющимся
Android Передача звука
Android Как получить уровень громкости звука?
Android Запись звука на Андроиде
Реализовать воспроизведение звука при каждом показе сообщения Android
Android Запись звука. MediaRecorder. разбираю пример
Генератор звука нужной частоты Android
Android Приложение с кучей картинок и звука - где хранить контент
Запись звука unity Android
Задержка звука при стриме по wifi Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mike1991
3 / 3 / 0
Регистрация: 26.08.2013
Сообщений: 13
27.03.2016, 01:03  [ТС]     MediaCodec - декодирование сжатого звука #2
Забавно, приведённый код вполне корректно работает на смартфоне (Samsung Galaxy S3). Вообще, я читал, что у MediaCodec с поддержкой на разных устройствах не очень.

В общем, перешёл на JLayer. Он и проще, и независим от устройств и версии API (в то время, как MediaCodec требует минимум API 16).
Yandex
Объявления
27.03.2016, 01:03     MediaCodec - декодирование сжатого звука
Ответ Создать тему
Опции темы

Текущее время: 18:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru