Question

I try to embed different videos from youtube vimeo, dailymotion.

Sadly at the Moment nothing is shown except the backgroundcolor of my containerView:

UIView *containerView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0, 320.0f, 200.0f)];

//item.url is my url which i get fro my webserver, it looks like http://www.youtube.com/watch?v=zPP6lXaL7KA&feature=youtube_gdata_player

            AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:[NSURL fileURLWithPath:item.url]];

            AVPlayer *avPlayer = [AVPlayer playerWithPlayerItem:playerItem];

            NSLog(@"%@",playerItem);

            AVPlayerLayer *avPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:avPlayer];

            avPlayerLayer.frame = self.frame;
            [containerView.layer addSublayer:avPlayerLayer];
            [self addSubview:containerView];
            [avPlayer play];

            if (avPlayer.status == AVPlayerStatusReadyToPlay) {
                //[playingLbl setText:@"Playing Audio"];
                NSLog(@"It works");

            } else if (avPlayer.status == AVPlayerStatusFailed) {
                // something went wrong. player.error should contain some information
                NSLog(@"Not works");
                NSLog(@"%@",avPlayer.error);             
            }
            else if (avPlayer.status == AVPlayerItemStatusUnknown) {
                NSLog(@"AVPlayer Unknown");
            }

            containerView.backgroundColor = [UIColor blueColor];
            NSLog(@"error: %@", avPlayer.error);
            NSLog(@"AVPlayer: %@", avPlayer);

AVPlayer Error is Null and the only Log i always get from the Status is: AVPlayerItemStatusUnknown. Any ideas?

EDIT 1:

Ich changed my Code to:

@implementation VideoView

BlockVideo *list;

- (id)initWithBlock:(GFBlock *)block {
    self = [super initWithBlock:block];

if (self) {

    if (block.values && block.values.count) {
        list = (GFBlockVideo *) [block.values objectAtIndex:0];

        for (int i=0; i<list.videos.count; ++i) {

            GFBlockVideoItem *item = list.videos[i];
            UIView *containerView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0, 320.0f, 200.0f)];


//Like i said item.url = http://www.youtube.com/watch?v=zPP6lXaL7KA&feature=youtube_gdata_player
//@property (nonatomic, strong) NSString* url;

             AVAsset *asset = [AVAsset assetWithURL:[NSURL URLWithString:item.url]];
             AVPlayerItem *playerItem = [[AVPlayerItem alloc] initWithAsset:asset];
             AVPlayer *avPlayer = [AVPlayer playerWithPlayerItem:playerItem];
             AVPlayerLayer *avPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:avPlayer];

             avPlayerLayer.frame = containerView.frame;
            [containerView.layer addSublayer:avPlayerLayer];
            [self addSubview:containerView];
            [avPlayer play];

             containerView.backgroundColor = [UIColor blueColor];

Sadly the only thing i can see is the blue containerView :/

enter image description here

I think the Problem is not the AVPlayer himself, but the frames and the layer maybe....

Was it helpful?

Solution

You'd have to do the following:

AVAsset *asset = [AVAsset assetWithURL:[NSURL fileURLWithPath:item.url]];
AVPlayerItem *playerItem = [[AVPlayerItem alloc] initWithAsset:asset];
AVPlayer *avPlayer = [AVPlayer playerWithPlayerItem:playerItem];
AVPlayerLayer *avPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:avPlayer];

avPlayerLayer.frame = self.frame;
[containerView.layer addSublayer:avPlayerLayer];
[self addSubview:containerView];
[avPlayer play];

Hope this helps.

Addendum:

It also depends on your URL; if as you said, you have one such as in this format:

http://www.youtube.com/watch?v=zPP6lXaL7KA&feature=youtube_gdata_player

Then you should use this instead:

[NSURL urlWithString:item.url]; 

Given that item is your object and url is a property there of object type NSString.

OTHER TIPS

AVPlayer Implementation which working for me:

MP4:

player = [AVPlayer playerWithURL:videoPathUrl];
AVcontroller = [[AVPlayerViewController alloc] init];
[AVcontroller.view setFrame:CGRectMake(0, 0,self.view.frame.size.width, self.view.frame.size.width)];
AVcontroller.player = player;
AVcontroller.showsPlaybackControls = FALSE;
[self addChildViewController:AVcontroller];
[self.view addSubview:AVcontroller.view];
[player play];

MP3 :

 playerItem = [AVPlayerItem playerItemWithURL:url];
    player = [AVPlayer playerWithPlayerItem:playerItem];
    player = [AVPlayer playerWithURL:url];
    [player play];

For getting thumbnail form video try this

AVAsset *asset = [AVAsset assetWithURL:videoPathUrl];
 AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc]initWithAsset:asset];
float tempTime = CMTimeGetSeconds(player.currentItem.duration);
CMTime time = CMTimeMake(tempTime, 1);  // (1,1)
CGImageRef imageRef = [imageGenerator copyCGImageAtTime:time actualTime:NULL error:NULL];
UIImage *aThumbnail = [UIImage imageWithCGImage:imageRef];

For Stop Video

[player pause];
player = nil;

**Setting Play rate/Speed for video **

[player play];
[player setRate:currentRate];

Play From start

[player seekToTime:kCMTimeZero];
 [player play];

for checking video is playing or not

 if ((player.rate != 0) && (player.error == nil)) {
// playing

}

For seeking video (for some duration ahead)

float tempSeekTime = CMTimeGetSeconds(player.currentItem.duration) + 10;
CMTime targetTime = CMTimeMakeWithSeconds(tempSeekTime, NSEC_PER_SEC);
[player seekToTime:targetTime];

Use the requestPlayerItemForVideo method of PHImageManager to acquire an AVPlayerItem; it is the simplest, sure-fire way to play an AVAsset, performing flawlessly and consistently.

I use it here:

https://youtu.be/7QlaO7WxjGg

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top