Ger*_*acs 7 iphone audio objective-c avaudioplayer ios
这个问题可能过于含糊,无法通过StackOverflow's标准,但我必须尝试发布它,因为我的选项用完了......:/
长话短说:我的应用程序经历了随机的缓慢时期.它不会经常发生(可能每个月一次),但是只有完全重新启动它运行的iDevice才有帮助.症状是:2-3秒的响应时间和缓慢,波动的动画; 整个应用程序基本上变得无法使用.
我通过每个可能的诊断工具运行应用程序,其中没有发现任何错误; 没有内存泄漏或异常高的CPU使用率.但是,这并不奇怪,考虑到应用程序非常简单,一个卡片游戏的跟踪器应用程序.
所有这些让我相信,AVAudioPlayer当用户点击时,我用来播放声音button可能是问题的原因(它是整个应用程序中唯一的,相对高复杂度的元素).但是,我不确定,这是我需要帮助的地方.我在这里提供了一个示例代码,也许有iOS音频播放经验的人可以查看它,看看是否有一些我忽略的错误.
在这里,我们开始:首先,我初始化一个"静音播放器",每秒钟保持播放一个静音轨道以保持AVAudioPlayer活力.这是必要的,因为在长时间AVAudioPlayer不活动之后被调用时的响应时间相对较长.
NSString *silenceFilePath = [[NSBundle mainBundle] pathForResource: @"silence" ofType: @"wav"];
NSURL *silenceFileURL = [[NSURL alloc] initFileURLWithPath: silenceFilePath];
silencePlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: silenceFileURL error: nil];
[silencePlayer setDelegate: self];
[silencePlayer prepareToPlay];
silenceTimer = [NSTimer scheduledTimerWithTimeInterval:1.0f
target:self
selector:@selector(repeatSilence)
userInfo:nil
repeats:YES];
Run Code Online (Sandbox Code Playgroud)
NSTimer调用以下方法:
- (void) repeatSilence
{
if (isAudioON == YES)
{
if (silencePlayer.playing)
{
[silencePlayer stop];
silencePlayer.currentTime = 0;
[silencePlayer play];
}
else
{
[silencePlayer play];
}
}
}
Run Code Online (Sandbox Code Playgroud)
其余的相当简单.我发起另一个AVAudioPlayer来播放特定的按钮声音(其中有两个):
NSString *buttonSoundFilePath = [[NSBundle mainBundle] pathForResource: @"button_pushed" ofType: @"wav"];
NSURL *buttonFileURL = [[NSURL alloc] initFileURLWithPath: buttonSoundFilePath];
buttonPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: buttonFileURL error: nil];
[buttonPlayer setDelegate: self];
[buttonPlayer prepareToPlay];
Run Code Online (Sandbox Code Playgroud)
当按下按钮时,我播放声音(与我使用静音播放器的方式相同):
if (isAudioON == YES)
{
if (buttonPlayer.playing)
{
[buttonPlayer stop];
buttonPlayer.currentTime = 0;
[buttonPlayer play];
}
else
{
[buttonPlayer play];
}
}
Run Code Online (Sandbox Code Playgroud)
而且真的就是它.然而,我担心,尽管这种方法具有简单的特性,但不知何故,这种连续的音频播放创造了一个罕见的例子,其中iOS只是疯了.但这只是一个理论,这就是为什么我需要有经验的人来看看我的代码并分享他的观点.
谢谢!
更新: 我发现了另外几行可能与问题相关的代码.有了它们,我将AVAudioPlayer设置为与在后台播放音乐同时工作(例如,从另一个应用程序):
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil];
[[AVAudioSession sharedInstance] setActive:YES error:nil];
[[AVAudioSession sharedInstance] setDelegate:self];
Run Code Online (Sandbox Code Playgroud)
我从上面的代码中观察到,我建议进行两项更改。
1)您使用了两个 AVAudioPlayer 实例,一个用于每秒连续播放无声声音。AVAudioPlayer 的第二个实例用于在单击按钮时播放声音。同时运行两个 AVAudioPlayer 实例,因为在设备内存不足且需要同时播放静音和按钮声音的某个时间点,设备会表现迟缓。最好使用一个 AVAudioPlayer 实例来播放两种声音。
2) 继续播放无声声音,直到用户单击按钮。当用户单击按钮时,暂停计时器并停止当前声音并使用相同的 AVAudioPlayer 实例播放按钮声音。这样,当需要播放按钮声音时,不推荐的计时器大多数会停止一段时间,当按钮声音播放完毕时,恢复计时器以与 AVAudioPlayer 实例相同的方式播放无声声音。这将减轻内存和处理的大量负载。
| 归档时间: |
|
| 查看次数: |
737 次 |
| 最近记录: |