使用MPMoviePlayerController而不是UIWebView播放YouTube视频

89

我正在尝试使用MPMoviePlayerController播放一些YouTube视频,但是遇到了一些问题。我使用的代码非常简单,可以通过向initWithContentURL传递URL来播放.m4v视频。当我启动影片播放器时,播放器出现了,但大约20秒后就会消失。当我在模拟器中尝试时,我会收到一个警报视图,提示服务器配置不正确。是否需要在URL中传递参数以获取特定类型的Google视频资源?

NSURL *videoURL = [NSURL URLWithString:@"http://www.youtube.com/v/HGd9qAfpZio&hl=en_US&fs=1&"];
MPMoviePlayerController *moviePlayer;
moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:videoURL];

[moviePlayer play];

我尝试了以下的URL:

http://www.youtube.com/watch?v=HGd9qAfpZio

我还看到了参数&format=1,尝试将其添加到这两个字符串的末尾,但没有成功。


我找到了更多信息,但仍然无法正常工作。有人建议使用以下URL:http://www.youtube.com/get_video?video_id=ID&t=SIGNATURE&fmt=18我输入了我的视频ID,但不知道签名是什么?视频播放器仍然表现相同。它打开播放器,然后在10到20秒后关闭。 - jmurphy
8个回答

78
唯一在您自己的应用程序中播放YouTube视频的方法是创建一个带有来自YouTube的嵌入标签的UIWebView,作为UIWebView的内容。 UIWebView将检测到嵌入对象是YouTube链接,并且Web视图的内容将是视频的YouTube预览。当用户单击预览时,视频将显示在MPMoviePlayerController中。这是Muxecoid提供的链接(如何在应用程序中播放YouTube视频)所描述的技术,也是我所知道的唯一在应用程序中播放YouTube视频的方法。您仍然可以通过将YouTube URL传递给-[UIApplication openURL:] 来启动YouTube应用程序,但这会关闭您自己的应用程序,这通常是不可取的。
不幸的是,没有直接使用MPMoviePlayerController播放YouTube视频的方法,因为YouTube不公开视频文件的直接链接。

1
是的,这是在应用程序中播放YouTube视频的唯一方法。我花了2个小时寻找替代方案。而且质量也有点差。 - samvermette
7
这不是唯一的方法。你可以从Youtube获取mp4文件。我在我的AirPlayer Python项目中使用这种方法,它可以让你在AppleTV上播放Youtube视频。我会将此移植并用于我的当前iOS项目,并在准备好后在此发布代码。 - hellozimi
7
很遗憾,直接链接是被禁止的。在https://developers.google.com/youtube/terms中的第II/10节中规定:“您的API客户端不得[...]以YouTube未明示授权的YouTube播放器或其他视频播放器之外的任何方式访问任何YouTube音频视觉内容的任何部分;”。 - Lvsti
问题在于,如果您有一个仅支持竖屏的应用程序,那么视频也将只能以竖屏模式显示。 - sebrock
很好的回答!如果我们想禁用视频下载选项,以便第三方下载器应用程序不显示下载此视频的警报,该怎么办?是否可以流式传输视频并防止视频被下载/保存? - W.S
显示剩余6条评论

26
如果您正在使用的是 Code:
- (void)embedYouTube:(NSString*)url frame:(CGRect)frame {  
     NSString* embedHTML = @"\ 
        <html><head>\ 
     <style type=\"text/css\">\ 
     body {\ 
     background-color: transparent;\ 
     color: white;\ 
    }\ 
   </style>\ 
    </head><body style=\"margin:0\">\ 
       <embed id=\"yt\" src=\"%@\" type=\"application/x-shockwave-flash\" \ 
    width=\"%0.0f\" height=\"%0.0f\"></embed>\ 
       </body></html>";  
   NSString* html = [NSString stringWithFormat:embedHTML, url, frame.size.width, frame.size.height];  
   if(videoView == nil) {  
      videoView = [[UIWebView alloc] initWithFrame:frame];  
     [self.view addSubview:videoView];  
    }  
    [videoView loadHTMLString:html baseURL:nil];  
  }

