Изменение времени в реальном времени при записи звука с помощью AVAudioRecorder

Я пытаюсь достичь функциональности, в которой я могу записывать видео и применять эффект над ним в режиме реального времени, как инопланетянин. Так что, когда я буду играть в нее, будет звучать как инопланетянин.

Я уже достиг, что я могу изменить высоту звука после записи звука, но теперь хочу сделать это во время записи звука.

Вот код для записи звука с его настройками.

NSString *docsDir;

dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = dirPaths[0];

NSString *soundFilePath = [docsDir stringByAppendingPathComponent:@"sound.caf"];
NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];

NSDictionary *recordSettings = [NSDictionary
                                dictionaryWithObjectsAndKeys:
                                [NSNumber numberWithInt:AVAudioQualityMin],
                                AVEncoderAudioQualityKey,
                                [NSNumber numberWithInt:16],
                                AVEncoderBitRateKey,
                                [NSNumber numberWithInt: 2],
                                AVNumberOfChannelsKey,
                                [NSNumber numberWithFloat:44100.0],
                                AVSampleRateKey,
                                nil];
NSError *error = nil;

AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];

_audioRecorder = [[AVAudioRecorder alloc]
                  initWithURL:soundFileURL
                  settings:recordSettings
                  error:&error];

_audioRecorder.delegate = self;
_audioRecorder.meteringEnabled = YES;


if (error) {
    NSLog(@"error: %@", [error localizedDescription]);
} else {
    [_audioRecorder prepareToRecord];
}

Ответ 1

Используйте AVCaptureAudioDataOutput вместо AVAudioRecorder, он позволяет обрабатывать аудиоданные во время записи:

_captureAudioDataOutput = [[AVCaptureAudioDataOutput alloc] init];
[_captureAudioDataOutput setAudioSettings:recordSettings];
[_captureAudioDataOutput setSampleBufferDelegate:self queue:_dispatchQueue];

Вам нужна AVCaptureSession и self должен предоставить функцию captureOutput.

В captureOutput вы можете использовать код, который вы уже должны изменить для звукового тона.