Страницы

Поиск по вопросам

вторник, 16 октября 2018 г.

Как объединить два потока аудио в реальном времени?

Получаю с помощью AudioRecord от диктофона поток аудио в виде массива short array[]. Пробовал этот массив записывать в память с разрешением .pcm. Воспроизвести получилось его на компьютере с помощью программы Audacity указав свойства аудио, так как нет заголовков.
Во время его получения в реальном времени нужно его объединять с фоновой музыкой и записать в файл. (Желательно в mp3). Есть идеи как это можно сделать?


Ответ

В данный момент сделал следующим образом:
Получаю массив байтов 10 секундного фона из wav файла Также wav файл можно просмотреть на компьютере в Hex Editor Neo, в которой можно увидеть значения в десятичной системе исчисления , а так же их значения в кодировки ASCII (Так хранится wav данные используя контейнер RIFF, правда например частота дискретизации не совпадает со значениями в аудио-плеерах, если брать примеры аудио) Настраиваю получение аудио с диктофона с такими же настройками, как и сам аудио файл Далее по необходимости можно прочитать информацию о wav файле согласно его структуре После нахожу среди этого массива, именно поток с аудио данными. Для этого нам нужно найти название секции data которая занимает 4 байта, после нее идут 4 байта в десятичной системе исчисления с размером потока аудио в байтах (у меня этот размер так же не совпадает пока), после них идет массив сигнала. Поиск индекса первого значения с аудио данными:
private int readStreamIndex(byte[] backgroundBytes) { int startIndex = 0; for (int i = 0; i < backgroundBytes.length && i < 100; i++) { if (backgroundBytes[i] == 100 && backgroundBytes[i + 1] == 97 && backgroundBytes[i + 2] == 116 && backgroundBytes[i + 3] == 97) { startIndex = i; break; } }
return startIndex + 8;//4 байта - название сегмента + 4 байта размер сегмента } В следующем шаге складываю к байтам фона, байты аудио с микрофона полученные от AudioRecord и записываю в файл (То есть заголовок объединенного wav файла остается от фонового, но можно и свой указать) Проигрываю wav Вместо того что бы записывать в wav, можно с помощью MediaCodec кодировать в aac и сохранять в файл m4a c помощью MediaMuxer

Комментариев нет:

Отправить комментарий