![](/img/trans.png)
[英]iOS 8.4 AVFoundation _attachToPlayer or _attachToFigPlayer crash | An AVPlayerItem cannot be associated with more than one instance of AVPlayer
[英]An AVPlayerItem cannot be associated with more than one instance of AVPlayer in iOS 8.4
更新到iOS 8.4后,我发现了MPMoviePlayerController
的臭名昭着的异常:
AVPlayerItem不能与多个AVPlayer实例关联
我已经看到了几个解决方法,主要包括在重用之前重新初始化播放器。 但是,对我来说,当我尝试播放新视频时,崩溃不会发生,而是当我通过旋转到纵向模式关闭播放器的全屏时。
这是我的代码:
@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
全屏的更改发生在具有MoviePlayerViewController
作为u子视图的UIViewController
中:
-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
if (!self.moviePlayerViewController.moviePlayer.fullscreen &&
UIInterfaceOrientationIsPortrait(fromInterfaceOrientation)) {
[self.moviePlayerViewController.moviePlayer setFullscreen:YES animated:YES];
}
}
使用播放器中的全屏按钮手动进出全屏时没有问题。 我也可以将播放器旋转到全屏状态。 但是,当我尝试将其旋转到全屏(即从横向到纵向)时,我得到了异常,看起来像是在行中:
[self.moviePlayer setFullscreen:NO animated:YES];
发生异常时,这是我的堆栈跟踪:
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
解决方案是:
抱歉,不要使用MPMoviePlayerController
。 重构使用AVPlayerViewController
。 这是一个更现代的API; 你正在使用的那个已经被弃用了,所以在新版本的iOS上发生奇怪的神秘崩溃并不令人震惊。
我有一个听起来有些熟悉的问题,但可能是也可能不完全相同。 我有多个视图控制器,我正在安排一个视图控制器暂停其电影,以便另一个可以播放。 但是当设备旋转时,我正在使用的标准iOS标签栏控制器会加载其他视图控制器(我相信会调用viewDidLoad),如果它们尚未加载的话,还会显示标签栏上的任何其他标签。 我并没有期待这种行为,因为我从未选择过标签。 我加载电影的代码是在viewDidLoad中,所以它试图在另一个从未被要求“出现”的视图控制器上开始播放另一部电影。 我花了一段时间才意识到发生了什么,因为两个视图控制器继承自同一个基类,它看起来像调试器中的正确对象,直到我仔细观察。
如果内存服务,我移动代码加载并开始播放我的电影到viewWillAppear,这样除非真正选择了标签,否则它不会执行。 然后,当设备旋转,并且另一个视图控制器突然加载时,它没有不良副作用。 虽然看到它这样做仍然很奇怪。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.