使用AudioKit AKOfflineRenderNode保存的文件不正确



我正在使用AudioKit将WAV文件与MIDI文件混合在一起。我还需要将结果保存在一个单独的文件中。

为了混合WAV和MIDI,我使用AKMIDISamplerAKSequencer,如下所示:

func add(track: MixerTrack) -> Bool {
do{
let trackSampler = AKMIDISampler()
try trackSampler.loadWav(track.instrument.fileName)
trackSampler.connect(to: mixer)
let sequencer = AKSequencer(filename: track.midi.fileName)
sequencer.setTempo(Double(tempo))
sequencer.setRate(rate)
sequencer.setGlobalMIDIOutput(trackSampler.midiIn)
sequencer.enableLooping()
sequencer.enableLooping()
sequencers.append(sequencer)
tracks.append(track)
return true
} catch {
return false
}
}

我使用AudioKit示例中的SongProcessor示例来了解如何使用AKOfflineRenderNode

问题是这个例子适用于AKAudioPlayer实例,而不是我使用的序列器。我相信我不能使用播放器,因为我需要混合WAV和MIDI文件,而我只能使用音序器来实现这一点。

我的第一个问题是:是否可以像在SongProcessor中使用播放器一样,从测序仪创建文件?

我可以保存一个m4a文件,但结果很奇怪。首先,如果我不手动将速率设置为40这样的数字,那么播放所有音符的速度会非常慢。当我把ti设置成这样的值时,我可以听到序列在播放,但速率不对。在某些时刻,节拍演奏正确,但它们往往在不同的时间开始演奏得太慢或太快。

我做错什么了吗?这是AKOfflineRenderNode的一个错误吗?还是不想这样使用?

这是我用来将混合保存到磁盘的代码:

func saveMixToDisk() -> URL? {
do {
let fileManager = FileManager.default
let name = UUID().uuidString.appending(".m4a")
let documentDirectory = try fileManager.url(for: .documentDirectory, in: .userDomainMask, appropriateFor:nil, create:false)
let fileURL = documentDirectory.appendingPathComponent(name)
offlineRender.internalRenderEnabled = false
let duration = sequencers.first!.length.seconds
for sequencer in sequencers {
sequencer.stop()
sequencer.setTime(AKDuration(seconds: 0).musicTimeStamp)
sequencer.rewind()
}
for sequencer in sequencers {
sequencer.setRate(40) // I would like to find a way to avoid having to set this, since this value is hardcoded and I don't know how to find the correct one. (When I only play through the sequencer inside the app the rate is perfect, but it gets messed up when rendering to URL)
sequencer.play()
}
try offlineRender.renderToURL(fileURL, seconds: duration * 10)
for sequencer in sequencers {
sequencer.stop()
sequencer.setTime(AKDuration(seconds: 0).musicTimeStamp)
sequencer.rewind()
}
offlineRender.internalRenderEnabled = true
return fileURL
} catch let error {
print(error)
return nil
}
}

非常感谢您的帮助。我似乎无法实现这一点,遗憾的是,我不知道iOS中有任何其他选项可以实现我的需求。

不要使用AKOfflineRender,而是在AudioKit 4.0.4中尝试新的AudioKit.renderToFile:https://github.com/AudioKit/AudioKit/commit/09aedf7c119a399ab00026ddfb91ae6778570176

我认为您需要在iOS11 中使用此方法

[AudioKit renderToFile:文件持续时间:self->_audioDurationSeconds错误:&error prerender:^{[self.voicePlayer启动];}];

最新更新