2015-11-20 5 views
5

Моя цель - играть в локальный файл во время записи микрофона устройства записи с низкой задержкой. Я пришел в супермощную библиотеку, потому что из документации она обеспечивает функцию с малой задержкой. Я создал плеер, используя SuperpoweredAdvancedAudioPlayer и SuperpoweredAndroidAudioIO, и он отлично работает.Android Superpowered SDK Запись и воспроизведение одновременно

SuperpoweredAndroidAudioIO имеет конструкцию с параметрами boolean enableInput, boolean enableOutput. В настоящее время я использую enableInput == false и enableOutput == true. Когда я верю эти параметры в true - никакого эффекта.

Интересно, можно ли одновременно записывать файл и воспроизводить другой файл?

Также есть класс SuperpoweredRecorder в библиотеке, но он говорит не о прямой записи на диск. И нужно использовать методы createWAV, fwrite, closeWAV. Я пробовал реализовать рекордер отдельно, но качество не очень хорошее (это в два-три раза быстрее, чем реальная запись + звук разгоняется). Вот самый простой фрагмент кода для записи я использовал:

void SuperpoweredFileRecorder::start(const char *destinationPath) { 
    file = createWAV(destinationPath, sampleRate, 2); 
    audioIO = new SuperpoweredAndroidAudioIO(sampleRate, bufferSize, true, false, audioProcessing, NULL, bufferSize); // Start audio input/output. 
} 

void SuperpoweredFileRecorder::stop() { 
    closeWAV(file); 
    audioIO->stop(); 
} 

static bool audioProcessing(void *clientdata, short int *audioInputOutput, int numberOfSamples, int samplerate) { 
    fwrite(audioInputOutput, sizeof(short int), numberOfSamples, file); 
    return false; 
} 

Вероятно, я не могу использовать сверхмощные для этой цели, и нужно просто сделать запись с OpenSL ES непосредственно.

Заранее благодарен!

ответ

5

После экспериментов я нашел решение.

  1. SuperpoweredRecorder отлично подходит для записи дорожек;
  2. Я создал для разделения источников SuperpoweredAndroidAudioIO - один для воспроизведения, а другой для рекордера. После некоторых манипуляций с синхронизацией он работает хорошо (я минимизировал задержку до очень низкого уровня, так что это соответствует моим потребностям).

я отправляю некоторый фрагмент кода с идеей я реализовал:

https://bitbucket.org/snippets/kasurd/Mynnp/nativesuperpoweredrecorder-with

Надеется, что это помогает кто-то!

+0

SuperpoweredAndroidAudioIO позаботится об этом. Наличие нескольких экземпляров - ненужный объем кода. –

+0

Не могли бы вы объяснить, как вы пишете вывод звука после применения эффектов в файле? –

+1

@kasurd вы можете поделиться ссылкой GitHub того же с правильной реализацией. Это будет очень полезно .. –

0

Для меня это работает, когда я два раза numberOfSamples

fwrite(audioInputOutput, sizeof(short int), numberOfSamples * 2, file); 

Это приведет к явному стерео выход

+0

Не могли бы вы объяснить, как вы записываете выход звука после применения эффектов в файле? –

+0

Нужна помощь по этим вопросам, http://stackoverflow.com/questions/42316295/how-to-write-file-to-external-storage-using-superpowered-sdk-in-android –

4

Вы можете сделать это с помощью одного экземпляра SuperpoweredAndroidAudioIO с enableInput и enableOutput, установленным в true.

Обратный вызов обработки звука (audioProcessing() в вашем случае) получает аудио (микрофон) в параметре audioInputOutput. Просто передайте это вашему SuperpoweredRecorder, и он напишет его на диск.

После этого выполните обработку SuperpoweredAdvancedAudioPlayer и преобразуйте результат в audioInputOutput. Это пойдет на аудиовыход.

Так как, в псевдокоде:

audioProcessing(audioInputOutput) { 
    recorder->process(audioInputOutput) 
    player->process(some_buffer) 
    float_to_short_int(some_buffer, audioInputOutput) 
} 

Никогда не делать каких-либо FWRITE в звуковом обработки обратного вызова, поскольку она должна завершить в течение очень короткого времени, и операции с диском может быть слишком медленным.

+0

Спасибо, Габор за комментарий. Я начал с этого подхода, но потом оказалось, что мне нужно два-три воспроизведения и один рекордер одновременно. Я решил переключиться на отдельный SuperpoweredAndroidAudioIO. Будет ли ваш подход работать и для моего дела? – kasurd

+0

Да, конечно. Несколько игроков могут обрабатывать один и тот же буфер. Метод process() имеет параметр bufferAdd, просто устанавливает его в true и использует тот же буфер для всех. –

+0

Не могли бы вы объяснить, как вы пишете вывод звука после применения эффектов в файле? –