如何在tvOS上播放YouTube内容

50

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

YouTube的嵌入功能在iOS 9中可以使用,因为该操作系统具有我们可以将其嵌入其中的UIWebView。但是,新的tvOS不包括UIWebView,所以我无法找到一种嵌入YouTube视频的方式。


你看过这个吗?https://dev59.com/aVwY5IYBdhLWcg3wj4Vr#32551565 只需将“launchPlayer”中的URL替换为你的YouTube URL。 - Alex Hedley
6
我猜我们需要来自谷歌的库才能做到这一点,而不违反服务条款。因此可能需要几个月时间来构建这个库(以及他们自己的YouTube tvOS应用程序,显然会先推出)。 - Nick
Plex能够通过其“稍后观看/Plex It”功能从其新的AppleTV应用程序播放YouTube和Vimeo视频。根据对他们的GitHub源代码的快速检查,似乎他们只是进行页面抓取。这是正确的吗?他们如何逃脱惩罚或者还没有人注意到? - Nick
@nickv2002 他们是如何逃脱惩罚的,还是没有人注意到? 不确定这是否完全违法,但这是不被赞同的。目前,如果您想播放YouTube/Vimeo内容,这是唯一的选择。 - Daniel Storm
@DanielStorm,我很惊讶这个方法能够奏效,因为他们已经在iOS应用商店上架了一段时间。但如果YouTube没有提供API,我们最好有这些解决方法。 - Nick
显示剩余2条评论
7个回答

46

UIWebViewMPMoviePlayerController 在tvOS上不可用。我们的下一个选择是使用 AVPlayer 播放YouTube视频。

AVPlayer 无法从标准的YouTube URL(如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的服务条款此举不允许的。使用需自行承担风险。如果YouTube注意到您没有遵守服务条款或更改了其生成的嵌入代码,您的应用程序随时可能停止工作。


2
HCYoutubeParser仍然得到支持吗?对我来说似乎不起作用。 - Shazam
1
@Shazam自GitHub上已经有超过2年没有更新了,因此可能存在一些问题。 - Daniel Storm
你知道有哪些可以在tvOS上运行的库吗?像GTLYouTube之类的? - Mayur Deshmukh
@MayurDeshmukh 目前还没有。所有的 iOS YouTube 播放器都使用 UIWebView,因此它们不适用于 tvOS。我预计 YouTube 会在某个时候为 tvOS 发布自己的库,就像他们为 iOS 做的一样 这里 - Daniel Storm
1
有人能指出这些库违反了YouTube文档的哪一部分吗? - Vitalii Boiarskyi
Youtube是如何禁止应用程序工作的?因为没有API密钥,可能是通过IP地址实现的吗? - WrightsCS

18

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

2
你是如何设置HCYoutubeParser以便导入到Swift中的?我尝试使用CocoaPods,但use_frameworks!会破坏我的现有Obj-C代码。 - Nick

8

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

{{链接1:这里有Swift示例。}}


如果您正在尝试从TVML/TVJS界面播放YT内容,这里有一个展示如何实现的Gist链接:https://gist.github.com/nickv2002/b7bb28cdccc000bdb910。 - Nick
这也会违反YouTube的服务条款,不是吗? - Tobonaut
2
是的,XCDYouTubeKit可以。另请参阅:关于使用XCDYouTubeKit的应用程序获得苹果批准的讨论 - Nick

5

可悲的是,即使一位苹果员工也对此表示了“否定”。从有关主题的Apple Developer论坛帖子中得知:

tvOS不支持WebViews,因此iframe实现无法使用。TVML没有提供这种功能。


4
经过一些尝试,我很高兴地宣布:
youtube://watch/video_id

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

享受吧。


谢谢!这可能是当前在tvOS上唯一可靠的解决方案。 - Ely
不幸的是,有人没有理解,因为我的答案(来自我的调查和测试)被鄙视了。很高兴它对你有帮助。 - Matteo Gobbi

1
作为对Daniel Storm答案的补充,您也可以使用新的TVML语言来实现此功能,代码如下:
<lockup videoURL="http://mp4-url.mp4">
<img src="video thumbnail.jpg" />
</lockup>

为了使这个工作起来,您需要直接视频文件(mp4),但这也是Youtube TOS不允许的。

编辑,还发现了.JS解决方案: 如何在Apple TV上播放视频?


0

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接