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

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Mike1991
3 / 3 / 0
Регистрация: 26.08.2013
Сообщений: 13
#1

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

22.03.2016, 20:10. Просмотров 233. Ответов 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 - декодирование сжатого звука (Программирование Android):

Декодирование входящего звука! - C++ Builder
Требуется преобразовать входящий сигнал состоящий из одной тональности в последовательность бинарного кода (приходит точка или тире азбуки...

Температура сжатого воздуха - Физика
В цилиндре дизеля температура нагнитающего воздуха в конце такта впуска = 40о C, а давление до сжатия p0=80 кПа. Определить температуру...

Распаковка сжатого контента HTTP ответа. - Visual C++
Столкнулся с тем, что некоторые сервера попросту игнорируют в некоторых случаях значение "Accept-encoding" в заголовке запроса и всегда...

Определить при какой температуре начинается выпадение влаги из сжатого воздуха. - Термодинамика и МКТ
Воздух с параметрами температуры 20 градусов Цельсия, t1=745,0 мм/рт/ст, d=6 гр/кг. Сжимается в компрессоре до давления Р2=0,405 мПа и...

После переустановки система установил драйверу звука, но опять звука нет... - Windows XP
пОСле переустановки система установил драйверу звука, но опять звука нет...

В каких переносных носителях звука,в частности телефонах,стоит усиление звука? - Звук, акустика
Ребят,заинтересовал вопрос. В каких переносных носителях стоит усиление звука.Больше всего интересуют телефоны,но и от общей...

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

В общем, перешёл на JLayer. Он и проще, и независим от устройств и версии API (в то время, как MediaCodec требует минимум API 16).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2016, 01:03
Привет! Вот еще темы с ответами:

Магнитола Daewoo AKF8035RDS - нет звука на FM, блокируются кнопки добавления и уменьшения звука - Автоэлектроника
Здравствуйте. Попалась мне магнитола Daewoo AKF8035RDS. Нет звука на FM диапазоне, при этом блокируются кнопки добавления и уменьшения...

Плохое качество звука на сервере (хрип, проваливание звука) - Windows Server
Добрый день. При работе с сервером столкнулся с плохим качеством звука на сервере (хрип, проваливание звука). Ставил драйвера и сторонние...

Как правильно в английском произносить переходы со звука [Ө] на звук [s] и со звука [ð] на звук [z]? - Иностранные языки
Как правильно в английском произносить переходы со звука на звук и со звука на звук ? Например: Строчка из песни "No, no, no"...

Декодирование - C++
Декодирование закодированного текста. У меня программа декодирует посимвольно, т.е. например текст закодирован вот так: 24, он берет...


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

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