Отображение контента AVPlayer одновременно в двух видах - PullRequest
7 голосов
/ 21 октября 2011

Я создаю HTTP Live Streaming Client для Mac, который будет управлять воспроизведением видео на большом экране.Моя цель - иметь управляющий интерфейс на главном экране и полноэкранное видео на дополнительном экране.

Используя AVFoundation, я успешно смог открыть поток и управлять всеми его аспектами из своего управляющего интерфейсаи я сейчас пытаюсь скопировать видео на дополнительном экране.Это оказалось сложнее, чем я себе представлял ...

На экране управления у меня есть AVPlayerLayer, который отображает видео с AVPlayer.Моя цель состояла в том, чтобы создать еще один AVPlayerLayer и отправить ему один и тот же проигрыватель, чтобы оба проигрывателя одновременно воспроизводили одно и то же видео в двух разных видах.Однако это не работает.

Копая глубже, я нашел это в документах AVFoundation:

Вы можете создавать произвольное количество слоев игрока с одним и тем же объектом AVPlayer.Только последний созданный слой плеера будет отображать видео контент на экране.

Это на самом деле бесполезно для меня, потому что мне нужно, чтобы видео отображалось правильно в обоих видах.

Я могу создать новый экземпляр AVPlayerItem из того же AVAsset, затем создать новый AVPlayer и добавить его в новый AVPlayerLayer, чтобы показывать видео, но они больше не синхронизируются, потому что они два разных проигрывателясоздание двух разных аудиопотоков, воспроизводящих разные части одного и того же потока.

Есть ли у кого-нибудь предложения о том, как получить один и тот же контент AVPlayer в двух разных представлениях?Возможно, какой-то трюк с зеркалированием CALayer?

Ответы [ 3 ]

3 голосов
/ 25 ноября 2012

AVSyncronizedLayer может помочь. Я использую его по-разному (для синхронизации двух разных объектов мультимедиа, а не одного и того же), но в принципе должна быть возможность загрузить один и тот же элемент дважды, а затем использовать слой AvSyncronized для их синхронизации.

1 голос
/ 01 марта 2018

Я вижу, что эта тема очень устарела, но я думаю, что она все еще будет полезна. Вы написали, что

У меня есть 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 в отличной синхронизации

0 голосов
/ 23 апреля 2019

Документы Apple теперь утверждают:

Вы можете создавать произвольное количество слоев проигрывателя с одним и тем же объектом AVPlayer, но вам следует ограничить количество создаваемых слоев, чтобы не влиять на производительность воспроизведения.

ссылка на документы

Это действительно работает и в моем приложении.

...