Каков самый быстрый способ декодировать файл MP3, а затем закодировать его в AAC на Android?

У меня есть рабочее решение с использованием MediaCodec и MediaExtractor, но декодирование 6-мегабайтного MP3 занимает 15 секунд + кодирование 15 секунд в AAC. Всего > 30 сек. Мне нужно что-то очень быстрое ‹10 сек. Кто-нибудь знает более быстрое решение?

ИЗМЕНИТЬ

Мое узкое место связано с самим медиакодеком. Предоставляемый ими байтовый буфер слишком мал. При настройке MediaFormat на AAC буферы InputBytebuffers составляют всего 4096 байт за раз, что для меня слишком медленно. Это хорошо для потоковой передачи, но не для файла в файл.

Я переключаюсь на декодер C lib, который декодирует за 3 секунды вместо 15 секунд. Но энкодер все равно занимает 15 сек. У кого-нибудь есть кодировщик C lib AAC, который также может добавлять заголовки ADTS?


person Rami Kuret    schedule 10.02.2016    source источник


Ответы (1)


Похоже, вы сначала декодируете полный файл, а затем кодируете его. Это может закончиться быстрее, если вы сделаете это одновременно, т. е. когда у вас будет достаточно выходных данных из декодера, чтобы предоставить полный входной кадр кодировщику, передать его. Это может помочь с некоторым параллелизмом, но я сомневаюсь, что это помогает достаточно, чтобы получить ускорение, которое вы хотите.

person mstorsjo    schedule 10.02.2016
comment
Я сделал это, но мое узкое место связано с самим медиакодеком. Предоставляемый ими байтовый буфер слишком мал. Только 4096 байт за раз слишком медленно для меня. Я переключаюсь на декодер C, который декодирует за 3 секунды вместо 15 секунд. Но энкодер все равно занимает 15 сек. У кого-нибудь есть кодировщик C lib aac? - person Rami Kuret; 11.02.2016
comment
Это похоже на то, что вы синхронно используете API MediaCodec — после передачи одного 4096-байтового буфера в качестве входных данных вы ожидаете один выходной буфер перед передачей следующего входного буфера? Вам нужно предоставить как можно больше входных буферов и использовать только выходные буферы по мере их появления, чтобы получить надлежащую производительность от MediaCodec — см. stackoverflow. com/a/34940871/3115956 для более подробного объяснения того же самого. - person mstorsjo; 11.02.2016
comment
Это моя логика для кодировщика pastebin.com/uvCwKjGi. Когда я настроил кодировщик с MediaFormat в ACC. И я делаю это `inputBuffers = encoder.getInputBuffers();` (Потому что мне нужен API 16) У меня есть только 4 входных буфера емкостью 4096 байт. - person Rami Kuret; 12.02.2016