AVAudioRecorder не работает на MacOSX - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь использовать AVAudioRecorder в MacOSX 10.14.x для получения показаний уровня звука входного источника - в данном случае, микрофона. Поскольку это не на iOS, использование AVAudioSession не применяется. Я включил микрофон в настройках SandBox, а также дважды проверил все в приложении Audio Midi Setup, установив для микрофона значение 2-канальное 24-битное целое число 44,1 кГц. Я удалил всю проверку ошибок, но все должно быть в порядке (например, очевидный успех при всех вызовах объекта recorder). Кроме того, я попробовал это на другом компьютере 10.14.x с тем же результатом.

Когда я запускаю это, все, что я получаю, это значения -120,0 как для средней, так и для пиковой мощности в моем обратном вызове, даже если есть звук.

Есть идеи, что я делаю не так?

Примечание. Когда я запускаю [recorder prepareToRecord], я получаю два сообщения об ошибке:

no saved enable hardware sample rate converter preference found
ca_debug_string: inPropertyData == NULL

AVAudioRecorder *recorder;  // instance variable
NSTimer *levelTimer;        // instance variable

NSURL *url = [NSURL fileURLWithPath: @"/dev/null"];

NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys:
                          [NSNumber numberWithFloat: 44100.00],           AVSampleRateKey,
                          [NSNumber numberWithInt: kAudioFormatMPEG4AAC], AVFormatIDKey,
                          [NSNumber numberWithInt: 1],                    AVNumberOfChannelsKey,
                          [NSNumber numberWithInt: AVAudioQualityHigh],   AVEncoderAudioQualityKey,
                         nil];

NSError *error = nil;
recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error];

[recorder prepareToRecord];
recorder.meteringEnabled = YES;
[recorder record];
levelTimer = [NSTimer scheduledTimerWithTimeInterval:0.03
                                              target:self
                                            selector:@selector(levelTimerCallback:)
                                            userInfo:nil
                                             repeats:YES];

- (void)levelTimerCallback:(NSTimer *)timer {
    [recorder updateMeters];
    float peakPower = [recorder peakPowerForChannel:0];
    float avgPower  = [recorder averagePowerForChannel:0];
}
...