swift - AKOfflineRenderNode - 调度 AKAudioPlayers,只有最后一个播放器渲染

标签 swift audiokit

尝试在 iOS 11.1 上使用 AudioKit 4.0、Swift 4 渲染一系列 AKAudioPlayer 时得到一些奇怪的结果

我知道开发分支 ( https://github.com/AudioKit/AudioKit/commit/09aedf7c119a399ab00026ddfb91ae6778570176 ) 上的 AudioKit.renderToFile 替代方案,但如果可能的话我想涵盖 iOS 9+

预期结果: 一个长音频文件,每个文件 (URL) 按顺序呈现

实际结果: 仅呈现最后一个预定文件(在生成的 wav 文件中的正确偏移处)

奇怪的是,如果我将它们全部安排在 0 偏移处,它们都会被渲染。另外,如果我在没有渲染的情况下回放,它听起来是正确的(尽管我必须调整 AVAudioTime 以使用 mach_absolute_time)

似乎安排 AKAudioPlayer 取消了前一个。

设置:

  class func initialize (){

    // .... 

    do {
         try AKSettings.setSession(category: .playAndRecord, with: .allowBluetoothA2DP)
     } catch {
         AKLog("Could not set session category.")
     }
     //AKSettings.playbackWhileMuted = true
     AKSettings.defaultToSpeaker = true

     mainMixer = AKMixer()
     offlineRender = AKOfflineRenderNode()

     mainMixer! >>> offlineRender!
     AudioKit.output = offlineRender!
     AudioKit.start()

     // .... 

渲染:

class func testRender(urls: [URL], dest: URL, offset: TimeInterval = 2){

      // Stop / Start AudioKit when switching internalRenderEnabled, otherwise I get the following error:
      // *** Terminating app due to uncaught exception 'com.apple.coreaudio.avfaudio', reason: 'player started when engine not running' 

     AudioKit.stop()

     var players = [AKAudioPlayer]()
     var scheduleTime : TimeInterval = 0

     // create players
     for url in urls {
         do {
             let file = try AKAudioFile(forReading: url)
             let player = try AKAudioPlayer(file: file)
             players.append(player)
             player.connect(to: mainMixer!)
             print("Connecting player")
         } catch {
             print("error reading")
         }

     }


     offlineRender!.internalRenderEnabled = false
     AudioKit.start()

     for player in players{
         do {
             //  0 instead of mach_absolute_time(), otherwise the result is silent
             let avTime = AKAudioPlayer.secondsToAVAudioTime(hostTime: 0, time: scheduleTime)
             // schedule and play according to:
             // https://stackoverflow.com/questions/45799686/how-to-apply-audio-effect-to-a-file-and-write-to-filesystem-ios/45807586#45807586
             player.schedule(from: 0, to: player.duration, avTime: nil)
             player.play(at: avTime);
             scheduleTime += offset
         } catch {
              print("error reading")
         }

     }

     // add some padding
     scheduleTime += 3

     let duration = scheduleTime
     do {
         try offlineRender!.renderToURL(dest, seconds: duration)

     } catch {
         print("error rendering")
     }

     // cleanup
     players.forEach { $0.schedule(from: 0, to: $0.duration, avTime: nil)}
     players.forEach({$0.stop()})
     players.forEach({$0.disconnectOutput()})

     offlineRender!.internalRenderEnabled = true


 }

感谢任何帮助!

最佳答案

从 iOS 11.0 开始,AKOfflineRenderNode 已被弃用。版本 4.0.4 有一个 AudioKit.renderToFile 方法来替换它。它是最近更新的(2017 年底)。

关于swift - AKOfflineRenderNode - 调度 AKAudioPlayers,只有最后一个播放器渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47372062/

相关文章:

audiokit - 如何通过 AudioKit 中的音符门同步 OSC 和滤波器包络

swift - 快速从音频文件中删除音频 channel

ios - Alamofire 忽略设置/处理数据的闭包

swift - 将闭包作为参数传递时,ReactiveCocoa 保留循环

swift - Audiokit 修剪音频

objective-c - 使用AudioKit加载.wav文件时出现问题

ios - (类)不可用 : cannot find swift declaration for this class ONLY for iPhone <= 5 simulator, 通用 iOS 设备和发布版本

ios - Whatsapp 打开 url 代码打开 Boltt Health App 而不是 ios 中的 whatsapp

xcode - 无法在 Swift 中创建 NSBitmapImageRep

ios - 如何在带有图像的 SwiftUI 中使用 Bundle