2015-07-10 18 views
33

Sau khi cập nhật lên iOS 8.4 Tôi nhận được ngoại lệ khét tiếng với MPMoviePlayerController nói rằng:Một AVPlayerItem không thể liên kết với nhiều hơn một thể hiện của AVPlayer trong iOS 8.4

Một AVPlayerItem không thể liên kết với nhiều hơn một thể hiện của AVPlayer

Tôi đã thấy một số cách giải quyết chủ yếu bao gồm việc khởi động lại trình phát trước khi sử dụng lại. Tuy nhiên, đối với tôi sự cố không xảy ra khi tôi cố gắng phát video mới, nhưng thay vào đó là khi tôi tắt chế độ toàn màn hình cho trình phát bằng cách xoay sang chế độ dọc.

Đây là mã của tôi:

@implementation MoviePlayerViewController 

-(void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.moviePlayer.controlStyle = MPMovieControlStyleEmbedded; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerWillEnterFullscreenNotification:) name:MPMoviePlayerWillEnterFullscreenNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerWillExitFullscreenNotification:) name:MPMoviePlayerWillExitFullscreenNotification object:nil]; 
} 

- (void) moviePlayerWillEnterFullscreenNotification:(NSNotification*)notification 
{ 
    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceOrientationDidChange) name:UIDeviceOrientationDidChangeNotification object:nil]; 
} 

- (void) moviePlayerWillExitFullscreenNotification:(NSNotification*)notification 
{ 
    [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil]; 
} 

- (void)deviceOrientationDidChange 
{ 
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; 
    if (orientation == UIDeviceOrientationPortrait) { 
     [self.moviePlayer setFullscreen:NO animated:YES]; 
    } 
} 

@end 

Sự thay đổi đến độ toàn màn hình xảy ra trong UIViewController rằng có MoviePlayerViewController như u subview:

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 
{ 
    if (!self.moviePlayerViewController.moviePlayer.fullscreen && 
     UIInterfaceOrientationIsPortrait(fromInterfaceOrientation)) { 
      [self.moviePlayerViewController.moviePlayer setFullscreen:YES animated:YES]; 
    } 
} 

Không có vấn đề khi tôi đi trong hoặc ngoài toàn màn hình theo cách thủ công bằng nút toàn màn hình trong trình phát. Ngoài ra tôi có thể xoay người chơi thành toàn màn hình tốt. Tuy nhiên, khi tôi cố gắng để xoay nó ra khỏi toàn màn hình (tức là từ phong cảnh đến chân dung) tôi nhận được ngoại lệ, dường như trong dòng:

[self.moviePlayer setFullscreen:NO animated:YES]; 

Đây là stack trace của tôi khi ngoại lệ xảy ra:

Thread : Fatal Exception: NSInvalidArgumentException 
0 CoreFoundation     0x00000001865e02d8 __exceptionPreprocess 
1 libobjc.A.dylib    0x0000000197f3c0e4 objc_exception_throw 
2 AVFoundation     0x0000000184db4b50 -[AVPlayerItem _attachToFigPlayer] 
3 AVFoundation     0x0000000184da7770 -[AVPlayer _attachItem:andPerformOperation:withObject:] 
4 AVFoundation     0x0000000184dc8f00 -[AVQueuePlayer insertItem:afterItem:] 
5 MediaPlayer     0x00000001889d1d30 -[MPQueuePlayer insertItem:afterItem:] 
6 MediaPlayer     0x000000018893de7c -[MPAVQueueCoordinator _syncPlayerItems] 
7 MediaPlayer     0x000000018893d8a4 -[MPAVQueueCoordinator _syncItems] 
8 MediaPlayer     0x000000018893c68c -[MPAVQueueCoordinator reloadItemsKeepingCurrentItem:] 
9 MediaPlayer     0x000000018899fd38 -[MPAVPlaylistManager setPlaylistFeeder:startIndex:keepPlaying:] 
10 MediaPlayer     0x000000018899fb4c __67-[MPAVPlaylistManager reloadWithPlaybackContext:completionHandler:]_block_invoke 
11 MediaPlayer     0x000000018889fa5c -[MPArrayQueueFeeder reloadWithPlaybackContext:completionHandler:] 
12 MediaPlayer     0x000000018899f9b4 -[MPAVPlaylistManager reloadWithPlaybackContext:completionHandler:] 
13 MediaPlayer     0x00000001888b7550 -[MPAVController reloadWithPlaybackContext:completionHandler:] 
14 MediaPlayer     0x000000018888d114 -[MPMoviePlayerControllerNew _prepareToPlayWithStartIndex:] 
15 MediaPlayer     0x000000018888a988 -[MPMoviePlayerControllerNew _moviePlayerDidBecomeActiveNotification:] 
16 CoreFoundation     0x00000001865862c4 __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ 
17 CoreFoundation     0x00000001864c3450 _CFXNotificationPost 
18 Foundation      0x00000001873f2a80 -[NSNotificationCenter postNotificationName:object:userInfo:] 
19 MediaPlayer     0x000000018888d530 -[MPMoviePlayerControllerNew _postNotificationName:object:userInfo:] 
20 MediaPlayer     0x000000018888d494 -[MPMoviePlayerControllerNew _postNotificationName:object:] 
21 MediaPlayer     0x00000001888878dc -[MPMoviePlayerControllerNew setFullscreen:animated:] 
22 myApp       0x000000010004ddf8 -[MoviePlayerViewController deviceOrientationDidChange] (MoviePlayerViewController.m:36) 
23 CoreFoundation     0x00000001865862c4 __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ 
24 CoreFoundation     0x00000001864c3450 _CFXNotificationPost 
25 Foundation      0x00000001873f2a80 -[NSNotificationCenter postNotificationName:object:userInfo:] 
26 UIKit       0x000000018b059b34 -[UIDevice setOrientation:animated:] 
27 UIKit       0x000000018b0597f0 -[UIApplication handleEvent:withNewEvent:] 
28 UIKit       0x000000018b059080 -[UIApplication sendEvent:] 
29 UIKit       0x000000018b0c52c4 _UIApplicationHandleEvent 
30 GraphicsServices    0x000000018fdc9194 _PurpleEventCallback 
31 GraphicsServices    0x000000018fdc8c84 PurpleEventCallback 
32 CoreFoundation     0x0000000186597a54 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ 
33 CoreFoundation     0x00000001865979b4 __CFRunLoopDoSource1 
34 CoreFoundation     0x0000000186595934 __CFRunLoopRun 
35 CoreFoundation     0x00000001864c12d4 CFRunLoopRunSpecific 
36 GraphicsServices    0x000000018fdc76fc GSEventRunModal 
37 UIKit       0x000000018b0bef40 UIApplicationMain 
38 myApp       0x000000010002b2dc main (main.m:16) 
39 libdyld.dylib     0x00000001985e6a08 start 
+0

