Mac 上的 AVAudioPlayer 无法播放/崩溃
Posted
技术标签:
【中文标题】Mac 上的 AVAudioPlayer 无法播放/崩溃【英文标题】:AVAudioPlayer on Mac won't play / crashes 【发布时间】:2018-06-27 00:22:34 【问题描述】:我正在尝试从我的 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 指向我在创建 Soundtrack 之前在桌面上浏览到的文件——例如“file:///Users/bob/Desktop/2_02_Cycle.mp3”。
如果我立即调用 player.play(),如上所示,那么它可以工作。这首歌一直播放到我暂停为止。但是,如果我注释掉 play() 并稍后调用它,例如按下一个键,那么它就不会播放。它说它成功了:
player.prepareToPlay()
let ok = player!.play(atTime:atTime)
print("play \(ok)")
这里 'ok' 返回 true。此外,如果我随着时间的推移检查 player.isPlaying 的值,大约一秒钟左右(80-90 帧)它也会返回 TRUE,然后它会停止。但我从来没有听到任何声音。检查播放器设置报告持续时间正确,为 175 秒,所有速率/音量/平移信息也正确。我可以反复调用 play() 和 pause() ,每次播放时,它都认为它正在播放大约一秒钟。
但是,我提到如果我在创建 AVAudioPlayer 后立即开始播放歌曲。在这种情况下,我可以通过调用 pause() 来暂停歌曲,但如果我尝试使用 play() 或 play(atTime:) 再次播放它,它就会崩溃,并显示:“com.apple.audio.IOThread .client(36):EXC_BAD_INSTRUCTION(代码=EXC_I386_INVOP,子代码=0x0)”。我附上了堆栈跟踪的图片。
编辑:昨天早上出现问题后,它不再崩溃。除非我在创建后立即播放,否则它不会播放。虽然它说它正在播放,大约一秒钟。另外,我打印了 player.currentTime 变量,它在第二次“播放”时静默,它说时间是一个巨大的数字,比如 297130 或 594407。尽管我要求开始播放时间为 0 . 实际上,经过进一步测试,这个数字似乎是随机的——有时它很低,比如 10 或 35。当它是一个合理的数字时,玩家会报告它继续玩——它不会在一秒钟后停止。但我从来没有听到任何声音。
我认为这不会是玩家被释放的问题,因为我可以在整个过程中继续引用它并调用它的函数。有谁知道还有什么问题?
【问题讨论】:
剪辑在哪里? 'url' 什么也没说。另外,我不知道“玩家”是什么。 展开该堆栈跟踪。所有重要的部分都被隐藏了。 @Tomato 我添加了一些细节,够了吗? @maddy 展开哪一部分?每个三角形?实际上——今天早上它没有崩溃。昨天它每次都崩溃,但今天没有代码更改的相同操作不会产生崩溃。它只是不播放。 【参考方案1】:好的 - 我解决了这个问题。我没有意识到 play(atTime:) 使用音频设备当前时间。一旦我使用了 deviceCurrentTime,它就开始播放了。对我来说非常愚蠢的错误。我不知道为什么它昨天崩溃了。这种情况没有再次发生。
【讨论】:
以上是关于Mac 上的 AVAudioPlayer 无法播放/崩溃的主要内容,如果未能解决你的问题,请参考以下文章