Ios 使用AudioKit AKOfflineRenderNode保存的文件不正确
我正在使用AudioKit将Ios 使用AudioKit AKOfflineRenderNode保存的文件不正确,ios,audiokit,Ios,Audiokit,我正在使用AudioKit将WAV文件与MIDI文件混合使用。 我还需要将结果保存在一个单独的文件中 为了混合WAV和MIDI,我使用了AKMIDISampler和AKSequencer,如下所示: func add(track: MixerTrack) -> Bool { do{ let trackSampler = AKMIDISampler() try trackSampler.loadWav(track.instrument.fileName
WAV
文件与MIDI
文件混合使用。
我还需要将结果保存在一个单独的文件中
为了混合WAV和MIDI,我使用了AKMIDISampler
和AKSequencer
,如下所示:
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的一个bug,还是不打算这样使用
下面是我用来将混音保存到磁盘的代码:
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中还有什么其他选项可以满足我的需要。请尝试AudioKit 4.0.4中新的AudioKit.renderto文件,而不是使用AKOfflineRender:我认为您需要在iOS11中使用此方法 [AudioKit呈现文件:文件持续时间:self->\u audioDurationSeconds错误:&错误预呈现:^{ [self.voicePlayer启动];
}]; 如果我用一个只有iOS11的解决方案来写一个答案(并更新AudioKit),那可以吗?或者你需要一个iOS9+解决方案吗?嗨,Aurelius,谢谢你的回复。对于iOS 11的解决方案,我们将不胜感激。如果iOS 9+的解决方案存在,那就太好了,但我会接受我能得到的任何东西:)我看到了与此相关的GitHub问题,并且我看到iOS 11之前和之后的AKOfflineRenderNode存在一些差异。非常感谢。