【问题标题】:Displaying AVPlayer content on two views simultaneously同时在两个视图上显示 AVPlayer 内容
【发布时间】:2011-12-12 13:43:34
【问题描述】:

我正在为 Mac 创建一个 HTTP Live Streaming Client,它将控制大屏幕上的视频播放。我的目标是在主屏幕上有一个控制 UI,在辅助屏幕上有一个全屏视频。

使用 AVFoundation,我已经成功地能够打开流并从我的控制 UI 控制它的所有方面,我现在正尝试在辅助屏幕上复制视频。事实证明这比我想象的要困难......

在控制屏幕上,我有一个 AVPlayerLayer,它显示来自 AVPlayer 的视频内容。我的目标是创建另一个 AVPlayerLayer,并将其发送到相同的播放器,以便两个播放器在两个不同的视图中同时播放相同的视频。但是,这不起作用。

深入挖掘,我在 AVFoundation 文档中发现了这一点:

您可以使用相同的 AVPlayer 对象创建任意数量的播放器层。只有最近创建的播放器层才会真正在屏幕上显示视频内容。

这对我来说实际上没用,因为我需要在两个视图中正确显示视频。

我可以从同一个 AVAsset 创建一个新的 AVPlayerItem 实例,然后创建一个新的 AVPlayer 并将其添加到一个新的 AVPlayerLayer 并显示视频,但它们不再同步,因为它们是两个不同的播放器,生成两个不同的音频流播放同一流的不同部分。

有人对如何将相同的 AVPlayer 内容放入两个不同的视图有任何建议吗?也许是某种 CALayer 镜像技巧?

【问题讨论】:

  • 也许将您的问题范围缩小到镜像 CALayer 将有助于获得答案。两种方法我都不知道。
  • 你解决过这个问题吗?

标签: calayer avfoundation nsview avplayer http-live-streaming


【解决方案1】:

Apple 的文档现在声明:

您可以使用相同的 AVPlayer 对象创建任意数量的播放器层,但您应该限制创建的层数以避免影响播放性能。

link to docs

这确实也适用于我的应用程序。

【讨论】:

    【解决方案2】:

    我看到这个话题已经很老了,但我认为它仍然会有所帮助。你写的

    我有一个 AVPlayerLayer,它显示来自 AVPlayer 的视频内容。我的目标是创建另一个 AVPlayerLayer,并将其发送到相同的播放器,以便两个播放器在两个不同的视图中同时播放相同的视频。但是,这不起作用。

    但是,它正在工作。我刚刚在我的项目中尝试过。这是我的层初始化代码:

    AVPlayerLayer *playerLayer = [AVPlayerLayer new];
        [playerLayer setPlayer:_testPlayer];
    
        playerLayer.frame = CGRectMake(0, 0, _videoView.frame.size.width, _videoView.frame.size.height);
        playerLayer.contentsGravity = kCAGravityResizeAspect;
        playerLayer.videoGravity = AVLayerVideoGravityResizeAspect;
    
        _defaultTransform = playerLayer.affineTransform;
    
        [_videoView.layer insertSublayer:playerLayer atIndex:0];
    
        AVPlayerLayer *testLayer_1 = [AVPlayerLayer playerLayerWithPlayer:_testPlayer];
        testLayer_1.frame = CGRectMake(100, 100, 200, 200);
        testLayer_1.contentsGravity = kCAGravityResizeAspect;
        testLayer_1.videoGravity = AVLayerVideoGravityResizeAspect;
    
        [_videoView.layer insertSublayer:testLayer_1 atIndex:1];
    

    这就是我得到的:

    如您所见,有两个 AVPlayerLayer 以非常完美的同步播放同一个 AVPlayerItem

    【讨论】:

      【解决方案3】:

      AVSyncronizedLayer 可能会有所帮助。我以不同的方式使用它(同步两个 不同 媒体对象而不是同一个),但原则上应该可以加载相同的项目两次,然后使用 AvSyncronized 层来保持它们同步。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-04
        • 2016-01-30
        • 2014-04-04
        • 1970-01-01
        • 1970-01-01
        • 2012-01-21
        相关资源
        最近更新 更多