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

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

我正在使用AudioKit将
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存在一些差异。非常感谢。