【问题标题】:AVPlayer in iOS8 disappears when adding as a sublayer to second viewiOS8中的AVPlayer作为子层添加到第二个视图时消失
【发布时间】:2023-04-09 05:15:02
【问题描述】:

视图初始化并创建一切都很好,但是当我将 AVPlayer 从一个视图层移动到另一个视图层时,它消失了。视频消失(全屏视图为黑色,原始尺寸视图为白色),但音频仍在播放。我的控件仍然有效(播放/暂停/擦洗)。

我的应用程序是为 iOS7 构建的。在模拟器和设备上,这是可行的。在 iOS8 的模拟器中,这是可行的。这仅在 iOS8 设备上不起作用。

代码如下:

AVAsset *avAsset = [AVAsset assetWithURL:fileURL];
AVPlayerItem *avPlayerItem =[[AVPlayerItem alloc]initWithAsset:avAsset];
self.currentPlayer = [[AVPlayer alloc] initWithPlayerItem:avPlayerItem];
AVPlayerLayer *tmpPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:self.currentPlayer];
tmpPlayerLayer.frame = self.videoDetailViewPlayer.bounds;
[self.videoDetailViewPlayer.layer addSublayer:tmpPlayerLayer];

*fileURL 是一个格式正确的 NSURL,它使用针对每个操作系统测试的完全限定 URL 检索适当的对象。 **self.videoDetailViewPlayer.bounds 是全屏的,我已经检查以确保它确实有正确的 w & h。 (我已经尝试了 [tmpPlayer setFrame] 以及上面的当前设置,同时使用了框架和边界。在设备上除了 iOS8 之外的所有设备中,它都可以工作。

再次,音频继续,但视频似乎丢失了。

编辑:我不确定是什么导致播放器继续工作,但 AVPlayer 会继续播放音频,无论是否有视频层。我有 2 个视图,我正在交替播放器层,也许我应该将它添加到两者,但根据文档,“只有最近创建的播放器层才会真正在屏幕上显示视频内容。” (https://developer.apple.com/LIBRARY/ios/documentation/AVFoundation/Reference/AVPlayerLayer_Class/index.html)。如果我从原始视图创建 tmpPlayerLayer,将其添加到我的另一个视图,然后将第一个视图的图层设为 nil,它可以工作(但不会调整大小)。如果我尝试创建一个新的 AVPlayerLayer(如上所述),它会完全停止显示视频......仍在调查中,但任何指针都可能有所帮助。

【问题讨论】:

    标签: objective-c ios8 avplayer


    【解决方案1】:

    我发现不是为每个视图创建一个新的 AVPLayerLayer,而是为控制器创建一个 playerlayer,并在视图之间重用它,允许我在 UIViews(完整和正常)之间切换。我不知道为什么 iOS8 原生会破坏此功能,但这种解决方法意味着最后创建的 PlayerLayer 仍然显示视频,并且无论我将它添加到哪个视图,它都会在那里播放。

    【讨论】:

    • 我可以理解这个推理;似乎文档指向您的方向 - 每个AVPlayer 一层。只是一个想法,但是您是否可以重用UIView?我有一个类似的愿望,想要从框架动画到全屏 here
    • 我不认为文档将我指向那个方向。 “您可以使用相同的 AVPlayer 对象创建任意数量的播放器层。”之前的代码(在我的解决方案之前)在模拟器中工作,但在设备上没有,所以新 AVPlayerLayer 的创建似乎没有像它应该的那样显示视频。如果这可以在多个视图中重现,那么这可能是一个错误并且行为不符合预期
    • 文档说:“您可以从单个 AVPlayer 实例创建许多 AVPlayerLayer 对象,但只有最近创建的此类层才会在屏幕上显示任何视频内容。”然后继续指出使用两个AVPlayers 同时播放相同的资产。我读到这个是因为播放器层不是管理多视图播放的正确抽象级别。值得针对文档和 AVPlayer 提交错误并进行交叉引用。
    • 这是一个错误。将其发送给 Apple,他们关闭了我的,以支持已经存在的那个 (18301836)
    • @lordB8r 如何为多个视图重用 AVPlayerLayer?
    猜你喜欢
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    • 2011-01-05
    相关资源
    最近更新 更多