崩溃 - [AVPlayerItem _attachToPlayer:] AVPlayerItem不能与多个AVPlayer实例关联

时间:2013-04-25 11:31:36

标签: ios cocoa uikit avfoundation avplayer

我的崩溃影响了大约10%的用户,但我无法重现它,并且不确切知道何时发生这种情况。

Crashlytics报告大约有一半的崩溃用户没有关注App,即I.e。做背景音频或AirPlay。该应用程序播放HLS视频流,并在背景时切换到仅音频版本。

任何想法有什么问题,或者为什么我的单例播放器类会有多个AVPlayer实例?

谢谢!

Exception Type:
NSInvalidArgumentException
Reason:
An AVPlayerItem cannot be associated with more than one instance of AVPlayer
Fatal Exception
Latest Crash: 4/06/2013 at 8:48:46 UTC+0200
0   CoreFoundation  __exceptionPreprocess + 162
1   libobjc.A.dylib objc_exception_throw + 30
2   AVFoundation    -[AVPlayerItem _attachToPlayer:] + 188
3   AVFoundation    -[AVPlayer _attachItem:andPerformOperation:withObject:] + 336
4   AVFoundation    -[AVPlayer _insertItem:afterItem:] + 26
5   AVFoundation    -[AVQueuePlayer insertItem:afterItem:] + 136
6   MediaPlayer __block_global_4 + 520
7
...
libdispatch.dylib   _dispatch_call_block_and_release + 10
14

5 个答案:

答案 0 :(得分:5)

似乎可以通过在设置新网址之前明确停止播放来解决,例如

[moviePlayer stop];
moviePlayer.movieSourceType = MPMovieSourceTypeStreaming;
[moviePlayer setContentURL:[NSURL URLWithString:[videos objectForKey:quality]]];

答案 1 :(得分:1)

找到导致此问题的原因...如果创建了MovieViewController,并且它当前正在缓冲(即state!= MPMovieLoadStatePlayable或MPMovieLoadStatePlaythroughOK),则调用'play'方法会使应用程序崩溃并出现此异常。

答案 2 :(得分:1)

尝试在SourceType

之后设置ContentURL
moviePlayerController_ = [[MPMoviePlayerViewController alloc] init];
moviePlayerController_.movieSourceType = MPMovieSourceTypeStreaming;
[moviePlayerController_.moviePlayer setContentURL:url];

答案 3 :(得分:0)

如果您不确定视频网址的类型,那么您将获取设置的源类型为“未知”。这适用于所有情况。


#routes.rb
devise_for :users
resources :users

答案 4 :(得分:0)

要考虑的事情:

  1. 播放器项目和播放器之间的代理将提供一种控制AVPlayer实例对播放器项目的访问的方法。

  2. 关联引用可以通过类别存储添加到给定类的属性;因此,您可以为播放器项目类创建一个类别,该类别包含每当播放器项目分配给AVPlayer时设置的单个属性(例如,它的描述字符串)。为确保播放器项目未分配给其他播放器,只需将存储在AVPlayer中的描述与相关播放器返回的描述进行比较。