2015-11-20 16 views
5

Mein Ziel ist es, lokale Datei zu spielen, während Mikrofoneingang des Geräts mit niedriger Latenz aufzuzeichnen. Ich bin in die Superpowered-Bibliothek gekommen, weil sie aus der Dokumentation Funktionen mit geringer Latenz bietet. Ich habe den Player mit SuperpoweredAdvancedAudioPlayer und SuperpoweredAndroidAudioIO erstellt und es spielt gut.Android Superpowered SDK Aufnahme und Wiedergabe gleichzeitig

SuperpoweredAndroidAudioIO hat das Konstrukt mit Parametern boolean enableInput, boolean enableOutput. Derzeit verwende ich enableInput == false und enableOutput == true. Wenn ich diese Parameter auf "True" setze - kein Effekt.

Ich frage mich, ob es möglich ist, eine Datei aufzunehmen und andere Dateien gleichzeitig abzuspielen?

Auch gibt es SuperpoweredRecorder-Klasse in der Bibliothek, aber es heißt nicht zum direkten Schreiben auf die Festplatte. Und müssen Sie createWAV, fwrite, closeWAV Methoden verwenden. Ich habe versucht Recorder separat zu implementieren, aber die Qualität ist nicht gut (es ist zwei-drei mal schneller als echte Aufnahme + Sound ist verdreht). Hier ist der einfachste Teil des Codes für die Aufnahme I verwendet:

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

Wahrscheinlich kann ich nicht für diesen Zweck verwendet werden und müssen mit Superkräften direkt nur, um die Aufnahme mit OpenSL ES.

Vielen Dank im Voraus!

Antwort

5

Nach Experimenten fand ich die Lösung führen wird.

  1. SuperpoweredRecorder eignet sich gut zum Aufnehmen von Tracks;
  2. Ich habe erstellt, um SuperpoweredAndroidAudioIO Quellen zu trennen - eine für die Wiedergabe und eine andere für den Recorder. Nach einigen Synchronisationsmanipulationen funktioniert es gut (ich habe die Latenz auf ein sehr niedriges Level reduziert, so dass es meinen Bedürfnissen entspricht).

poste ich einige Code-Schnipsel mit der Idee, die ich umgesetzt:

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

Hoffe, es hilft jemand!

+0

SuperpoweredAndroidAudioIO kümmert sich darum. Mehrere Instanzen zu haben, ist eine unnötige Menge an Code. –

+0

Können Sie bitte erläutern, wie Sie die Ausgabe von Audio nach dem Anwenden von Effekten in einer Datei schreiben? –

+1

@kasurd können Sie bitte GitHub Link der gleichen mit der richtigen Implementierung zu teilen. Das wird sehr hilfreich sein .. –

0

Für mich funktioniert das, wenn ich die NumberOfSamples verdoppeln

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

Dies zu einem klaren Stereo-Ausgang

+0

Können Sie bitte erläutern, wie Sie die Ausgabe von Audio nach dem Anwenden von Effekten in einer Datei schreiben? –

+0

Benötigen Sie Hilfe bei diesen Fragen, http://stackoverflow.com/questions/42316295/how-to-write-file-to-external-storage-using-superpowered-sdk-in-android –

4

Sie können dies mit einer Instanz von SuperpoweredAndroidAudioIO tun, wobei enableInput und enableOutput auf true gesetzt sind.

Der Audiobearbeitungsrückruf (audioProcessing() in Ihrem Fall) empfängt Audio (Mikrofon) im audioInputOutput-Parameter. Übergeben Sie das einfach Ihrem SuperpoweredRecorder und es wird es auf die Festplatte schreiben.

Danach, machen Sie Ihre SuperpoweredAdvancedAudioPlayer Verarbeitung, und konvertieren Sie das Ergebnis in audioInputOutput. Das wird zur Audioausgabe gehen.

So ist es wie in Pseudo-Code:

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

niemals fwrite in der Audioverarbeitung Rückruf tun, da es innerhalb kürzester Zeit durchführen muß, und Plattenoperationen können zu langsam sein.

+0

Danke, Gabor für den Kommentar. Ich hatte mit diesem Ansatz begonnen, aber dann schien es, dass ich zwei-drei Playbacks und einen Recorder gleichzeitig brauche. Ich entschied mich für den Wechsel zu SuperpoweredAndroidAudioIO. Wird Ihr Ansatz auch für meinen Fall funktionieren? – kasurd

+0

Ja, natürlich. Mehrere Spieler können in den gleichen Puffer ablegen. Die Methode process() hat den Parameter pufferAdd, setzen Sie sie einfach auf true und verwenden Sie den gleichen Puffer für alle. –

+0

Können Sie bitte erläutern, wie Sie die Ausgabe von Audio nach dem Anwenden von Effekten in einer Datei schreiben? –