如何在 Apple tvOS 上播放 YouTube 视频?
YouTube 的嵌入功能适用于 iOS 9,因为操作系统有一个 UIWebView,我们可以将其嵌入其中。新的 tvOS 不包含 UIWebView,所以我看不到嵌入 YouTube 视频的方法。
如何在 Apple tvOS 上播放 YouTube 视频?
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];
请注意,YouTube的 TOS不允许这样做。使用它需要您自担风险。如果 YouTube 发现您没有遵守 TOS 或 YouTube 更改了它生成的嵌入代码,您的应用可能随时停止运行。
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()
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];
}
}];
可悲的是,即使是苹果员工也对此表示“否定”。来自有关该主题的 Apple 开发者论坛主题:
tvOS 上不支持 WebView,因此 iframe 实现将不起作用。TVML 不提供此功能。
经过一番尝试,我很高兴地宣布:
youtube://watch/video_id
将打开 YouTube 应用并播放 YouTube 视频。
享受。
作为 Daniel Storm 答案的补充,您还可以使用以下代码使用新的 TVML 语言实现此目的:
<lockup videoURL="http://mp4-url.mp4">
<img src="video thumbnail.jpg" />
</lockup>
(为此,您需要 Youtube TOS 也不允许的直接视频文件(mp4))
编辑,还找到了 .JS 解决方案: 如何在 Apple TV 的 tvOS 上播放视频?
我用了这个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)
}
}