Ich will rufen 20 mal pro Sekunde die installTapOnBus:Puffergröße:format:block:
Ich will Wellenform-Anzeige in Echtzeit-Eingabe aus dem Mikrofon.
Ich habe realisiert installTapOnBus:Puffergröße:format:block: Diese Funktion wird aufgerufen, drei mal in einer Sekunde.
Ich möchte, um diese Funktion aufgerufen werden 20-mal pro Sekunde.
Wo kann ich das einstellen?
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
NSError* error = nil;
if (audioSession.isInputAvailable) [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
if(error){
return;
}
[audioSession setActive:YES error:&error];
if(error){
retur;
}
self.engine = [[[AVAudioEngine alloc] init] autorelease];
AVAudioMixerNode* mixer = [self.engine mainMixerNode];
AVAudioInputNode* input = [self.engine inputNode];
[self.engine connect:input to:mixer format:[input inputFormatForBus:0]];
//tap ... 1 call in 16537Frames
//It does not change even if you change the bufferSize
[input installTapOnBus:0 bufferSize:4096 format:[input inputFormatForBus:0] block:^(AVAudioPCMBuffer* buffer, AVAudioTime* when) {
for (UInt32 i = 0; i < buffer.audioBufferList->mNumberBuffers; i++) {
Float32 *data = buffer.audioBufferList->mBuffers[i].mData;
UInt32 frames = buffer.audioBufferList->mBuffers[i].mDataByteSize / sizeof(Float32);
//create waveform
...
}
}];
[self.engine startAndReturnError:&error];
if (error) {
return;
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie sagen, Apple Support antwortete keine: (sep 2014)
aber jemand ändert die Puffergröße und die bekommt 40ms
https://devforums.apple.com/thread/249510?tstart=0
Kann nicht überprüfen, neen in ObjC 🙁
UPD es funktioniert! nur eine einzige Zeile:
Den AVAudioNode Klasse Referenz-Staaten, dass die Umsetzung möglicherweise wählen Sie eine Puffergröße, die Sie liefern, also so weit wie ich weiß, wir stecken mit der sehr großen Puffer-Größe. Dies ist bedauerlich, weil AVAudioEngine ist ansonsten eine ausgezeichnete Core-Audio-wrapper. Da ich auch brauchen, um die Eingabe Tippen Sie für etwas anderes als Aufzeichnung, ich bin auf der Suche in Die Erstaunliche Audio-Engine, sowie die Core-Audio -, C-API (siehe die iBook-Learning Core Audio für hervorragende tutorials auf ihm), als alternativen.
*** * Update: Es stellt sich heraus, dass Sie Zugriff auf die Audio-Unit der AVAudioInputNode und installieren Sie render callback auf. Über AVAudioSession, können Sie Ihre audio-Sitzung gewünschte buffer-Größe (nicht garantiert, aber sicherlich besser als der Knoten Hähne). So weit, ich habe eine Puffer-Größen so niedrig wie 64 Proben mit diesem Ansatz. Ich poste wieder hier, mit code einmal hatte ich eine chance, dies zu testen.
Weiß nicht, warum oder sogar, wenn dies funktioniert noch, nur versuchen ein paar Dinge aus. Aber für Sie sicher, dass die NSLogs zeigen einen 21 ms Intervall, 1024 samples kommen in der pro-Puffer...
buffer frame length 16537
Als iOS-13 2019, es ist AVAudioSinkNode, die möglicherweise besser zu vollbringen, was Sie suchen. Zwar konnte man auch einen regelmäßigen AVAudioUnit /Knoten und befestigt Sie an den Eingabe/Ausgabe, der Unterschied mit einer AVAudioSinkNode ist, dass es keine Ausgabe erforderlich. Das macht es eher wie ein Tippen und umgeht Probleme mit unvollständigen Ketten, die möglicherweise auftreten, wenn eine normale Audio-Gerät /Knoten.
Weitere Informationen:
Den entsprechenden Swift-code ist auf Seite 10 (mit einem kleinen Fehler korrigiert unten) der Sitzung PDF.
Ich mir vorstellen, dass Sie müssen noch die Folgen der typischen real-time-audio-Regeln bei der Verwendung dieser (z.B. keine Zuweisung/Freigabe von Speicher, kein ObjC Anrufe, keine sperren oder warten auf sperren, etc.). Ein ring-Puffer kann noch hilfreich sein.
Können Sie möglicherweise verwenden Sie einen
CADisplayLink
um dies zu erreichen. EinCADisplayLink
geben Sie eine callback-jedes mal, wenn der Bildschirm aktualisiert, die in der Regel mehr als 20-mal pro Sekunde (also eine zusätzliche Logik erforderlich sein können, um Gas-oder Obergrenze für die Anzahl der Zeiten, die Ihre Methode ausgeführt wird, in deinem Fall).Dies ist offensichtlich eine Lösung, die ist ziemlich getrennt von Ihrer audio-Arbeit, und, soweit Sie benötigt eine Lösung, die spiegelt Ihre Sitzung, es könnte nicht funktionieren. Aber wenn wir brauchen, Häufig wiederkehrende Rückrufe auf iOS, ist dies oft der Ansatz der Wahl, so dass es eine Idee.