我正尝试使用Apple的AVMIDIPlayer
对象来播放MIDI文件。在Swift中看起来很容易,使用下面的代码:如何保持AVMIDIPlayer播放?
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)
所以我不得不用这个代码创建一个类作为函数/方法,然后创建一个类的实例并调用方法? 到目前为止,这只是一个CLI脚本,所以没有UI控制器。 – benwiggy
好吧,在这种情况下,使用循环是唯一的出路。在while循环中放置一个'sleep(1)'调用,这样它就不会占用你所有的CPU时间。另外,我很确定你需要将'midiPlayer?.play'调用移出while循环。 –