2017-08-08 294 views
1

开始与iOS 11,我已经看到了这个崩溃: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 

只是想知道这是否是我的应用程序的问题,或者如果这是苹果BETA问题。

注意:问题是间歇性的。

+0

在整个iOS 11版本中看到类似的崩溃。你有没有找到一个原因呢? – bjtitus

回答

0

我不知道媒体播放器框架,但我的猜测是您使用AVPlayer视频播放,因为documentation美国

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

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

7 AVFoundation - [AVSampleBufferDisplayLayer的dealloc] + 1467352

我得到了相同的崩溃,并看到了同样的堆栈跟踪在后台线程,而直接与工作AVSampleBufferDisplayLayer。经过大量的调试和测试后,我发现将触摸此层的所有代码移动到主线程中,从而消除了崩溃。该viewWill...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) 
} 

AVSampleBufferDisplayLayer工作时,这同样适用于enqueue(_ sampleBuffer: CMSampleBuffer)flush()flushAndRemoveImage()真。