2015-11-20 15 views
5

Il mio obiettivo è riprodurre file locale mentre si registra l'input del microfono del dispositivo a bassa latenza. Sono arrivato alla libreria Superpowered, perché dalla documentazione fornisce funzionalità a bassa latenza. Ho creato il giocatore usando SuperpoweredAdvancedAudioPlayer e SuperpoweredAndroidAudioIO e funziona bene.SDK Android potenziato Registrazione e riproduzione simultaneamente

SuperpoweredAndroidAudioIO ha il construcor con i parametri enableInput booleano, booleano enableOutput. Attualmente sto usando enableInput == false e enableOutput == true. Quando ho messo questi parametri su true - nessun effetto.

Mi chiedo se è possibile registrare file e riprodurre altri file contemporaneamente?

Inoltre, esiste una classe SuperpoweredRecorder nella libreria, ma non dice per la scrittura diretta su disco. E hanno bisogno di usare i metodi createWAV, fwrite, closeWAV. Ho provato a implementare il registratore separatamente ma la qualità non è buona (è due-tre volte più veloce della registrazione reale + il suono è distorto). Ecco il pezzo più semplice di codice per la registrazione che ho usato:

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

Probabilmente non posso usare superpoteri a tale scopo e la necessità di fare solo la registrazione con OpenSL ES direttamente.

Grazie in anticipo!

risposta

5

Dopo gli esperimenti ho trovato la soluzione.

  1. SuperpoweredRecorder funziona correttamente per la registrazione di tracce;
  2. Ho creato per separare le fonti SuperpoweredAndroidAudioIO: una per la riproduzione e un'altra per il registratore. Dopo alcune manipolazioni di sincronizzazione funziona bene (ho ridotto al minimo la latenza a un livello molto basso, quindi si adatta alle mie esigenze).

vi posto qualche frammento di codice con l'idea ho implementato:

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

Speranza che aiuta qualcuno!

+0

SuperpoweredAndroidAudioIO si prende cura di questo. Avere più istanze è una quantità inutile di codice. –

+0

Puoi spiegare come scrivi l'output dell'audio dopo aver applicato gli effetti in un file? –

+1

@kasurd puoi condividere il link GitHub dello stesso con una corretta implementazione. Questo sarà molto utile .. –

0

Per me questo funziona quando raddoppio delle NumberOfSamples

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

Questo porterà a una chiara uscita stereo

+0

Puoi spiegare come scrivi l'output dell'audio dopo aver applicato gli effetti in un file? –

+0

Hai bisogno di aiuto con queste domande, http://stackoverflow.com/questions/42316295/how-to-write-file-to-external-storage-using-superpowered-sdk-in-android –

4

È possibile eseguire questa operazione con un'istanza di SuperpoweredAndroidAudioIO con enableInput e enableOutput impostato su true.

Il callback di elaborazione audio (audioProcessing() nel tuo caso) riceve audio (microfono) nel parametro audioInputOutput. Passalo al tuo SuperpoweredRecorder e lo scriverà sul disco.

Successivamente, eseguire l'elaborazione SuperpoweredAdvancedAudioPlayer e convertire il risultato in audioInputOutput. Andrà all'uscita audio.

quindi è come, in pseudo-codice:

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

non effettuare le operazioni fwrite nella richiamata elaborazione audio, come deve completare entro un tempo molto breve, e le operazioni del disco può essere troppo lento.

+0

Grazie, Gabor per il commento. Avevo iniziato con questo approccio, ma poi è risultato che avevo bisogno di due-tre riproduzioni e un registratore simultaneamente. Ho deciso di passare a SuperpoweredAndroidAudioIO separato. Il tuo approccio funzionerà anche per il mio caso? – kasurd

+0

Sì, certo. Più giocatori possono elaborare nello stesso buffer. Il metodo process() ha il parametro bufferAdd, lo imposta su true e usa lo stesso buffer per tutti. –

+0

Puoi spiegare come scrivi l'output dell'audio dopo aver applicato gli effetti in un file? –

Problemi correlati