我的每个声音用户都可以玩很少的AVAudioPlayerNode
s。每个玩家节点都连接到自己的AVAudioMixerNode
以改变音量。所有这些混音器都连接到一个AVAudioMixerNode
(我将其命名为soundsMixerNode
),它连接到引擎的mainMixerNode
。用户可以录制这些声音,然后通过AVAudioPlayer
播放结果记录。问题是这个记录有一个转变的音调。就像我使用音高效果一样。我只在设备上得到这个结果,模拟器效果很好。也许问题出在AVAudioSession
类别或模式?或者我可能遇到AVAudioFormat
或设置问题?我不明白。这是我的音频图:
PlayerNode1 – MixerNode1
\
... soundsMixerNode – self.engine.mainMixerNode
/
PlayerNodeN – MixerNodeN
这是我的会话设置:
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setPreferredIOBufferDuration:128.0/audioSession.sampleRate error:NULL];
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord
withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker
error:&error];
[audioSession setActive:YES error:&error];
这是我的录音AVAudioFile
设置:
NSDictionary* recordSettings = [self.engine.outputNode inputFormatForBus:0].settings;
NSError* error = nil;
self.fileForRecording = [[AVAudioFile alloc] initForWriting:url
settings:recordSettings
error:&error];
并录制代码:
AVAudioFormat* recordingFormat = [self.soundsMixerNode outputFormatForBus:0];
if (recordingFormat.sampleRate > 0) {
typeof(self) weakSelf = self;
[self.soundsMixerNode installTapOnBus:0
bufferSize:1024
format:recordingFormat
block:^(AVAudioPCMBuffer * _Nonnull buffer, AVAudioTime * _Nonnull when) {
NSError* error;
[weakSelf.fileForRecording writeFromBuffer:buffer error:&error];
}];
}
错误是记录格式。在AVAudioFile
设置中我使用了[self.engine.outputNode inputFormatForBus:0].settings
,所以我从我的引擎outputNode中获取了一个输入格式。但是当我在公共汽车上安装水龙头时,我使用了[self.soundsMixerNode outputFormatForBus:0]
。这两种格式不相等。他们有不同的采样率。所以我在结果文件中得到了一个音调。我需要在记录文件设置和installTapOnBus:bufferSize:format:block:
中使用一种格式。在我的情况下,我需要使用我的self.soundsMixerNode
的outputFormat。