13

我遇到了一个影响大约 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
4

5 回答 5

5

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

[moviePlayer stop];
moviePlayer.movieSourceType = MPMovieSourceTypeStreaming;
[moviePlayer setContentURL:[NSURL URLWithString:[videos objectForKey:quality]]];
于 2013-11-30T10:19:10.083 回答
1

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

于 2013-05-22T09:29:12.773 回答
1

尝试在 SourceType 之后设置 ContentURL

moviePlayerController_ = [[MPMoviePlayerViewController alloc] init];
moviePlayerController_.movieSourceType = MPMovieSourceTypeStreaming;
[moviePlayerController_.moviePlayer setContentURL:url];
于 2015-05-25T15:39:51.883 回答
0

需要考虑的几件事:

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

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

于 2016-10-30T00:25:12.560 回答
0

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

moviePlayerController = [[MPMoviePlayerViewController alloc] init];
moviePlayerController.movieSourceType = MPMovieSourceTypeUnknown;
[moviePlayerController.moviePlayer setContentURL:url];
于 2016-02-18T05:04:11.960 回答