iOS AVAudioPlayer奇怪的行为

iOS AVAudioPlayer奇怪的行为,第1张

概述我有一系列短的(1秒)声音片段我需要连续播放.正在为此目的开发一个班级.我正在使用以下代码: - (void) playClip: (NSData *)clipToPlay{ NSError *error = nil; AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithData: clipToPlay erro 我有一系列短的(1秒)声音片段我需要连续播放.正在为此目的开发一个班级.我正在使用以下代码:

- (voID) playClip: (NSData *)cliptoplay{    NSError *error = nil;    AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithData: cliptoplay error:&error];    audioPlayer.numberOfLoops = 0;    audioPlayer.volume = 1.0f;    [audioPlayer preparetoPlay];    if (audioPlayer == nil)        NSLog(@"%@",[error description]);    else        [audioPlayer play];}

可以看出,cliptoplay包含一个声音片段作为NSData.这段代码的行为很奇怪.如果我在调试器中运行它并在以下行设置断点:

[audioPlayer play];

剪辑按预期播放 – 调试器在线上暂停,当您单步执行时,剪辑可以完美播放.但是,如果我把断点拿出来,它根本就不会播放.

我已经尝试将NSData首先复制到临时文件,结果完全相同.我还将cliptoplay复制到另一个变量(使用副本,而不仅仅是指针赋值),结果相同(我想也许cliptoplay在某处被破坏).我没有收到错误记录.

我真的坚持为什么暂停调试器的播放方法会导致这种情况发生.有什么建议或想法吗?

解决方法 好吧,我发现了这个问题,所以我会回答我自己的问题,所以也许它会在未来的某个时候拯救别人.

问题是AVAudioPlayer在有机会播放声音之前被解除分配.当在断点处停止时,显然有机会在解除分配之前播放声音.

在这个例子中,因为它在它自己的子类中,所以我使audioPlayer成为一个ivar而且我在变量视图控制器中创建了保持对子类的引用的变量ivar.这样可以在声音未播放时阻止重新分配.

在子类中,我在委托方法中找不到audioPlayer指针:

- (voID)audioPlayerDIDFinishPlaying:(AVAudioPlayer *)player successfully:(BOol)flag

我不确定这种安排的最终形式是什么,但这至少解释了导致问题的原因. AVAudioPlayer实例必须在其范围内,直到声音完成播放或ARC将解除分配.

总结

以上是内存溢出为你收集整理的iOS AVAudioPlayer奇怪的行为全部内容,希望文章能够帮你解决iOS AVAudioPlayer奇怪的行为所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/web/1054587.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存