如何在tvOS上播放YouTube内容

如何在苹果电视上播放YouTubevideo?

YouTube的embeddedfunction可以在iOS 9中运行,因为操作系统有一个我们可以embedded的UIWebView。 新的tvOS不包括UIWebView,所以我不能看到embeddedYouTubevideo的方法。

UIWebViewMPMoviePlayerController不适用于tvOS。 我们的下一个select是使用AVPlayer播放YouTubevideo。

AVPlayer无法播放来自标准YouTubeurl的YouTubevideo,即。 https://www.youtube.com/watch?v=8To-6VIJZRE 。 它需要一个直接的URL到video文件。 使用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]; 

请注意, YouTube的服务条款不允许这样做。 使用它需要您自担风险 。 如果YouTube发现您没有遵循TOS,或者YouTube更改了其生成的embedded代码,则您的应用可能随时停止播放。

Daniel Storm的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() 

可悲的是,即使是苹果员工也对此表示了“否定”。 从苹果开发者论坛主题 :

tvOS上不支持WebViews,所以iframe实现将不起作用。 TVML不提供这种能力。

XCDYouTubeKit一直是在iOS上直接播放YouTubevideo的stream行方式,开发者最近更新了它,以支持新的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]; } }]; 

Swift的例子在这里。

作为Daniel Storm的答案的补充,您也可以使用以下代码实现新的TVML语言:

 <lockup videoURL="http://mp4-url.mp4"> <img src="video thumbnail.jpg" /> </lockup> 

(为了这个工作,你需要直接的video文件(MP4),这也是Youtube TOS不允许的)

编辑,也发现了.JS解决scheme: 如何播放苹果电视的tvOSvideo?

我用这个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) } }