Search code examples
iosobjective-cavplayer

Load two AVPlayers with one video


I have two different views that are meant to play the same video, I am creating an app that will switch several times between the two views while the video is running.

I currently load the first view with the video as follows:

NSURL *url = [NSURL URLWithString:@"http://[URL TO VIDEO HERE]"];
AVURLAsset *avasset = [[AVURLAsset alloc] initWithURL:url options:nil];

AVPlayerItem *item = [[AVPlayerItem alloc] initWithAsset:avasset];
player = [[AVPlayer alloc] initWithPlayerItem:item];

playerLayer = [[AVPlayerLayer playerLayerWithPlayer:player] retain];
CGSize size = self.bounds.size;
float x = size.width/2.0-202.0;
float y = size.height/2.0 - 100;

//[player play];
playerLayer.frame = CGRectMake(x, y, 404, 200);
playerLayer.backgroundColor = [UIColor blackColor].CGColor;

[self.layer addSublayer:playerLayer];
NSString *tracksKey = @"tracks";

[avasset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:tracksKey] completionHandler:
 ^{
     dispatch_async(dispatch_get_main_queue(),
                    ^{
                        NSError *error = nil;
                        AVKeyValueStatus status = [avasset statusOfValueForKey:tracksKey error:&error];

                        if (status == AVKeyValueStatusLoaded) {

                            //videoInitialized = YES;
                            [player play];
                        }
                        else {
                            // You should deal with the error appropriately.
                            NSLog(@"The asset's tracks were not loaded:\n%@", [error localizedDescription]);
                        }
                    });
 }];

In my second view I want to load the video from the dispatch_get_main_queue so that the video in both views are in sync.

I was hoping someone could help me out with loading the data of the video from the first view into the second view.


Solution

  • It is very simple:

    Init the first player:

    AVAsset *asset = [AVAsset assetWithURL:URL];
    AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset];
    AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem];
    AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player];
    

    And the second player in the same way, BUT, use the same asset from the first one. I have verified, it works.

    There is all the info you need on the Apple page: https://developer.apple.com/library/mac/documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/02_Playback.html

    This abstraction means that you can play a given asset using different players simultaneously

    this quote is from this page.