iOS 11:媒体播放器崩溃



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

1 libdispatch.dylib _dispatch_sync_wait + 63192 2 媒体工具箱 videoQueueRemote_Invalidate + 5984376 3 媒体工具箱 videoQueueRemote_Invalidate + 5984376 4 媒体工具箱 videoQueueRemote_Finalize + 5984828  5 核心媒体 FigBaseObjectFinalize + 47300  6 核心基金会 _CFRelease + 963176  7 AVFoundation -[AVSampleBufferDisplayLayer dealloc] + 1467352  8 石英核心 CA::事务::commit(( + 745496  9 媒体工具箱 图层同步器同步到时刻 + 857340  10 媒体工具箱 videoQueueRemote_SynchronizeLayerToMoment + 5994476  11 媒体工具箱 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 问题。

注意:该问题是间歇性的。

我不知道媒体播放器框架,但我的猜测是您使用AVPlayer进行视频播放,因为文档指出

要使用户能够播放包含 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)
}
使用enqueue(_ sampleBuffer: CMSampleBuffer)

flush()flushAndRemoveImage()时也是如此AVSampleBufferDisplayLayer.

最新更新