【问题标题】:Creating an AVPlayerLayer causes simulator to crash创建 AVPlayerLayer 会导致模拟器崩溃
【发布时间】:2017-03-17 23:26:54
【问题描述】:

我有一个在回调中返回 AVPlayer 和 AVSynchronisedLayer 的类。当我使用 AVPlayer 初始化 AVPlayerLayer 时,我遇到了崩溃(仅在模拟器中发生)。代码如下所示:

  self.projectPlayer = [[MYMobilePlayer alloc] init];
  [self.projectPlayer setDelegate:self]; 
  [self.projectPlayer returnPlayerForProjectScene:self.projectScene andCallback:^(NSError *error, AVPlayer *player, AVSynchronizedLayer *syncLayer) {


      self.syncLayer = syncLayer;
      AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player];
      NSLog(@"%@",playerLayer); // Also crashes if I assign to private member variable
      // More code that uses the playerLayer - not needed to illustrate the problem

  }];

回调中返回的对象是正确的,所以我认为我不需要显示创建和返回它们的代码。

堆栈跟踪如下所示(不是很有帮助)。

知道这里会发生什么吗?

【问题讨论】:

    标签: ios objective-c avplayer simulator


    【解决方案1】:

    UIKit 代码应始终在主线程上调用。您的 returnPlayerForProjectScene 回调正在其他一些视频处理线程上发生。将有问题的代码分派到主队列应该可以解决您的崩溃问题:

    [self.projectPlayer returnPlayerForProjectScene:self.projectScene andCallback:^(NSError *error, AVPlayer *player, AVSynchronizedLayer *syncLayer) {
    
        dispatch_async(dispatch_get_main_queue(), ^{
    
            self.syncLayer = syncLayer;
            AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player];
            NSLog(@"%@",playerLayer); // Also crashes if I assign to private member variable
            // More code that uses the playerLayer - not needed to illustrate the problem
    
        });
    }];
    

    【讨论】:

    • 感谢@Rhythmic Fistman 的回答。我试过了,不幸的是它没有解决。然而,它不是导致崩溃的 UI 工作 - 只需实例化 AVPlayerLayer 就足够了。
    • 啊太糟糕了,既然您在正确的线程上实例化 AVPlayerLayer,堆栈跟踪是否会发生变化?
    • 不,不幸的是堆栈跟踪是相同的。它发生在同一个线程(com.apple.coremedia.videoprocessor)
    猜你喜欢
    • 2015-04-17
    • 2014-02-20
    • 2011-07-24
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 2014-05-27
    相关资源
    最近更新 更多