trong ứng dụng iOS của tôi, tôi đang cố gắng triển khai "vịt": trong khi ứng dụng của tôi phát một âm thanh "giống như lệnh", mọi nhạc nền phải được giảm âm lượng. Sau khi phát xong âm thanh, âm lượng nhạc sẽ trở về giá trị ban đầu.iOS AudioSessionSetActive() chặn chủ đề chính?
Khi được triển khai, vịt hoạt động như mong đợi. Tuy nhiên, khi tôi gọi AudioSessionSetActive (NO) trong audioPlayerDidFinishPlaying: để kết thúc việc quay phim, có một tạm dừng nhỏ trong bất kỳ cập nhật giao diện người dùng nào xảy ra tại thời điểm này. Điều này liên quan đến bản vẽ tùy chỉnh, cũng như cho ex. tự động cuộn văn bản và v.v.
Bây giờ, đây là câu hỏi:
Đây có phải là sự cố đã biết trong iOS6 không? Tôi đang chạy cùng một mã trên một iPod/iOS5, nơi tôi không thấy hành vi này. Hoặc tôi thiếu một cái gì đó từ mã? Có thể một trong các bạn đã gặp vấn đề tương tự và tìm ra giải pháp khả thi.
Cảm ơn rất nhiều sự ủng hộ của các bạn,
Goetz
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//...
NSError *err = nil;
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:&err];
//...
}
- (void) playSound {
// Enable ducking of music playing in the background (code taken from the Breadcrumb iOS Sample)
UInt32 value = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(value), &value);
// Required if using kAudioSessionCategory_MediaPlayback
value = YES;
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(value), &value);
UInt32 isOtherAudioPlaying = 0;
UInt32 size = sizeof(isOtherAudioPlaying);
AudioSessionGetProperty(kAudioSessionProperty_OtherAudioIsPlaying, &size, &isOtherAudioPlaying);
if (isOtherAudioPlaying) {
AudioSessionSetProperty(kAudioSessionProperty_OtherMixableAudioShouldDuck, sizeof(value), &value);
}
AudioSessionSetActive(YES);
// Initialization of the AVAudioPlayer
NSString *soundFileName = [[NSBundle mainBundle] pathForResource:@"Beep" ofType:@"caf"];
NSURL *soundFileURL = [[NSURL alloc] initFileURLWithPath:soundFileURL];
self.soundPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:nil];
[self.soundPlayer setDelegate:self];
[self.soundPlayer setVolume:[80.0/100.0];
[self.soundPlayer play];
}
- (void) audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
// Callback coming from the AVAudioPlayer
// This will block the main thread; however, it is necessary to disable ducking again
AudioSessionSetActive(NO);
}
Bạn đã bao giờ tìm ra giải pháp cho vấn đề này chưa? Tôi đang gặp vấn đề tương tự. –
Nếu tôi không gọi AudioSessionSetActive (NO) giao diện người dùng của tôi vẫn đáp ứng và không thả khung hình. Khi tôi gọi phương thức đó, sẽ mất khoảng 0,5 giây khi âm thanh đang phát. Nhưng, như bạn đã nói, nếu bạn không gọi nó, âm thanh vẫn bị dìm. –