首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AVAudioPlayer音频播放AVAudioPlayer:成功:未调用

AVAudioPlayer音频播放AVAudioPlayer:成功:未调用
EN

Stack Overflow用户
提问于 2012-02-08 05:45:59
回答 1查看 5.6K关注 0票数 3

我在AVAudioPlayer类中遇到了一个奇怪的问题,有时不调用audioPlayerDidFinishPlaying:successfully:回调。开始回放的代码的简化版本如下,

代码语言:javascript
复制
self.player = [[[AVAudioPlayer alloc] initWithContentsOfURL:localFileAudioURL error:&error] autorelease];
self.player.delegate = self;
[player prepareToPlay];
[NSTimer scheduledTimerWithTimeInterval:0.016f target:self selector:@selector(updatePlaybackProgress) userInfo:nil repeats:YES];
[player play];

有一个计时器,每16毫秒运行一次,以显示播放进度。每当音频播放结束,并且调用audioPlayerDidFinishPlaying:successfully:回调时,计时器就会失效。回调代码是,

代码语言:javascript
复制
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
    [self.progressTimer invalidate];
    self.progressTimer = nil;
}

然而,偶尔(每20-30次回放一次),这个回调就不会被调用。我添加了断点和日志记录调用,以验证此回调方法是否被调用。

用于回放的numberOfLoops设置为0,因此不会重复。

这是一些额外的信息,如果有帮助的话。正在创建的重复计时器使用当前的播放进度更新UI。它的代码看起来像,

代码语言:javascript
复制
- (void)updatePlaybackProgress {
    SoundCell *soundCell = [self soundCellForCurrentlyPlayingSound];

    NSTimeInterval progress = player.currentTime / player.duration;
    if (progress >= 0) {
        soundCell.progress = progress;
    }
}

有时不调用完成回调,因此计时器不会失效,并且每隔16 ms调用一次。我将player.currentTimeprogress的值记录在updatePlaybackProgress方法中,而且回放似乎是一次又一次的循环。currentTime的值从0.0不断增加到1.0,然后返回到0.0并重新开始。然而,音频只在第一次播放,而不是像currentTime所暗示的那样持续播放。

这个问题已经在持续时间为1秒到30秒的声音中发生。

我在这一点上没有任何想法,谷歌和苹果开发者论坛没有任何关系。

EN

回答 1

Stack Overflow用户

发布于 2012-02-08 07:07:40

  1. 您的计时器不能保证在您指定的时候触发。如果您想要构建一个播放器进度指示器,我建议使用一个CADisplayLink来为您提供类似nstimer的功能,而不需要开销(它基于屏幕外刷新触发)。
  2. i将实现与回放相关的所有AVAudioPlayerDelegate协议方法..

响应声音播放完成-音频播放Decoding :成功:响应音频解码错误-audioPlayerDecodeErrorDidOccur:错误:处理音频中断- audioPlayerBeginInterruption:- audioPlayerEndInterruption:- audioPlayerEndInterruption:withFlags:

其中一个很可能在播放停止时被调用。您还可以注册NSNotifications以进行音频播放,在您实现的方法中,您只需将音频播放器与本地播放器进行比较,就可以知道这是您感兴趣的事情。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9188407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档