AVPlayer ничего не показывает

Пробую вставлять разные видео с youtube vimeo, dailymotion.

К сожалению, на данный момент ничего не отображается, кроме цвета фона моего 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 равна Null, и единственный журнал, который я всегда получаю из состояния, это: AVPlayerItemStatusUnknown. Любые идеи?

ИЗМЕНИТЬ 1:

ПЯ изменил мой код на:

@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];

К сожалению, единственное, что я вижу, это синий containerView :/

введите здесь описание изображения

Думаю проблема не в самом AVPlayer, а в кадрах и слое может быть....


person Davis    schedule 03.03.2014    source источник
comment
Убедитесь, что размер кадра AVPlayerLayer правильный.   -  person onmyway133    schedule 31.03.2015
comment
На самом деле, вы не можете воспроизвести youtube.com/ по этой ссылке через AVPlayer… Нужна прямая ссылка на видео...   -  person Che    schedule 13.10.2015


Ответы (3)


Вам нужно будет сделать следующее:

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];

Надеюсь это поможет.

Дополнение:

Это также зависит от вашего URL-адреса; если, как вы сказали, у вас есть такой, как в этом формате:

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

Тогда вы должны использовать это вместо этого:

[NSURL urlWithString:item.url]; 

Учитывая, что item — это ваш объект, а url — это свойство типа объекта NSString.

person Unheilig    schedule 03.03.2014
comment
Большое спасибо за ваш ответ, я редактирую свой ответ, к сожалению, он все еще не работает:/ - person Davis; 04.03.2014
comment
@Davis Пробовали ли вы затем изменить цвет фона и посмотреть, загрузился ли он идеально, или поэкспериментировать с номерами кадров и посмотреть, не отображается ли он каким-то образом за кадром? Вы бы хоть что-то выяснили/сузили проблему. Если это на самом деле проблема с рамой, то это было бы легко исправить, верно? - person Unheilig; 04.03.2014
comment
Я много пробовал с заменой кадров и прочим, но вроде все работает отлично. Поэтому я думаю, что единственной проблемой может быть URL-адрес ... я также пытался использовать другие видео на YouTube, но ничего не получалось .... - person Davis; 04.03.2014
comment
@ Дэвис, я полагал, ты пытался с urlWithString? Кстати, не могли бы вы показать item и url? Что мы могли бы попробовать дальше, так это попробовать добавить видео в ваш проект и воспроизвести его там, используя fileURLWithPath:, если это сработает, мы будем знать, что проигрыватель загружается нормально, и проблема будет сужена до - URL. - person Unheilig; 04.03.2014
comment
Пожалуйста, смотрите мою новую редакцию! Да, я использовал urlWithString, как видите. url - это NSString, так что это должно быть правильно! Я также удаляю item.url и записываю URL прямо в свой код, например: AVAsset *asset = [AVAsset assetsWithURL:[NSURL fileURLWithPath:@youtube.com/ ]]; - person Davis; 04.03.2014
comment
@Davis Конечно, это работает, но только с форматами, поддерживаемыми AVFoundation, и, конечно же, воспроизведение с uTube не работает, и для воспроизведения музыки с него нужно использовать API uTube. Но попробуйте с другой ссылкой, оканчивающейся на формат, например .mp3, она воспроизводится. Неудовлетворительный ответ, но, похоже, это реальность. Я сам запускал код, кстати. Надеюсь, что эта информация все же поможет. - person Unheilig; 04.03.2014
comment
Да, кажется, мне нужно использовать UIWebView для YouTube Vimeo и Co., спасибо за вашу помощь! - person Davis; 04.03.2014
comment
@ Дэвис, не могли бы вы, если фреймворк ‹MediaPlayer/MediaPlayer.h› помочь воспроизвести видео на YouTube? - person user2924482; 22.08.2015
comment
@Unheilig - та же проблема, я слышу звук, видео воспроизводится, но я не вижу видео, просто черное окно; Я пишу приложение для MacOS, используя Swift 4 Xcode 9. Вот общий код: let fileURL = URL(string: "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4") let avAsset = AVURLAsset(url: fileURL!, options: nil) let playerItem = AVPlayerItem(asset: avAsset) videoPlayer = AVPlayer(playerItem: playerItem) let playerView = self.playerView playerView?.player = videoPlayer videoPlayer.play() Есть идеи? - person Neal Davis; 11.11.2017
comment
Оказывается, я не мог заставить работать AVPlayer, потому что использовал URLWithString вместо fileURLWithPath ????‍♂️ Спасибо! - person cargath; 13.11.2018

Реализация AVPlayer, которая у меня работает:

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];

Чтобы получить миниатюру видео, попробуйте это

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];

Для остановки видео

[player pause];
player = nil;

**Установка скорости/скорости воспроизведения для видео**

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

Воспроизвести с начала

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

для проверки воспроизведения видео

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

}

Для поиска видео (на некоторое время вперед)

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

Используйте метод requestPlayerItemForVideo класса PHImageManager для получения AVPlayerItem; это самый простой и надежный способ играть с AVAsset, работая безупречно и стабильно.

Я использую его здесь:

https://youtu.be/7QlaO7WxjGg

person James Bush    schedule 04.08.2016