2015-11-20 31 views
5

Moim celem jest odtwarzanie lokalnego pliku podczas nagrywania sygnału wejściowego z mikrofonu przy niskim opóźnieniu. Przyszedłem do biblioteki Superpowered, ponieważ z dokumentacji zapewnia ona funkcję o małym opóźnieniu. Stworzyłem odtwarzacz za pomocą SuperpoweredAdvancedAudioPlayer i SuperpoweredAndroidAudioIO i gra się dobrze.Równoczesne nagrywanie i odtwarzanie Android Superpowered SDK

SuperpoweredAndroidAudioIO ma konstrukcję z parametrami boolean enableInput, boolean enableOutput. Obecnie używam enableInput == false i enableOutput == true. Kiedy ustawiam te parametry na true - bez efektu.

Zastanawiam się, czy możliwe jest jednoczesne nagrywanie pliku i odtwarzanie innego pliku?

Istnieje również klasa SuperpoweredRecorder w bibliotece, ale nie jest ona przeznaczona do bezpośredniego zapisu na dysk. I trzeba użyć metod createWAV, fwrite, closeWAV. Próbowałem oddzielnie implementować rejestrator, ale jakość nie jest dobra (jest dwa-trzy razy szybsza niż w przypadku prawdziwego nagrywania + dźwięk jest zniekształcony). Oto najprostszy kawałek kodu do nagrywania użyłem:

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; 
} 

Prawdopodobnie nie mogę używać Superpowered do tego celu i trzeba po prostu dokonać nagrania z OpenSL ES bezpośrednio.

Z góry dziękuję!

Odpowiedz

5

Po eksperymentach znalazłem rozwiązanie.

  1. SuperpoweredRecorder działa dobrze do nagrywania utworów;
  2. Stworzyłem, aby oddzielić źródła SuperpoweredAndroidAudioIO - jeden do odtwarzania i drugi do nagrywarki. Po pewnej manipulacji synchronizacją działa dobrze (zminimalizowałem opóźnienie do bardzo niskiego poziomu, więc odpowiada moim potrzebom).

zamieścić jakiś fragment kodu z ideą I wdrożone:

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

nadzieję, że pomoże kogoś!

+0

SuperpoweredAndroidAudioIO dba o to. Posiadanie wielu instancji jest niepotrzebną ilością kodu. –

+0

Czy możesz wyjaśnić, jak zapisujesz wyjście audio po zastosowaniu efektów w pliku? –

+1

@kasurd możesz udostępnić łącze GitHub tego samego z odpowiednią implementacją. To będzie bardzo pomocne .. –

0

Dla mnie to działa, kiedy podwoić numberOfSamples

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

Doprowadzi to do jasnej wyjście stereo

+0

Czy możesz wyjaśnić, jak zapisujesz wyjście audio po zastosowaniu efektów w pliku? –

+0

Potrzebujesz pomocy z tymi pytaniami, http://stackoverflow.com/questions/42316295/how-to-write-file-to-external-storage-using-superpowered-sdk-in-android –

4

Możesz to zrobić z jedną instancją SuperpoweredAndroidAudioIO z ustawieniem enableInput i enableOutput na true.

Callback przetwarzania audio (audioProcessing() w twoim przypadku) odbiera audio (mikrofon) w parametrze audioInputOutput. Po prostu przekaż to do swojego SuperpoweredRecorder, a zapisze go na dysku.

Następnie wykonaj przetwarzanie SuperpoweredAdvancedAudioPlayer i przekonwertuj wynik na input audioInputOutput. To przejdzie do wyjścia audio.

Więc jak to jest, w pseudo-kodzie:

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

nie wolno wykonywać żadnej fwrite w audio zwrotnego przetwórczym, jak musi zakończyć się w bardzo krótkim czasie, a operacje dyskowe mogą być zbyt powolne.

+0

Dzięki, Gabor za komentarz. Zacząłem od tego podejścia, ale wtedy okazało się, że potrzebuję dwóch-trzech playbacków i jednego rejestratora jednocześnie. Postanowiłem przejść na oddzielny SuperpoweredAndroidAudioIO. Czy Twoje podejście zadziała również w mojej sprawie? – kasurd

+0

Tak, oczywiście. Wielu graczy może przetworzyć ten sam bufor. Metoda process() ma parametr bufferAdd, po prostu ustawia ją na true i używa tego samego bufora dla wszystkich. –

+0

Czy możesz wyjaśnić, jak zapisujesz wyjście audio po zastosowaniu efektów w pliku? –