如何在 tvOS 上播放 YouTube 内容

Posted

技术标签:

【中文标题】如何在 tvOS 上播放 YouTube 内容【英文标题】:How to play YouTube content on tvOS 【发布时间】:2015-12-08 07:39:50 【问题描述】:

如何在 Apple tvOS 上播放 YouTube 视频?

YouTube 的嵌入功能在 ios 9 中有效,因为操作系统有一个 UIWebView,我们可以将其嵌入其中。 新的 tvOS 不包含 UIWebView,因此我看不到嵌入 YouTube 视频的方法。

【问题讨论】:

你看到了吗? ***.com/questions/32493872/… 只需将“launchPlayer”中的 url 换成你的 YouTube url。 我猜我们需要一个来自 Google 的库才能在不违反服务条款的情况下做到这一点。因此,他们可能需要几个月的时间来构建它(连同他们自己的 YouTube tvOS 应用程序,显然会首先出现)。 Plex 可以通过他们的Watch Later / Plex It feature 播放来自他们新的AppleTV App 的 YouTube 和 Vimeo 视频。根据他们的一些GitHub souce 的快速戳,看来他们只是在进行页面抓取。那是对的吗?他们是如何逃脱惩罚或没有人注意到的? @nickv2002 他们如何逃脱或没有人注意到? 不确定这是否完全非法,但它不赞成。目前,如果您想播放 YouTube/Vimeo 内容,这是唯一的选择。 @DanielStorm 我很惊讶这能奏效,因为它已经在 iOS 应用商店上架了一段时间。如果 YouTube 不提供 API,我们最好有这些解决方法。 【参考方案1】:

经过一番尝试,我很高兴地宣布:

youtube://watch/video_id

将打开 YouTube 应用并播放 YouTube 视频。

享受吧。

【讨论】:

谢谢!这可能是目前 tvOS 上唯一可靠的解决方案。 不幸的是,有人不理解它,因为我的回答(来自我的调查和测试)-1 我的回答。很高兴它对您有所帮助。【参考方案2】:

UIWebViewMPMoviePlayerController 不适用于 tvOS。我们的下一个选项是使用 AVPlayer 播放 YouTube 视频。

AVPlayer 无法播放来自标准 YouTube 网址的 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];

请注意,YouTube's TOS 下不允许这样做。 风险自负。如果 YouTube 发现您未遵守 TOS 或 YouTube 更改了它生成的嵌入代码,您的应用可能随时停止运行。

【讨论】:

HCYoutubeParser 是否仍受支持?似乎对我不起作用 @Shazam 在 GitHub 上已超过 2 年没有更新,因此可能存在一些问题。 知道任何可以在 tvOS 上运行的库吗?比如 GTLYouTube 之类的? @MayurDeshmukh 目前,没有。所有 iOS YouTube 播放器都使用 UIWebView,因此它们不适用于 tvOS。我预计 YouTube 会在某个时候发布它自己的 tvOS 库,就像他们为 iOS here 所做的那样。 谁能指出这个库违反的部分 YouTube 文档?【参考方案3】:

Swift 2.0 版 Daniel Storm 的回答:

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()

【讨论】:

你是如何设置 HCYoutubeParser 来导入 Swift 的?尝试使用 CocoaPods,但 use_frameworks! 的东西破坏了我现有的 Obj-C 代码。【参考方案4】:

XCDYouTubeKit 一直是在 iOS 上直接播放 YouTube 视频的流行方式,开发者最近对其进行了更新以支持新的 AppleTV。

这是来自Objective-C example的代码:

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

【讨论】:

如果您尝试从 TVML/TVJS 界面播放 YT 内容,这里是a Gist that shows how。 这也违反了 youtube TOS,不是吗? 是的,XCDYouTubeKit 可以。另见:Discussion of Apple approval for apps using XCDYouTubeKit【参考方案5】:

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

【讨论】:

【参考方案6】:

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

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

(为此,您需要 Youtube TOS 也不允许的直接视频文件 (mp4))

编辑,还找到了 .JS 解决方案: How do I play a video on tvOS for Apple TV?

【讨论】:

【参考方案7】:

可悲的是,即使是 Apple 员工也对此表示“否定”。来自Apple Developer Forums thread on the topic:

tvOS 上不支持 WebView,因此 iframe 实现将不起作用。 TVML 不提供此功能。

【讨论】:

以上是关于如何在 tvOS 上播放 YouTube 内容的主要内容,如果未能解决你的问题,请参考以下文章

如何在 YouTube 缩略图上叠加播放按钮

我们如何使用 tapGesture 在 Tvos 中播放视频

如何在 Apple TV (TvOS) 中全屏播放视频

视频播放结束后如何返回 tvOS 中的 Main.storyboard?

youtube 如何在 Safari 上自动播放带音频的视频?

youtube.com 上的视频如何在 iOS 上自动播放