Vui lòng thêm dấu vết ngăn xếp tại thời điểm ngoại lệ được ném. gõ 'bt all' tại dấu nhắc lldb để lấy nó. – Anurag

+1

ngăn xếp dấu vết giống như hỗ trợ của apple https://forums.developer.apple.com/thread/7958 – evan

+2

Vâng, dấu vết ngăn xếp tương tự với dấu vết do evan cung cấp. Tuy nhiên, tôi đã thực sự quyết định bỏ 'MPMoviePlayerController' hoàn toàn và thay thế bằng 'AVPlayer' và' AVPlayerViewController'. 'MPMoviePlayerController' hiện không được chấp nhận trong iOS9 vì vậy tôi sẽ không lãng phí nhiều thời gian hơn vào thứ gì đó phải được thay thế. – pajevic

Trả lời

0

Giải pháp là:

Không sử dụng MPMoviePlayerController, xin lỗi. Thay vào đó, Refactor sử dụng AVPlayerViewController. Đây là một API hiện đại hơn; một trong những bạn đang sử dụng đã không được chấp nhận vì vậy nó không phải là gây sốc rằng nó có một vụ tai nạn bí ẩn kỳ lạ trên một phiên bản mới hơn của iOS.

+0

'AVPlayerViewController' chỉ khả dụng trên iOS 8 trở lên – user102008

+0

Đúng và câu hỏi cụ thể hỏi về iOS 8.4 – buildsucceeded

+1

Câu hỏi hỏi về hành vi của ứng dụng khi chạy trên iOS 8.4, nhưng mục tiêu triển khai của ứng dụng không nhất thiết phải là iOS 8 hoặc mới hơn. – user102008

0

Tôi gặp sự cố có vẻ hơi quen thuộc với bạn, nhưng có thể hoặc có thể không chính xác giống như vậy. Tôi đã có nhiều bộ điều khiển xem và tôi đã sắp xếp cho một bộ điều khiển chế độ xem để tạm dừng bộ phim để người khác có thể phát. Nhưng khi thiết bị xoay, bộ điều khiển thanh tab iOS chuẩn mà tôi đang sử dụng sẽ tải các bộ điều khiển chế độ xem khác (gọi viewDidLoad tôi tin) cho bất kỳ tab nào khác trên thanh tab nếu chúng chưa được tải. Tôi không mong đợi hành vi này, vì các tab không bao giờ được tôi chọn. Mã của tôi để tải phim là trong viewDidLoad, và do đó, nó đã cố gắng để bắt đầu chơi một bộ phim trên bộ điều khiển xem khác mà chưa bao giờ được yêu cầu "xuất hiện". Phải mất một lúc tôi mới nhận ra chuyện gì đang diễn ra vì hai bộ điều khiển xem được kế thừa từ cùng một lớp cơ sở và nó trông giống như đối tượng đúng trong trình gỡ lỗi, cho đến khi tôi nhìn kỹ hơn.

Nếu bộ nhớ phân phát, tôi đã di chuyển mã để tải và bắt đầu phát phim của tôi vào chế độ xemWillAppear để nó sẽ không thực thi trừ khi tab được chọn thực sự. Sau đó, khi thiết bị được xoay, và bộ điều khiển xem khác đột nhiên được nạp, nó không có tác dụng phụ bất lợi. Nó vẫn còn lạ để xem nó làm điều đó mặc dù.

Các vấn đề liên quan