Звукозапись AVAudioEngine меняет тональность - PullRequest
0 голосов
/ 29 августа 2018

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

1 Ответ

0 голосов
/ 31 августа 2018

Ошибка была в формате записи. В настройке AVAudioFile я использовал [self.engine.outputNode inputFormatForBus:0].settings, поэтому я взял формат ввода из выходного узла моего двигателя. Но при установке крана на шину я использовал [self.soundsMixerNode outputFormatForBus:0]. Эти два формата не равны. У них разные частоты дискретизации. Таким образом, я получил шаг в файле результатов. Мне нужно использовать один формат как в настройке файла записи, так и в installTapOnBus:bufferSize:format:block:. В моем случае мне нужно использовать выходной формат моего self.soundsMixerNode.

...