同时在两个视图上显示AVPlayer内容

时间:2011-10-21 12:48:56

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

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

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

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

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

  

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

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

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

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

  

我有一个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];

这就是我得到的:

enter image description here

正如您所看到的,两个AVPlayerLayers在非常完美的同步中播放相同的AVPlayerItem

答案 2 :(得分:0)

Apple的文档现在说明:

  

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

link to docs

这确实在我的应用程序中也有效。