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 上工作,但在本地数组声明中工作正常