gpt4 book ai didi

ios - Audiokit 4.9.5 在 xcode 11.4 + swift 5.2 中崩溃,没有有用的错误消息

转载 作者:行者123 更新时间:2023-12-01 21:53:53 25 4
gpt4 key购买 nike

导入 AudioKit 并尝试运行一个小示例时,我得到:

Error Domain=com.apple.dt.ultraviolet.service Code=12 "Rendering service was interrupted" UserInfo={NSLocalizedDescription=Rendering service was interrupted}

经过多次测试,我注意到它只在“预览(右侧边栏)”模式下崩溃,因为它“构建”并在“模拟器”中运行。是 preview 的限制吗? Xcode 中的功能?我不知道,但已向 AudioKit 团队报告 ( https://github.com/AudioKit/AudioKit/issues/2034)

考虑到 hello world发表于 ( https://audiokit.io/examples/HelloWorld/ ),我重新编写了一些不同的内容,以适应最新的(考虑写作时间)Xcode 11.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

源代码中是否存在一些语法错误,或者有一种方法可以得到更有意义或更有用的错误来解决这个问题? AudioKit 似乎与最新的 Xcode 11.4 兼容,考虑到 github 页面中的发行说明( https://github.com/AudioKit/AudioKit/releases,您可以在其中阅读“此版本主要是通过 CocoaPods 带来与最新 Xcode 版本兼容的新二进制文件”)

自从在 View 中初始化 AudioKit可能不是一个好的做法(即使目标只是运行一个简单的 Hello 世界,只是为了确保我将该部分移动到 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()
}
}

也尝试作为一个可观察的,在内容 View 和场景委托(delegate)中进行了相应的更改,我在其中传递了音频播放器的新类:
// 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()
}
}
}

最佳答案

我不确定这是否是您的全部问题,但不要指望 AudioKit 在预览 View 中工作。据我所知,这应该只是视觉 SwiftUI 类型的东西。您将 AudioKit 的生命周期与 SwiftUI 绑定(bind)的第一种方法非常危险。请记住,SwiftUI 会做它需要做的任何神奇的事情,你不应该相信音频系统可以在其中工作。然后,您将音频播放器的内容移到了自己的类中,但我仍然担心您将生命周期与 SwiftUI 结构过于紧密地联系在一起。我的方法是将音频引擎移动到在 SceneDelegate 中创建的自己的类中,然后在 onAppear 上启动主要内容 View 。有关如何设置的示例,请参阅 iOS+Catalyst/Drums/的 AudioKit 示例文件夹。

关于ios - Audiokit 4.9.5 在 xcode 11.4 + swift 5.2 中崩溃,没有有用的错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61427028/

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