尝试在 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/