AVAudioPlayer 在 5.0 中工作正常,在 4.0-4.3.5 中出现问题

Posted

技术标签:

【中文标题】AVAudioPlayer 在 5.0 中工作正常,在 4.0-4.3.5 中出现问题【英文标题】:AVAudioPlayer working fine in 5.0, issues in 4.0-4.3.5 【发布时间】:2012-04-27 16:49:02 【问题描述】:

我有一个应用程序可以跨不同的 ViewController 播放和控制音乐。为此,我在应用委托的 DidFinishLaunchingMethod 中创建了两个 AVAudioPLayer 实例:

NSString *path = [[NSBundle mainBundle] pathForResource:@"minnie1" ofType:@"mp3"];
NSURL *path1 = [[NSURL alloc] initFileURLWithPath:path];
menuLoop =[[AVAudioPlayer alloc] initWithContentsOfURL:path1 error:NULL];
[menuLoop setDelegate:self];  
menuLoop.numberOfLoops = -1;
[menuLoop play];


NSString *path2 = [[NSBundle mainBundle] pathForResource:@"minnie2" ofType:@"mp3"];
NSURL *path3 = [[NSURL alloc] initFileURLWithPath:path2];
gameLoop=[[AVAudioPlayer alloc] initWithContentsOfURL:path3 error:NULL];
gameLoop.numberOfLoops = -1;
[gameLoop setDelegate:self];
[gameLoop prepareToPlay];

在这之后,我在各种 viewControllers 中调用它,以使用如下代码停止或重新启动:

- (IBAction)playGameLoop

NSLog(@"Begin playGameLoop");
FPAppDelegate *app = (FPAppDelegate *)[[UIApplication sharedApplication] delegate];

if ([FPAVManager audioEnabled] == NO)
    //DO NOTHING   

else 
    if (app.gameLoop.playing ==YES ) 
        //DO NOTHING
    
    else   [app.gameLoop play];
    NSLog(@"End playGameLoop");
    
    

音频文件第一次播放正常,并在被要求停止时停止。不过,在 ios4 设备上,它们不会在再次调用时开始重播。

谢谢!

【问题讨论】:

【参考方案1】:

来自文档:

调用此方法 [stop] 或让声音完成播放, 撤消调用 play 或 prepareToPlay 时执行的设置 方法。 stop 方法不会重置 currentTime 属性的值 为 0。也就是说,如果你在播放过程中调用 stop 然后调用 播放时,播放会从中断处继续。

在您循环播放声音的地方,我希望能够调用stop,然后调用play。但我对自己遇到这种情况有模糊的回忆。我发现调用pause,而不是stop,是一个更好的解决方案。尤其是因为我可以再次拨打play 继续比赛。至少在我的经验中,调用stop 似乎总是需要在调用play 之前再次调用prepareToPlay

iOS4.x 和 iOS5 之间的 API 实现可能也有一些变化。您应该检查开发者网站上的 API 差异以确定。

【讨论】:

看来我已经解决了这个问题,至少在我测试过的一台设备上。虽然它可能不是正确的解决方案,但当我从新的 viewController 内部重新初始化播放器时,它似乎可以工作。我还将 menuLoop 列为这个 viewController 中的一个属性。现在看来还可以。谢谢大家。

以上是关于AVAudioPlayer 在 5.0 中工作正常,在 4.0-4.3.5 中出现问题的主要内容,如果未能解决你的问题,请参考以下文章

整数文字 '115000159351' 在存储到 'Int' 时溢出,但在一个项目中工作正常,但在另一个项目中工作正常 - Swift

VOIP 服务不能在生产环境中工作,但在测试服务器中工作正常

ForEach 不能在 mongodb 上工作,但在本地数组声明中工作正常

Angular 6 - 为啥生产构建中缺少承载令牌? (在开发版本中工作正常)

Angular 2 生产构建错误。在开发中工作正常

推送通知在开发中工作正常,但设备在生产中没有收到通知