gpt4 book ai didi

swift - 如何保持 AVMIDIPlayer 播放?

转载 作者:搜寻专家 更新时间:2023-11-01 06:16:33 32 4
gpt4 key购买 nike

我正在尝试使用 Apple 的 AVMIDIPlayer 对象来播放 MIDI 文件。使用以下代码在 Swift 中似乎很容易:

let midiFile:NSURL = NSURL(fileURLWithPath:"/path/to/midifile.mid")
var midiPlayer: AVMIDIPlayer?

do {
try midiPlayer = AVMIDIPlayer(contentsOf: midiFile as URL, soundBankURL: nil)
midiPlayer?.prepareToPlay()
} catch {
print("could not create MIDI player")
}

midiPlayer?.play {
print("finished playing")
}

它播放了大约 0.05 秒。我想我需要在某种循环中构建它。我尝试了一个简单的解决方案:

while stillGoing {
midiPlayer?.play {
let stillGoing = false
}
}

这有效,但会大量增加 CPU。有没有更好的办法?除了第一个评论,我已经尝试制作一个类,虽然它没有标记任何错误,但它也不起作用。

class midiPlayer {

var player: AVMIDIPlayer?

func play(file: String) {
let myURL = URL(string: file)
do {
try self.player = AVMIDIPlayer.init(contentsOf: myURL!, soundBankURL: nil)
self.player?.prepareToPlay()
} catch {
print("could not create MIDI player")
}
self.player?.play()
}
func stop() {
self.player?.stop()
}
}

// main

let myPlayer = midiPlayer()
let midiFile = "/path/to/midifile.mid"
myPlayer.play(file: midiFile)

最佳答案

你已经接近循环了。您只需要让 CPU 有时间去处理其他事情,而不是不断地检查 midiPlayer 是否已经完成。在循环中添加对 usleep() 的调用。这个每十分之一秒检查一次:

let midiFile:NSURL = NSURL(fileURLWithPath:"/Users/steve/Desktop/Untitled.mid")
var midiPlayer: AVMIDIPlayer?

do {
try midiPlayer = AVMIDIPlayer(contentsOfURL: midiFile, soundBankURL: nil)
midiPlayer?.prepareToPlay()
} catch {
print("could not create MIDI player")
}

var stillGoing = true
while stillGoing {
midiPlayer?.play {
print("finished playing")
stillGoing = false
}
usleep(100000)
}

关于swift - 如何保持 AVMIDIPlayer 播放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43614674/

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