在导入AudioKit并尝试运行一个小示例时,我得到:
Error Domain=com.apple.dt.ultraviolet.service Code=12 "Rendering service was interrupted" UserInfo={NSLocalizedDescription=Rendering service was interrupted}经过多次测试,我注意到它只在“预览(右侧边栏)”模式下崩溃,因为它“构建”并在“模拟器”中运行。这是不是Xcode中preview特性的一个限制?我不知道,但要报告给AudioKit团队(https://github.com/AudioKit/AudioKit/issues/2034)
考虑到(https://audiokit.io/examples/HelloWorld/)上发布的hello world,我重写了它,以适应最新的(考虑编写时间)Xcode11.4和Swift 5.2:
import SwiftUI
import AudioKit
struct ContentView: View {
var oscillator = AKOscillator()
var body: some View {
VStack {
Button("Play") {
self.playSound()
}
}.onAppear {
do {
AudioKit.output = self.oscillator
try AudioKit.start()
} catch {
print("audiokit init error")
}
}
}
private func playSound(){
self.oscillator.amplitude = 1
self.oscillator.frequency = 440
self.oscillator.start()
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}Podfile为:
platform :ios, '11.0'
target 'AKHello' do
use_frameworks!
# Pods for AKHello
pod 'AudioKit', '~> 4.9.5'
end源代码中有没有一些语法错误,或者有没有办法获得更有意义或更有用的错误来修复这个问题?考虑到github页面上的发行说明,AudioKit似乎与最新的Xcode11.4兼容(https://github.com/AudioKit/AudioKit/releases,在这里你可以读到“这个版本主要是通过CocoaPods带来与最新的Xcode11.4兼容的新的二进制文件”)
因为在View中初始化AudioKit可能不是一个好的做法(尽管其目标只是运行一个简单的Hello world,只是为了确保我将该部分移动到struct中,但同样的问题也会发生)
// AudioPlayer.swift
import AudioKit
struct AudioPlayer {
var oscillator = AKOscillator()
init() {
do {
AudioKit.output = self.oscillator
try AudioKit.start()
} catch {
print("audiokit init error")
}
}
func playSound(){
self.oscillator.amplitude = 1
self.oscillator.frequency = 440
self.oscillator.start()
}
}
// ContentView.swift
import SwiftUI
struct ContentView: View {
var audioPlayer: AudioPlayer = AudioPlayer()
var body: some View {
VStack {
Button("Play") {
self.audioPlayer.playSound()
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}我还尝试作为一个观察者,在内容视图和场景委托中分别进行了更改,其中我为音频播放器传递了新的类:
// ContentView.swift
import SwiftUI
struct ContentView: View {
@ObservedObject var audioPlayer: AudioPlayer
var body: some View {
VStack {
Button("Play") {
self.audioPlayer.playSound()
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView(audioPlayer: AudioPlayer())
}
}
// AudioPlayer.swift
import AudioKit
import Combine
class AudioPlayer: ObservableObject {
let objectWillChange = PassthroughSubject<AudioPlayer, Never>()
var isPlaying = false {
didSet {
objectWillChange.send(self)
}
}
var oscillator = AKOscillator()
init() {
do {
AudioKit.output = self.oscillator
try AudioKit.start()
isPlaying = true
} catch {
print("audiokit init error")
}
}
func playSound(){
self.oscillator.amplitude = 1
self.oscillator.frequency = 440
self.oscillator.start()
}
}
// SceneDelegate.swift
import UIKit
import SwiftUI
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
let contentView = ContentView(audioPlayer: AudioPlayer())
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: contentView)
self.window = window
window.makeKeyAndVisible()
}
}
}发布于 2020-04-26 05:07:58
我不确定这是否是您的问题的全部,但是不要期望AudioKit在预览视图中工作。据我所知,这应该只是可视化的SwiftUI类型的东西。你的第一种方法是将AudioKit的生命周期与SwiftUI捆绑在一起,这是相当危险的。请记住,SwiftUI会做它需要做的任何神奇的事情,你不应该相信音频系统会在它里面工作。然后,您将音频播放器内容移动到它自己的类中,但我仍然担心您将生命周期与SwiftUI结构联系得太紧密了。我的方法是将音频引擎移到自己的类中,该类在SceneDelegate中创建,然后在主内容视图的onAppear上启动。有关如何设置的示例,请参阅iOS+Catalyst/ AudioKit /的示例文件夹。
https://stackoverflow.com/questions/61427028
复制相似问题