AVAudioEngine录音改变调性
AVAudioEngine sound recording changes tonality
我几乎没有 AVAudioPlayerNode
每个声音用户可以播放。每个播放器节点都连接到自己的 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
,因此我从我的引擎输出节点获取了一种输入格式。但是在总线上安装 tap 时我使用了 [self.soundsMixerNode outputFormatForBus:0]
。这两种格式并不相同。他们有不同的采样率。所以我在结果文件中得到了一个推介。
我需要在记录文件设置和 installTapOnBus:bufferSize:format:block:
中使用一种格式。在我的例子中,我需要使用 self.soundsMixerNode
.
的 outputFormat
我几乎没有 AVAudioPlayerNode
每个声音用户可以播放。每个播放器节点都连接到自己的 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
,因此我从我的引擎输出节点获取了一种输入格式。但是在总线上安装 tap 时我使用了 [self.soundsMixerNode outputFormatForBus:0]
。这两种格式并不相同。他们有不同的采样率。所以我在结果文件中得到了一个推介。
我需要在记录文件设置和 installTapOnBus:bufferSize:format:block:
中使用一种格式。在我的例子中,我需要使用 self.soundsMixerNode
.