Как играть на YouTube на tvOS

Как можно воспроизвести видеоролик YouTube на Apple tvOS?

Функция встраивания YouTube работает в iOS 9, поскольку ОС имеет интерфейс UIWebView, в который мы можем встроить его. Новый tvOS не включает UIWebView, поэтому я не вижу способа встраивать видео YouTube.

UIWebView и MPMoviePlayerController недоступны для tvOS. Наш следующий вариант – использовать AVPlayer для воспроизведения видео на YouTube.

AVPlayer не может воспроизводить видео YouTube со стандартного URL-адреса YouTube, т.е. https://www.youtube.com/watch?v=8To-6VIJZRE . Ему нужен прямой URL-адрес видеофайла. Используя HCYoutubeParser, мы можем выполнить именно это. Когда у нас есть URL-адрес, который нам нужен, мы можем воспроизвести его с помощью нашего AVPlayer :

 NSString *youTubeString = @"https://www.youtube.com/watch?v=8To-6VIJZRE"; NSDictionary *videos = [HCYoutubeParser h264videosWithYoutubeURL:[NSURL URLWithString:youTubeString]]; NSString *urlString = [NSString stringWithFormat:@"%@", [videos objectForKey:@"medium"]]; AVAsset *asset = [AVAsset assetWithURL:[NSURL URLWithString:urlString]]; AVPlayerItem *avPlayerItem = [[AVPlayerItem alloc]initWithAsset:asset]; AVPlayer *videoPlayer = [AVPlayer playerWithPlayerItem:avPlayerItem]; AVPlayerLayer *avPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:videoPlayer]; avPlayerLayer.frame = playerView.layer.bounds; [playerView.layer addSublayer:avPlayerLayer]; [videoPlayer play]; 

Обратите внимание, что это НЕ допускается в TOS YouTube . Используйте его на свой страх и риск . Ваше приложение может перестать работать в любой момент, если YouTube уведомляет вас о том, что вы не выполняете TOS, или если YouTube изменяет код встраивания, который он создает.

Swift 2.0 версия ответа Дэниела Сторма:

 let youTubeString : String = "https://www.youtube.com/watch?v=8To-6VIJZRE" let videos : NSDictionary = HCYoutubeParser.h264videosWithYoutubeURL(NSURL(string: youTubeString)) let urlString : String = videos["medium"] as! String let asset = AVAsset(URL: NSURL(string: urlString)!) let avPlayerItem = AVPlayerItem(asset:asset) let avPlayer = AVPlayer(playerItem: avPlayerItem) let avPlayerLayer = AVPlayerLayer(player: avPlayer) avPlayerLayer.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height); self.view.layer.addSublayer(avPlayerLayer) avPlayer.play() 

XCDYouTubeKit был популярным способом прямого воспроизведения видео на YouTube в iOS некоторое время, и разработчик недавно обновил его для поддержки нового AppleTV.

Вот код из примера Objective-C :

 AVPlayerViewController *playerViewController = [AVPlayerViewController new]; [self presentViewController:playerViewController animated:YES completion:nil]; __weak AVPlayerViewController *weakPlayerViewController = playerViewController; [[XCDYouTubeClient defaultClient] getVideoWithIdentifier:playlistItem.snippet.resourceId.videoId completionHandler:^(XCDYouTubeVideo * _Nullable video, NSError * _Nullable error) { if (video) { NSDictionary *streamURLs = video.streamURLs; NSURL *streamURL = streamURLs[XCDYouTubeVideoQualityHTTPLiveStreaming] ?: streamURLs[@(XCDYouTubeVideoQualityHD720)] ?: streamURLs[@(XCDYouTubeVideoQualityMedium360)] ?: streamURLs[@(XCDYouTubeVideoQualitySmall240)]; weakPlayerViewController.player = [AVPlayer playerWithURL:streamURL]; [weakPlayerViewController.player play]; } else { [self dismissViewControllerAnimated:YES completion:nil]; } }]; 

Быстро пример.

К сожалению, даже сотрудник Apple Staff повторил «негатив» по ​​этому поводу. Из раздела Форумы разработчиков Apple по теме :

Нет поддержки WebViews на tvOS, поэтому реализация iframe не будет работать. TVML не предлагает эту возможность.

В дополнение к ответу Даниэля Сторма вы также можете добиться этого с помощью нового языка TVML с помощью кода:

    

(для этого вам понадобится прямой видеофайл (mp4), который также не разрешен TOS Youtube)

EDIT, нашел также решение .JS: Как воспроизвести видео на tvOS для Apple TV?

Я использовал этот https://cocoapods.org/pods/youtube-parser

 Youtube.h264videosWithYoutubeURL(testURL) { (videoInfo, error) -> Void in if let videoURLString = videoInfo?["url"] as? String, videoTitle = videoInfo?["title"] as? String { print("\(videoTitle)") print("\(videoURLString)") self.playVideo(videoURLString) } } 
Давайте будем гением компьютера.