2013-04-25 24 views
12

tôi bị tai nạn ảnh hưởng đến khoảng 10% người dùng của mình, nhưng tôi không thể tái tạo và không biết chính xác khi điều này xảy ra.Sự cố trong - [AVPlayerItem _attachToPlayer:] Một AVPlayerItem không thể liên kết với nhiều trường hợp của AVPlayer

Báo cáo sự cố về một nửa số người dùng bị lỗi có Ứng dụng không được lấy nét, I.e. làm âm thanh nền hoặc AirPlay. Ứng dụng phát lại luồng video HLS và chuyển sang phiên bản chỉ có âm thanh khi được đặt nền.

Bất kỳ ý tưởng nào là sai hoặc tại sao có nhiều phiên bản AVPlayer từ lớp Trình phát Singleton của tôi?

Cảm ơn!

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

Có thể sự cố xảy ra khi cố gắng kết nối lại sau khi kết nối giảm hoặc kết nối thấp? – Winston

+0

Thấy cùng một vấn đề này trong ứng dụng của chúng tôi trong Crashlytics, chưa theo dõi vấn đề. Đây là một trong số 7 sự cố hàng đầu của chúng tôi và 97% người dùng đã tập trung vào ứng dụng. – ToddH

+0

Chúng tôi cũng thấy hàng nghìn sự cố với cùng một nhật ký. Vì chúng tôi không có bất kỳ trình phát phim nào trong ứng dụng của mình, điều đó xảy ra khi người dùng xem phim trong trình duyệt trong ứng dụng. Chúng tôi nghĩ rằng chúng tôi đã theo dõi sự cố xuống các video hiển thị quảng cáo trước video (ví dụ DailyMotion) và sau đó sự cố xảy ra khi nó chuyển từ trình phát quảng cáo sang trình phát thực tế. Chúng tôi đã không thể khắc phục nó vì nó không có trong mã của chúng tôi. Tôi nghĩ đó là lỗi iOS7. – Accatyyc

Trả lời

1

Tìm thấy nguyên nhân cho vấn đề này ... Nếu MovieViewController đã được tạo ra, và nó hiện đang đệm (nghĩa là nhà nước! = MPMovieLoadStatePlayable hoặc MPMovieLoadStatePlaythroughOK) gọi phương pháp 'chơi' sẽ sụp đổ các ứng dụng với ngoại lệ này.

+0

Tôi đã cập nhật ứng dụng để chỉ phát cuộc gọi khi không đệm, nhưng các sự cố vẫn tiếp diễn, vẫn không thể tự tái tạo. – THM

5

Dường như nó được giải quyết bằng cách dừng chơi một cách rõ ràng trước khi đặt URL mới, ví dụ:

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

Cố gắng thiết lập các contentURL sau SourceType

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

Nếu bạn không chắc chắn loại URL video mà bạn sẽ lấy thiết lập loại nguồn để xác định. Điều này sẽ làm việc cho tất cả các trường hợp.

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

Vài điều cần cân nhắc:

  1. Một proxy giữa mục chơi và người chơi sẽ cung cấp một phương tiện để kiểm soát quyền truy cập vào các mục chơi bởi các trường hợp của AVPlayer.

  2. Tham chiếu liên quan cho phép lưu trữ thuộc tính được thêm vào một lớp nhất định thông qua danh mục; vì vậy, bạn có thể tạo một danh mục cho lớp mục trình phát bao gồm một thuộc tính duy nhất được đặt bất cứ khi nào mục trình phát được gán cho AVPlayer (ví dụ như chuỗi mô tả). Để đảm bảo rằng mục trình phát không được gán cho người chơi khác, chỉ cần so sánh mô tả được lưu với AVPlayer với mục được trả về bởi người chơi đang được đề cập đến.