【问题标题】:AVAudioPlayer on background thread后台线程上的 AVAudioPlayer
【发布时间】:2017-11-26 00:55:30
【问题描述】:

我对使用后台线程知之甚少,但这似乎以我需要的方式播放我的声音,如下所示:

1) 即使声音重叠,我也需要重复播放这种非常短的音效。 2) 我需要按时完美播放声音。 3) 我需要加载声音以不因口吃而影响屏幕上的图形。

我目前只是用一种声音尝试这种方法,但如果成功,我会将其推广到需要相同处理的其他音效。 我的问题是:我是否正确使用了后台线程?会有任何形式的内存泄漏吗?

代码如下:

-(void) playAudio {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
        NSString *path = [NSString stringWithFormat:@"%@/metronome.mp3", [[NSBundle mainBundle] resourcePath]];
        NSURL *metronomeSound = [NSURL fileURLWithPath:path];
        _audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:metronomeSound error:nil];
        [_audioPlayer prepareToPlay];
        [_audioPlayer play];
    });
}

//handles collision detection
-(void) didBeginContact:(SKPhysicsContact *)contact {
    uint32_t categoryA = contact.bodyA.categoryBitMask;
    uint32_t categoryB = contact.bodyB.categoryBitMask;

    if (categoryA == kLineCategory || categoryB == kLineCategory) {
        NSLog(@"line contact");
        [self playAudio];
    }
}

【问题讨论】:

  • 您找到解决此问题的方法了吗?我在我的应用中遇到了完全相同的情况。

标签: objective-c multithreading macos audio sprite-kit


【解决方案1】:

据我所知,我使用 AVAudioPlayer 并在后台线程中异步使用它,没有任何问题,也没有泄漏。但是,我已经实现了一个单例类,它处理所有分配并保留一组 AVAudioPlayer 实例,这些实例也可以根据需要异步播放。如果您需要重复播放声音,则应为每次播放时分配一个 AVAudioPlayer 实例。在这种情况下,延迟可以忽略不计,您甚至可以同时播放相同的声音。

关于你的策略,我认为它需要一些改进,特别是如果你想防止任何延迟。主要问题总是从磁盘读取,这是所有操作中最慢的操作,也是您的限制步骤。

因此,我还将实现一个 AVAudioPlayers 数组,每个都已经初始化以播放特定的声音,特别是如果经常重复播放该声音。如果内存开始增长,您可以从数组中删除那些播放频率较低的播放器实例,并在几秒钟前重新加载它们(如果您知道需要哪些播放器)。

还有一件事......不要忘记锁定和解锁数组,如果您要从多个线程或更好的线程访问它,请创建一个 GCD 队列来处理对数组的所有访问。

【讨论】:

  • 好的。在您的解决方案中,您是否在每次使用时“丢弃”AVAudioPlayer?我问的原因是,当我保持相同的声音时,它不会以我需要的频率重播声音,因为它可能仍在播放声音。
  • 不,我不是,这就是我保留它们的数组的原因。我只会在以下情况下将它们扔掉:a) 我知道暂时不需要它;b) 当我分配另一个 AVAudioPlayer 实例时。
  • 嗯...正如我在评论中所说,当我重用播放器时,有时它不会播放。关于为什么的任何想法?
  • 完全没有或稍后?如果您不预加载声音并且声音太短,则可能会发生这种情况。尝试先在数组中预加载它们并保持它们准备就绪。
  • 也许在声音的末尾设置静音(或接近静音)也可以,对吗?我认为问题在于它无法播放,因为它当前正在播放声音,但您所说的似乎因为声音太短而无法重播。
猜你喜欢
  • 1970-01-01
  • 2019-10-17
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多