Versuchen Sie, einen Hahn auf Hauptmischer zu installieren, ist es dann schneller durch die Rahmenlänge einstellen, dann die Proben lesen und Durchschnitt bekommen, so etwas wie diese:
self.mainMixer = [self.engine mainMixerNode];
[self.mainMixer installTapOnBus:0 bufferSize:1024 format:[self.mainMixer outputFormatForBus:0] block:^(AVAudioPCMBuffer * _Nonnull buffer, AVAudioTime * _Nonnull when) {
[buffer setFrameLength:1024];
UInt32 inNumberFrames = buffer.frameLength;
if(buffer.format.channelCount>0)
{
Float32* samples = (Float32*)buffer.floatChannelData[0];
Float32 avgValue = 0;
vDSP_meamgv((Float32*)samples, 1, &avgValue, inNumberFrames);
self.averagePowerForChannel0 = (LEVEL_LOWPASS_TRIG*((avgValue==0)?-100:20.0*log10f(avgValue))) + ((1-LEVEL_LOWPASS_TRIG)*self.averagePowerForChannel0) ;
self.averagePowerForChannel1 = self.averagePowerForChannel0;
}
if(buffer.format.channelCount>1)
{
Float32* samples = (Float32*)buffer.floatChannelData[1];
Float32 avgValue = 0;
vDSP_meamgv((Float32*)samples, 1, &avgValue, inNumberFrames);
self.averagePowerForChannel1 = (LEVEL_LOWPASS_TRIG*((avgValue==0)?-100:20.0*log10f(avgValue))) + ((1-LEVEL_LOWPASS_TRIG)*self.averagePowerForChannel1) ;
}
}];
die Spitzenwerte zu erhalten, Verwenden Sie vDSP_maxmgv anstelle von vDSP_meamgv.
LEVEL_LOWPASS_TRIG ist ein einfacher Filter geschätzt zwischen 0,0 bis 1,0, wenn man 0,0 eingestellt Sie alle Werte filtern wird und keine Daten. Wenn Sie es auf 1.0 setzen, erhalten Sie zu viel Rauschen. Grundsätzlich gilt, je höher der Wert ist, desto mehr Daten variieren. Es scheint, dass ein Wert zwischen 0,10 und 0,30 für die meisten Anwendungen gut ist.
Dank für meine Post lesen. -.- Ich bin mir bewusst, dass diese Klassen überwachen, aber sie sind nicht in der AVAudioNode-Hierarchie und arbeiten daher nicht mit der übergeordneten AVAudioEngine API. Wenn ich mich nicht irre ...? – horseshoe7