iOS 11之前的音频套件导出歌曲

iOS 11之前的音频套件导出歌曲,ios,swift,xcode,avfoundation,audiokit,Ios,Swift,Xcode,Avfoundation,Audiokit,请注意,这不是重复的,因为在那篇文章中只给出了使用什么方法,但没有关于如何使用它的示例 因此,我尽可能深入研究了AKOfflineRenderNode,并查看了我能找到的所有示例。然而,我的代码似乎从未在iOS 10.3.1设备(以及其他iOS 10版本)上正常工作,因为结果总是无声的。我试图效仿其他SO帖子中提供的例子,但没有成功。我试图在SongProcessor中遵循这一点,但它使用了较旧版本的Swift,我甚至无法编译它。尝试SongProcessor使用AKOfflineRenderN

请注意,这不是重复的,因为在那篇文章中只给出了使用什么方法,但没有关于如何使用它的示例

因此,我尽可能深入研究了
AKOfflineRenderNode
,并查看了我能找到的所有示例。然而,我的代码似乎从未在iOS 10.3.1设备(以及其他iOS 10版本)上正常工作,因为结果总是无声的。我试图效仿其他SO帖子中提供的例子,但没有成功。我试图在SongProcessor中遵循这一点,但它使用了较旧版本的Swift,我甚至无法编译它。尝试SongProcessor使用AKOfflineRenderNode的方式也没有帮助。结果总是一声不响

我创建了一个测试程序来测试这一点。因为我没有用于测试的音频文件,所以无法将其上载到GitHub。在编译到iOS 10.3.1模拟器之前,请将名为“Test”的音频文件添加到项目中。(如果您的文件不在m4a中,请记住在我初始化的代码中更改文件类型
AKPlayer

如果您不想下载并运行该示例,那么关键部分如下:

@IBAction func export() {
    // url, player, offlineRenderer and others are predefined and connected as player >> aPitchShifter >> offlineRenderer
    // AudioKit.output is already offlineRenderer

    offlineRenderer.internalRenderEnabled = false
    try! AudioKit.start()

    // I also tried using AKAudioPlayer instead of AKPlayer
    // Also tried getting time in these ways:
    // AVAudioTime.secondsToAudioTime(hostTime: 0, time: 0)
    // player.audioTime(at: 0)
    // And for hostTime I've tried 0 as well as mach_absolute_time()
    // None worked

    let time = AVAudioTime(sampleTime: 0, atRate: offlineRenderer.avAudioNode.inputFormat(forBus: 0).sampleRate)
    player.play(at: time)
    try! offlineRenderer.renderToURL(url, duration: player.duration)

    player.stop()
    player.disconnectOutput()
    offlineRenderer.internalRenderEnabled = true

    try? AudioKit.stop()
}

将演示项目发布到github上,以便其他人可以测试它,怎么样?要让SO社区阅读代码并为您找到答案,需要做很多工作。我已经编辑了这个问题,并在GitHub上添加了一个示例项目。谢谢你的建议@奥雷利乌斯普罗查斯卡酒店