Что может привести к краху iOS MediaPlayer?
Мы получили несколько отчетов о сбоях со следами стека, которые нам сложно расшифровать. Трассировка стека полностью находится в MediaPlayer, Foundation, CoreFoundation и libsystem_c.dylib. К сожалению, мы не смогли воспроизвести ни одно из наших устройств разработки, поэтому устранение неполадок оказывается проблематичным.
Вот пример трассировки стека. Кто-нибудь видел что-либо подобное или имел какие-либо указания на то, что может вызвать этот крах?
EXC_BAD_ACCESS KERN_PROTECTION_FAILURE at 0x000000016fc47fe0
Thread : Crashed: com.apple.main-thread
0 libsystem_c.dylib 0x0000000196a0624c localeconv_l
1 libsystem_c.dylib 0x0000000196a55d6c __vfprintf + 108
2 libsystem_c.dylib 0x0000000196a73680 __v2printf + 588
3 libsystem_c.dylib 0x0000000196a0620c _vsnprintf + 304
4 libsystem_c.dylib 0x0000000196a06c58 snprintf_l + 24
5 CoreFoundation 0x000000018462b01c __CFStringAppendFormatCore + 11584
6 CoreFoundation 0x00000001846282a4 _CFStringCreateWithFormatAndArgumentsAux2 + 248
7 Foundation 0x000000018546e448 -[NSPlaceholderString initWithFormat:locale:arguments:] + 172
8 Foundation 0x000000018546e308 +[NSString stringWithFormat:] + 76
9 MediaPlayer 0x00000001869bf524 -[NSObject(MPLogDescription) MP_shortDescription] + 96
10 MediaPlayer 0x00000001869bf598 -[AVPlayerItem(MPLogDescription) MP_shortDescription] + 72
11 MediaPlayer 0x00000001869bde2c -[MPAVQueueCoordinator _syncPlayerItems] + 1316
12 MediaPlayer 0x00000001869bd8a4 -[MPAVQueueCoordinator _syncItems] + 1452
13 MediaPlayer 0x00000001869becbc -[MPAVQueueCoordinator _updateCurrentItem] + 620
14 MediaPlayer 0x00000001869be61c -[MPAVQueueCoordinator _syncPlayerItems] + 3348
15 MediaPlayer 0x00000001869bd8a4 -[MPAVQueueCoordinator _syncItems] + 1452
16 MediaPlayer 0x00000001869becbc -[MPAVQueueCoordinator _updateCurrentItem] + 620
17 MediaPlayer 0x00000001869be61c -[MPAVQueueCoordinator _syncPlayerItems] + 3348
18 MediaPlayer 0x00000001869bd8a4 -[MPAVQueueCoordinator _syncItems] + 1452
19 MediaPlayer 0x00000001869becbc -[MPAVQueueCoordinator _updateCurrentItem] + 620
20 MediaPlayer 0x00000001869be61c -[MPAVQueueCoordinator _syncPlayerItems] + 3348
...
Трассировка стека продолжается еще на несколько сотен повторений последних трех строк.
Ответы
Ответ 1
Просто это произошло в моем приложении iOS 8.4. Оказывается, приложение пыталось загрузить несуществующий файл локального видео. Он пытался загрузить "Animation.mp4", когда файл был вызван "Intro.mp4", и у меня не было кода для обнаружения ошибок.
Конечным результатом была точно такая же трассировка стека, как и выше, - несколько сотен повторений последних трех строк трассы, белого экрана и краха приложения
Так что, может быть, стоит проверить это - это может помочь кому-то, хотя, надеюсь, вы немного более разумны и имеете код ошибки для вашего кода загрузки:)
Ответ 2
Из вашего описания это звучит так, как игрок входит в бесконечный цикл, который либо выделяет память, либо увеличивает указатель. Это (предположение здесь), скорее всего, связано с загрузкой искаженного видеофайла.
Когда приложение заканчивается из адресного пространства и/или указатель увеличивается/уменьшается до точки, где он указывает вне адресного пространства приложения, ядро уничтожает его для нарушения памяти.
Ответ 3
У меня сегодня такая же проблема. Я загрузил видео в MPMoviePlayerViewController
//Streaming video plying on MPMoviePlayerViewController
NSString *fileURL = @"http://...../myvideo.mp4";
NSURL *url = [NSURL fileURLWithPath:fileURL];
MPMoviePlayerViewController *mpViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:url];
mpViewController.moviePlayer.movieSourceType = MPMovieSourceTypeStreaming;
// Present the movie player view controller
[self presentViewController:mpViewController animated:YES completion:nil];
// Start playback
[mpViewController.moviePlayer play];
После запуска я получаю следующую ошибку
- [MPAVQueueCoordinator _syncPlayerItems]
Проведя час, я обнаружил ошибку:) мой код. Я пропустил URL-адрес в файле fileURLWithPath, из-за чего он показал, что erro. Чтобы решить, что я просто заменил
NSURL *url = [NSURL fileURLWithPath:fileURL];
с
NSURL *url = [NSURL URLWithString:fileURL];