Mac 上的 AVAudioPlayer 无法播放/崩溃
AVAudioPlayer on Mac won't play / crashes
我正在尝试从我的 Mac Cocoa 应用程序播放 mp3。使用 AVAudioPlayer 看起来非常简单。但它不起作用。我在网上看过,我看到的大多数问题都与释放播放器对象有关,但我认为这不是我的问题。播放器对象是持久的并响应成员函数调用。
我从 URL 创建 AVAudioPlayer,如下所示:
class Soundtrack:Bobject, AVAudioPlayerDelegate {
var player:AVAudioPlayer!
var volume:Float = 1.0
var pan:Float = 0.0
var rate:Float = 1.0
var numberOfLoops:Int = -1
var url:URL?
var reference = false
...
func setFile(_ url:URL) throws {
self.url = url
player = try AVAudioPlayer(contentsOf: url)
player.prepareToPlay()
print("player duration: \(player.duration)")
print("player settings: \(player.settings)")
player.play() // this is commented / uncommented out for testing
}
Soundtrack 对象是我在调用 setFile 函数之前创建并添加到持久对象层次结构中的对象。 url 指向我在创建配乐之前在桌面上浏览到的文件——例如 "file:///Users/bob/Desktop/2_02_Cycle.mp3".
如果我立即调用 player.play(),如上所示,那么它会起作用。这首歌一直播放到我暂停为止。但是,如果我注释掉 play() 并稍后调用它,例如按下一个键,那么它就不会播放。显示成功:
player.prepareToPlay()
let ok = player!.play(atTime:atTime)
print("play \(ok)")
此处'ok'returns正确。此外,如果我随着时间的推移检查 player.isPlaying 的值,大约一秒钟(80-90 帧),它 returns 也为 TRUE,然后它停止。但我从来没有听到任何声音。检查播放器设置报告持续时间正确,175 秒,所有 rate/volume/pan 信息也正确。我可以重复调用 play() 和 pause() ,每次我播放时,它认为它正在播放大约一秒钟。
但是,我提到如果我在创建 AVAudioPlayer 后立即启动它,歌曲确实会播放。在这种情况下,我可以通过调用 pause() 来暂停歌曲,但是如果我随后尝试使用 play() 或 play(atTime:) 再次播放它,它就会崩溃,并显示:"com.apple.audio.IOThread.client (36): EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)"。我附上了堆栈跟踪的图片。
编辑:昨天出现问题后的今天早上,它不再崩溃了。除非我在创建后立即播放它,否则它不会播放。虽然它说它正在播放,大约一秒钟。另外,我打印了第二个 player.currentTime 变量,它执行 "play",默默地,它说时间是一个很大的数字,比如 297130 或 594407。尽管我要求开始播放时间为 0。实际上,经过进一步测试,这个数字似乎是随机的 - 有时它很低,例如 10 或 35。当它是一个合理的数字时,玩家确实报告说它继续玩 - 它不会在之后停止一秒。但是我从来没有听到任何声音。
我不认为这可能是播放器被释放的问题,因为我能够在整个过程中继续引用它并调用它的函数。有人知道还有什么问题吗?
好的 - 我解决了这个问题。我没有意识到 play(atTime:) 使用音频设备的当前时间。一旦我使用了 deviceCurrentTime,它就播放了。我犯了一个非常愚蠢的错误。我不知道为什么它昨天崩溃了。这种情况没有再发生。
我正在尝试从我的 Mac Cocoa 应用程序播放 mp3。使用 AVAudioPlayer 看起来非常简单。但它不起作用。我在网上看过,我看到的大多数问题都与释放播放器对象有关,但我认为这不是我的问题。播放器对象是持久的并响应成员函数调用。
我从 URL 创建 AVAudioPlayer,如下所示:
class Soundtrack:Bobject, AVAudioPlayerDelegate {
var player:AVAudioPlayer!
var volume:Float = 1.0
var pan:Float = 0.0
var rate:Float = 1.0
var numberOfLoops:Int = -1
var url:URL?
var reference = false
...
func setFile(_ url:URL) throws {
self.url = url
player = try AVAudioPlayer(contentsOf: url)
player.prepareToPlay()
print("player duration: \(player.duration)")
print("player settings: \(player.settings)")
player.play() // this is commented / uncommented out for testing
}
Soundtrack 对象是我在调用 setFile 函数之前创建并添加到持久对象层次结构中的对象。 url 指向我在创建配乐之前在桌面上浏览到的文件——例如 "file:///Users/bob/Desktop/2_02_Cycle.mp3".
如果我立即调用 player.play(),如上所示,那么它会起作用。这首歌一直播放到我暂停为止。但是,如果我注释掉 play() 并稍后调用它,例如按下一个键,那么它就不会播放。显示成功:
player.prepareToPlay()
let ok = player!.play(atTime:atTime)
print("play \(ok)")
此处'ok'returns正确。此外,如果我随着时间的推移检查 player.isPlaying 的值,大约一秒钟(80-90 帧),它 returns 也为 TRUE,然后它停止。但我从来没有听到任何声音。检查播放器设置报告持续时间正确,175 秒,所有 rate/volume/pan 信息也正确。我可以重复调用 play() 和 pause() ,每次我播放时,它认为它正在播放大约一秒钟。
但是,我提到如果我在创建 AVAudioPlayer 后立即启动它,歌曲确实会播放。在这种情况下,我可以通过调用 pause() 来暂停歌曲,但是如果我随后尝试使用 play() 或 play(atTime:) 再次播放它,它就会崩溃,并显示:"com.apple.audio.IOThread.client (36): EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)"。我附上了堆栈跟踪的图片。
编辑:昨天出现问题后的今天早上,它不再崩溃了。除非我在创建后立即播放它,否则它不会播放。虽然它说它正在播放,大约一秒钟。另外,我打印了第二个 player.currentTime 变量,它执行 "play",默默地,它说时间是一个很大的数字,比如 297130 或 594407。尽管我要求开始播放时间为 0。实际上,经过进一步测试,这个数字似乎是随机的 - 有时它很低,例如 10 或 35。当它是一个合理的数字时,玩家确实报告说它继续玩 - 它不会在之后停止一秒。但是我从来没有听到任何声音。
我不认为这可能是播放器被释放的问题,因为我能够在整个过程中继续引用它并调用它的函数。有人知道还有什么问题吗?
好的 - 我解决了这个问题。我没有意识到 play(atTime:) 使用音频设备的当前时间。一旦我使用了 deviceCurrentTime,它就播放了。我犯了一个非常愚蠢的错误。我不知道为什么它昨天崩溃了。这种情况没有再发生。