gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 00:20:47 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com