来源:

请参考此链接

确保在设备上测试,而不是模拟器上。因为模拟器将始终显示带有蓝色框的问号(它没有QuickTime播放器)。


23

如我在评论中所写,我曾在一个项目中遇到过这个问题。我已经解决了这个问题并将代码上传到了Github上。

您可以在这里查看源代码并进行分支操作。

它基本上是获取YouTube网址并获取所有与iOS兼容的视频网址。

希望这对您有所帮助!
祝好


1
谢谢!顺便说一句,更新修复了最近YouTube变化的问题。 - Peter DeWeese
1
根据YouTube的服务条款,这是不允许的。如果您没有遵守服务条款,或者YouTube更改了其生成的嵌入代码,您的应用可能会在任何时候停止工作。请自行决定是否使用,承担风险。 - Mathew

12
我刚刚偶然发现了一个人可以将 YouTube 视频放置在 MPMoviePlayerController 中。现在好像是可能的。

LBYouTubeView


谢谢,它正常工作了,但是当我使用 [mpplayer stop]; 停止这个视频时,视频仍在运行。但我想要停止视频。 - Jaspreet Singh
这个 Github 链接是否也可以在后台播放音频? - Khalid Usman

2
要播放YouTube视频,您需要在将URL传递到MPMoviePlayer之前提取URL。您不能直接播放它。
我的Github仓库有一个演示实现。
请参见:

https://github.com/DpzAtMicRO/IOSYoutubePlayer

尝试一下,这可以使得能够直接在MPMoviePlayer中加载和播放Youtube视频,就像其他视频一样,这是一个相当不错的方法。
编辑:在将其用于您的项目之前,请确保仔细阅读Readme.md。

2
很遗憾,这违反了YouTube的服务条款。如果您这样做,只能期望您的应用程序在YouTube不知道您在做什么的情况下才能正常工作。 - Mathew
我之前也给YouTube API团队发过电子邮件,询问是否可以自己解析视频URL。这是我收到的回复中的一句话:“我们唯一支持的机制是iframe嵌入。除了为功能手机提供的低分辨率RTSP流之外,我们的ToS不支持原始流访问。” - Mathew
1
你已经说服我在点踩这一点上;我同意它应该是一个标记不正确的工具,而点赞足以显示哪些答案对于试图解决YouTube嵌入问题的人最相关。该死,显然StackOverflow锁定了我的点踩,除非你的答案被编辑,否则我无法删除它。 - Mathew
@Mathew 许多合法的iOS应用程序都在做这种事情(绕过YouTube的API),尽管它违反了您一直指出的ToS,但Google在许多情况下似乎并不介意,因为它可以让他们的产品触达更多的观众。 - rmp251
@Mathew 这很有趣。这是否意味着高度定制的视频播放器,如Swift Player和Epoch(由Deja.io开发)等使用YouTube内容的播放器,基本上将被关闭?我知道有官方的使用YT内容的方式(这是首选),但仍然具有限制性,并且不允许像使用原始视频那样进行自定义。 - rmp251
显示剩余2条评论

1

只需获取新嵌入代码的iframe src元素并调用即可。

[self.webView loadRequest:[NSURLRequest requestWithURL:self.url]];

0

0

在 iOS 应用程序中嵌入 YouTube 视频有一种官方方式,由 Google 提供。

通过 cocoapods 安装库:pod "youtube-ios-player-helper"

通过以下方式进行导入:#import “YTPlayerView.h” 使用 UIView 并将类设置为 YTPlayerView 或者通过编程的方式创建 YTPlayerView 对象。

加载视频:[self.playerView loadWithVideoId:@"M7lc1UVf-VE"];

还有可用的 playVideostopVideo 方法。欲了解更多信息,请访问 this Link


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