在“AVPlayerItem _attachToPlayer:”中崩溃。一个AVPlayerItem不能与多个AVPlayer实例关联。

13

我有一个影响10%用户的崩溃问题,但我无法重现它,也不知道确切的发生时间。

Crashlytics 报告称,大约一半崩溃的用户没有打开应用,即正在进行后台音频或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

1
也许崩溃是在掉线或低连接性后尝试重新连接时发生的? - neowinston
在我们的应用程序中,Crashlytics也出现了同样的问题,但尚未找到问题的根源。这是我们的iOS 7最常见的崩溃之一,对于我们来说,有97%的用户正在使用该应用程序。 - ToddH
我们也看到了数千个相同日志的崩溃。由于我们的应用程序中没有任何影片播放器,所以当用户在应用程序内的浏览器中观看电影时会出现问题。我们认为已经将问题追踪到了在视频播放前显示广告的视频上(例如DailyMotion),然后当它从广告播放器切换到实际播放器时发生崩溃。由于这不是我们代码中的问题,我们一直无法修复它。我认为这是iOS7的一个错误。 - Accatyyc
@THM 你有没有在这个问题上有什么进展?我也遇到了同样的问题。 - FabKremer
5个回答

5

似乎可以通过在设置新URL之前显式停止播放来解决问题,例如:

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

1
尝试在SourceType之后设置ContentURL。
moviePlayerController_ = [[MPMoviePlayerViewController alloc] init];
moviePlayerController_.movieSourceType = MPMovieSourceTypeStreaming;
[moviePlayerController_.moviePlayer setContentURL:url];

1
发现了这个问题的原因...如果创建了MovieViewController,并且它当前正在缓冲(即状态!= MPMovieLoadStatePlayable或MPMovieLoadStatePlaythroughOK),调用“play”方法将导致应用程序崩溃并出现此异常。

我更新了应用程序,仅在不缓冲时调用播放功能,但崩溃仍然发生,我自己仍无法重现。 - THM

0

如果您不确定要获取的视频URL类型,请将源类型设置为Unknown。这对所有情况都适用。

moviePlayerController = [[MPMoviePlayerViewController alloc] init];
moviePlayerController.movieSourceType = MPMovieSourceTypeUnknown;
[moviePlayerController.moviePlayer setContentURL:url];

0

需要考虑的几个问题:

  1. 在播放器项目和播放器之间设置代理可以控制AVPlayer实例对播放器项目的访问。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接