48

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

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

4

7 回答 7

46

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 更改了它生成的嵌入代码,您的应用可能随时停止运行。

于 2015-09-12T10:25:13.490 回答
18

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()
于 2015-09-24T09:18:51.550 回答
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];
    }
}];

快速示例在这里。

于 2015-12-05T01:34:13.927 回答
5

可悲的是,即使是苹果员工也对此表示“否定”。来自有关该主题的 Apple 开发者论坛主题

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

于 2015-09-21T15:35:32.440 回答
4

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

youtube://watch/video_id

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

享受。

于 2020-07-07T04:41:05.053 回答
1

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

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

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

编辑,还找到了 .JS 解决方案: 如何在 Apple TV 的 tvOS 上播放视频?

于 2015-09-29T14:53:16.857 回答
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)
    }
}
于 2015-10-24T01:59:02.127 回答