【问题标题】:Crash in -[AVPlayerItem _attachToPlayer:] An AVPlayerItem cannot be associated with more than one instance of AVPlayer崩溃 -[AVPlayerItem _attachToPlayer:] 一个 AVPlayerItem 不能与多个 AVPlayer 实例关联
【发布时间】:2013-04-25 11:31:35
【问题描述】:

我遇到了一个影响大约 10% 用户的崩溃,但我无法重现它,并且不知道具体何时发生。

Crashlytics 报告说,大约一半的崩溃用户没有关注应用程序,即做背景音频或 AirPlay。应用播放 HLS 视频流,并在后台切换到纯音频版本。

任何想法有什么问题,或者为什么我的单例 Player 类中会有多个 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

【问题讨论】:

  • 在掉线或低连接后尝试重新连接时可能会发生崩溃?
  • 在我们的 Crashlytics 应用中看到同样的问题,但尚未找到问题所在。这是我们最常见的 iOS 7 崩溃之一,对我们来说,97% 的用户都关注该应用。
  • 我们还看到了数千次使用相同日志的崩溃。由于我们的应用程序中没有任何电影播放器​​,因此当用户在应用程序内浏览器中观看电影时会发生这种情况。我们认为我们已经将问题追溯到在视频之前显示广告的视频(例如 DailyMotion),然后当它从广告播放器切换到实际播放器时发生崩溃。我们无法修复它,因为它不在我们的代码中。我认为这是一个 iOS7 错误。
  • @THM 你有运气吗?我面临同样的问题

标签: ios cocoa uikit avfoundation avplayer


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我将应用更新为仅在不缓冲时调用播放,但崩溃仍然出现,仍然无法重现自己。
    【解决方案3】:

    尝试在SourceType后面设置ContentURL

    moviePlayerController_ = [[MPMoviePlayerViewController alloc] init];
    moviePlayerController_.movieSourceType = MPMovieSourceTypeStreaming;
    [moviePlayerController_.moviePlayer setContentURL:url];
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        需要考虑的几件事:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多