У меня есть несколько 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
setup:
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];
}];
}