Davis Davis - 4 months ago 55
Objective-C Question

AVPlayer doesn't show anything

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....

Answer

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.