Câu hỏi này có thể quá mơ hồ để vượt qua StackOverflow's
tiêu chuẩn, nhưng tôi phải cố gắng đăng nó bởi vì tôi đang chạy ra khỏi tùy chọn ...:/AVAudioPlayer và Random Chậm
câu chuyện dài ngắn: Tôi có một ứng dụng mà trải qua những giai đoạn chậm chạp ngẫu nhiên. Nó không xảy ra quá thường xuyên (có thể một lần mỗi tháng), nhưng khi nó chỉ khởi động lại hoàn toàn của iDevice nó chạy trên giúp. Các triệu chứng là: thời gian đáp ứng 2-3 giây và hình ảnh động chậm chạp, chậm chạp; toàn bộ ứng dụng về cơ bản trở nên không sử dụng được.
Tôi đã chạy ứng dụng thông qua mọi công cụ chẩn đoán có thể, không tìm thấy công cụ nào sai; không có rò rỉ bộ nhớ hoặc sử dụng CPU cao bất thường. Nhưng, điều này là không đáng ngạc nhiên, xem xét các ứng dụng là cực kỳ đơn giản, một ứng dụng theo dõi cho một trò chơi thẻ.
Tất cả điều này khiến tôi tin rằng AVAudioPlayer
Tôi sử dụng để phát âm thanh khi người dùng chạm vào button
có thể là nguyên nhân của sự cố (đó là yếu tố phức tạp duy nhất tương đối cao trong toàn bộ ứng dụng). Tôi, tuy nhiên, không chắc chắn, đó là nơi tôi cần sự giúp đỡ. Tôi bao gồm một mã mẫu ở đây, và có lẽ ai đó có kinh nghiệm trong phát lại âm thanh iOS
có thể xem nó và xem nếu có một số sai lầm tôi bỏ qua.
Ở đây chúng tôi đi: Đầu tiên, tôi khởi tạo "trình phát im lặng" tiếp tục phát một bản nhạc im lặng mỗi giây để giữ cho AVAudioPlayer
còn sống. Điều này là cần thiết vì thời gian phản hồi tương đối dài AVAudioPlayer
trải nghiệm khi được gọi sau một thời gian không hoạt động lâu hơn.
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];
Các NSTimer gọi phương thức sau đây:
- (void) repeatSilence
{
if (isAudioON == YES)
{
if (silencePlayer.playing)
{
[silencePlayer stop];
silencePlayer.currentTime = 0;
[silencePlayer play];
}
else
{
[silencePlayer play];
}
}
}
Phần còn lại là khá đơn giản. Tôi khởi AVAudioPlayer khác để chơi một âm thanh nút cụ thể (có hai trong số này):
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];
Và khi nút được đẩy tôi chơi âm thanh (giống như tôi đã làm với các cầu thủ im lặng):
if (isAudioON == YES)
{
if (buttonPlayer.playing)
{
[buttonPlayer stop];
buttonPlayer.currentTime = 0;
[buttonPlayer play];
}
else
{
[buttonPlayer play];
}
}
Và thực sự tất cả là có. Tuy nhiên, tôi sợ rằng, mặc dù bản chất đơn giản của phương pháp này, bằng cách nào đó việc phát lại âm thanh liên tục này tạo ra một trường hợp hiếm hoi mà iOS chỉ phát điên. Nhưng tất cả điều này chỉ là một lý thuyết, và đó là lý do tại sao tôi cần một người có nhiều kinh nghiệm hơn để xem mã của tôi và chia sẻ ý kiến của mình.
Cảm ơn!
Cập nhật: Tôi tìm thấy một vài dòng mã khác cũng có thể liên quan đến sự cố. Với họ, tôi đặt AVAudioPlayer hoạt động đồng thời với nhạc phát trong nền (ví dụ: từ một ứng dụng khác):
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil];
[[AVAudioSession sharedInstance] setActive:YES error:nil];
[[AVAudioSession sharedInstance] setDelegate:self];
Thông tin chi tiết hữu ích. Tôi sẽ cung cấp cho họ một thử vào cuối tuần này và chia sẻ kết quả! –