ios - 使用 AVAudioRecorder 录制音频时的实时音高变化

标签 ios objective-c

我正在尝试实现可以​​录制视频并实时应用效果的功能,就像外星人一样。这样当我播放它时,听起来就像是外星人。

我已经实现了可以在录制音频后更改音频的音调,但现在想在录制音频时进行更改。

这是录制音频及其设置的代码。

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

最佳答案

使用AVCaptureAudioDataOutput代替 AVAudioRecorder,它允许您在录制时处理音频数据:

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

你需要一个 AVCaptureSession并且 self 必须提供函数 captureOutput .

captureOutput 中,您可以使用已有的代码来更改音频音调。

关于ios - 使用 AVAudioRecorder 录制音频时的实时音高变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49894548/

相关文章:

objective-c - AVPlayer 在模拟器上可以播放,但在真实设备上却无法播放

objective-c - 我遇到了 fileExistsAtPath :isDirectory 问题

ios - UITableViewController 不会调用 cellForRowAtIndexPath 但 numberOfSectionsInTableView 和 numberOfRowsInSection 确实设置正确

ios - 从 firebase 检索子值到数组以在 TableView 单元格中使用

android - 如何检测是否在 Flutter 中打开了另一个应用程序?

ios - CFString 在 Swift 2.0 和 XCODE 7 中转换为 kUTTypeImage 的字符串

ios - Xcode 将 TableView 置于最前面

ios - 在 Xcode 中通过 IB 选择自定义字体

iphone - 如何让 UIDatePicker 显示用户选择的时间

ios - 如何在设备屏幕因不活动而关闭时/之前立即执行方法?