如何在tvOS上播放YouTube内容
如何在苹果电视上播放YouTubevideo?
YouTube的embeddedfunction可以在iOS 9中运行,因为操作系统有一个我们可以embedded的UIWebView。 新的tvOS不包括UIWebView,所以我不能看到embeddedYouTubevideo的方法。
UIWebView
和MPMoviePlayerController
不适用于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) } }