iOS 11:媒体播放器崩溃

时间:2017-08-08 16:09:26

标签: ios ios11

从iOS 11开始,我一直看到这次崩溃:

1 libdispatch.dylib _dispatch_sync_wait + 63192 
2 MediaToolbox videoQueueRemote_Invalidate + 5984376 
3 MediaToolbox videoQueueRemote_Invalidate + 5984376 
4 MediaToolbox videoQueueRemote_Finalize + 5984828  
5 CoreMedia FigBaseObjectFinalize + 47300  
6 CoreFoundation _CFRelease + 963176  
7 AVFoundation -[AVSampleBufferDisplayLayer dealloc] + 1467352  
8 QuartzCore CA::Transaction::commit() + 745496  
9 MediaToolbox FigLayerSynchronizerSynchronizeToMoment + 857340  
10 MediaToolbox videoQueueRemote_SynchronizeLayerToMoment + 5994476  
11 MediaToolbox figSyncMomentSource_sendMomentInternal + 852744  
12 libdispatch.dylib _dispatch_client_callout + 6404  
13 libdispatch.dylib _dispatch_queue_serial_drain$VARIANT$mp + 46184  
14 libdispatch.dylib _dispatch_queue_invoke$VARIANT$mp + 48632  
15 libdispatch.dylib _dispatch_root_queue_drain_deferred_wlh$VARIANT$mp + 51244  
16 libdispatch.dylib _dispatch_workloop_worker_thread$VARIANT$mp + 84560  
17 libsystem_pthread.dylib _pthread_wqthread + 4680

只是想了解这是我的应用程序的问题,还是这是Apple BETA问题。

注意:问题是间歇性的。

1 个答案:

答案 0 :(得分:1)

我不了解媒体播放器框架,但我猜您使用{ "authorizationSource": "RoleBased", "subscriptionPolicies": { "spendingLimit": "On", redacted (too long) 进行视频播放,因为documentation

  

要使用户能够播放包含MPMediaItem对象的视频,请使用   AVPlayer。您无法使用媒体播放器播放视频媒体项目   框架。

如果是这样,您可能会使用AVPlayer进行显示,这很可能会在内部使用AVPlayerLayer。这将是您的堆栈跟踪中的那个:

  

7 AVFoundation - [AVSampleBufferDisplayLayer dealloc] + 1467352

我遇到了同样的崩溃,并在直接使用AVSampleBufferDisplayLayer时在后台线程上看到了相同的堆栈跟踪。经过大量的调试和测试后,我发现将触及此层的所有代码移动到主线程都可以解决崩溃问题。 AVSampleBufferDisplayLayerviewWill...回调是设置的好地方:

viewDid...

使用var player : AVPlayer! var layer : AVPlayerLayer! // var layer : AVSampleBufferDisplayLayer! // in my case override func viewDidLoad() { super.viewDidLoad() self.layer = AVPlayerLayer(player: player) // self.layer = AVSampleBufferDisplayLayer() // in my case self.layer.frame = self.view.bounds self.view.layer.addSublayer(self.layer) } 时,enqueue(_ sampleBuffer: CMSampleBuffer)flush()flushAndRemoveImage()也是如此。

相关问题