ios 如何在 iPhone 的应用程序中播放 youtube/vimeo 视频
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/21088471/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to play youtube/vimeo video within the application in iPhone
提问by Avijit
I am building an application where I want to play video from url like Youtube, Vimeo, Direct url. I am making custom player using AVPlayer to play a video from a direct url of video clip(like www.abc/play.mp4). But later I faced a huge issue to play youtube & vimeo video. And after searching a lot I found these link where it says without using UIWebview I can't play a Youtube link:
我正在构建一个应用程序,我想在其中从 Youtube、Vimeo、Direct url 等 url 播放视频。我正在使用 AVPlayer 制作自定义播放器,以从视频剪辑的直接 url(如 www.abc/play.mp4)播放视频。但后来我在播放 youtube 和 vimeo 视频时遇到了一个大问题。在搜索了很多之后,我找到了这些链接,它说不使用 UIWebview 我不能播放 Youtube 链接:
Play YouTube videos with MPMoviePlayerController instead of UIWebView
使用 MPMoviePlayerController 而不是 UIWebView 播放 YouTube 视频
Playing video from youtube link without UIWebView
在没有 UIWebView 的情况下从 youtube 链接播放视频
So I just used this code:
所以我只是使用了这个代码:
NSString *youTubeVideoHTML = @"<html><head><style>body{margin:0;}</style></head> <body> <div id=\"player\"></div> <script> var tag = document.createElement('script'); tag.src = 'http://www.youtube.com/player_api'; var firstScriptTag = document.getElementsByTagName('script')[0]; firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); var player; function onYouTubePlayerAPIReady() { player = new YT.Player('player', { width:\'100%%\', height:'200px', videoId:\'%@\', events: { 'onReady': onPlayerReady } }); } function onPlayerReady(event) { event.target.playVideo(); } </script> </body> </html>";
NSString *html = [NSString stringWithFormat:youTubeVideoHTML, videoId];
self.embedded_player_view.mediaPlaybackRequiresUserAction = NO;
[self.embedded_player_view loadHTMLString:html baseURL:[[NSBundle mainBundle] resourceURL]];
Now when I click on youtube/Vimeo video link from tableview its playing the video with the default player i.e. quicktime player. Its not running the video within the UIWebview frame itself. But I want to show the video in the 1st half of the screen i.e my UIWebview frame. Is that possible?
现在,当我从 tableview 单击 youtube/Vimeo 视频链接时,它会使用默认播放器(即 quicktime 播放器)播放视频。它没有在 UIWebview 框架本身内运行视频。但我想在屏幕的第一半显示视频,即我的 UIWebview 框架。那可能吗?
In my app I can see this:
在我的应用程序中,我可以看到:
when clicking on red play button I can see the video in full screen in quicktime player like this:
单击红色播放按钮时,我可以在quicktime播放器中全屏观看视频,如下所示:
But I want to show the video within the same webView frame not via quick time player. It should play like this:
但我想在同一个 webView 框架内显示视频,而不是通过快速播放器。它应该像这样播放:
Same does in MusicTubeand PlayTube.
Or is there any other way to achieve the same? Any help will be appreciated. Thanks in advance.
或者有没有其他方法可以实现相同的目标?任何帮助将不胜感激。提前致谢。
回答by Segev
I've used this classjust for that.
我只是为此使用了这个类。
The video you see inside the UIViewController
is playable in its current size.
您在其中看到的视频UIViewController
可以以其当前大小播放。
That's the only code I've used:
这是我使用的唯一代码:
UIView *videoContainerView = [[UIView alloc]initWithFrame:CGRectMake(0, 50, 320, 200)];
[self.view addSubview:videoContainerView];
XCDYouTubeVideoPlayerViewController *videoPlayerViewController = [[XCDYouTubeVideoPlayerViewController alloc] initWithVideoIdentifier:@"_OBlgSz8sSM"];
[videoPlayerViewController presentInView:videoContainerView];
[videoPlayerViewController.moviePlayer play];
回答by Shivaay
For Vimeo player you can check this link https://github.com/lilfaf/YTVimeoExtractorit plays the video in real player and if you want to run the video in uiwebview,here is the code for that https://stackoverflow.com/a/15918011/1865424.
对于 Vimeo 播放器,您可以查看此链接https://github.com/lilfaf/YTVimeoExtractor它在真实播放器中播放视频,如果您想在 uiwebview 中运行视频,这里是该https://stackoverflow.com的代码/a/15918011/1865424。
Pass you URL of YouTube Video in “urlStr”.
在“urlStr”中传递您的 YouTube 视频 URL。
//In .h file
UIWebView *videoView;
// In .m file
videoView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 385)];
[self embedYouTube :urlStr frame:CGRectMake(0, 0, 320, 385)];
[self.view addSubview:videoView];
// methos to embed URL in HTML & load it to UIWebView
- (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];
}
Courtsey :- http://nanostuffs.com/Blog/?p=641
礼貌:- http://nanostuffs.com/Blog/?p=641
Hope This Will Help You Out. If this doesn't help you out please check out these links:-
希望这会帮助你。如果这对您没有帮助,请查看以下链接:-
http://blog.softwareispoetry.com/2010/03/how-to-play-youtube-videos-in-your.html
http://blog.softwareispoetry.com/2010/03/how-to-play-youtube-videos-in-your.html
https://gist.github.com/darkredz/5334409
回答by channi
I don't know about the Vimeo but for youtube videos you can use HCYouTubeParserto fetch mp4 urls for the youtube videos which can be later played on AVPlayer or MpMoviePlayerVC as per requirements.
我不知道 Vimeo,但对于 youtube 视频,您可以使用HCYouTubeParser获取 youtube 视频的 mp4 网址,这些网址稍后可以根据要求在 AVPlayer 或 MpMoviePlayerVC 上播放。
回答by Anbu.Karthik
I used youtube and vimeo in my Project, I share my codings for you it will very hopeful for you
我在我的项目中使用了 youtube 和 vimeo,我为你分享了我的编码,这对你很有希望
in my view controller.m
在我的视图中 controller.m
//Button action
- (IBAction)importAudioClip:(id)sender
{
flag = 0;
customActionSheet = [[UIActionSheet alloc]initWithTitle:@"Select Audio/Video from:" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"YouTube",@"Vimeo", nil];
[customActionSheet showInView:self.view];
}
#pragma ActionSheet Delegate Methods
-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
NSLog(@"CLiekc button is %i",buttonIndex);
if([actionSheet.title isEqualToString:@"Select Audio/Video from:"])
{
if (buttonIndex == 0)
{
videoStatus=0;
webView.hidden = NO;
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.youtube.com"]]];
NSLog(@"Taking from Youtube");
}
else if (buttonIndex == 1)
{
videoStatus=1;
UIAlertView *alertView=[[UIAlertView alloc]initWithTitle:@"Vimeo" message:@"Please enter Vimeo Username" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
alertView.tag=123;
alertView.alertViewStyle = UIAlertViewStylePlainTextInput;
[alertView show];
}
}
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (alertView.tag==123)
{
if (buttonIndex==1)
{
templateText=[[UITextField alloc]init];
templateText = [alertView textFieldAtIndex:0];
templateText.autocapitalizationType=UITextAutocapitalizationTypeWords;
templateText.delegate=self;
if ([templateText.text length]!=0)
{
NSString *str=[templateText.text capitalizedString];
NSLog(@"Str== %@",str);
[self getVimeoDetails:str];
}
}
}
}
-(void)getVimeoDetails:(NSString*)userName
{
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://vimeo.com/api/v2/%@/videos.json",userName]]];
[request setHTTPMethod:@"GET"];
NSError *err;
NSURLResponse *response;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];
NSString *resSrt = [[NSString alloc]initWithData:responseData encoding:NSASCIIStringEncoding];
NSLog(@"The value is==%@",resSrt);
vimeoDetailsArray =(NSArray*) [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&err];
NSLog(@"jsonObject== %i",[vimeoDetailsArray count]);
NSString *theReply = [[NSString alloc] initWithBytes:[responseData bytes] length:[responseData length] encoding: NSASCIIStringEncoding];
NSLog(@"the reply == %@",theReply);
if(response)
{
if (vimeoDetailsArray==NULL)
{
NSLog(@"its Null");
NSLog(@"null response== %@",response);
// UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"Alert!!!" message:[NSString stringWithFormat:@"%@",theReply] delegate:self
// cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
// [alert show];
// [self performSelector:@selector(showAlertMessage:theReply withTitle:@"Alert!!!") withObject:nil afterDelay:5];
vimeoVideoTable.hidden=YES;
[self showAlertMessage:[NSString stringWithFormat:@"%@",theReply] withTitle:@"Alert!!!"];
}
else
{
[self createTableView];
vimeoVideoTable.hidden=NO;
[vimeoVideoTable reloadData];
NSLog(@"got response== %@",response);
}
}
else
{
NSLog(@"faield to connect");
}
if ([responseData length] == 0 && err == nil)
{
NSLog(@"Nothing was downloaded.");
}
else if (err != nil){
if ([[err description] rangeOfString:@"The Internet connection appears to be offline"].location != NSNotFound)
{
NSLog(@"string does not contain ");
UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"Alert!!!" message:@"Please Check your Internet Connection" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alert show];
}
NSLog(@"Error = %@", err);
}
}
-(void)createTableView
{
if (vimeoVideoTable !=nil)
{
[vimeoVideoTable removeFromSuperview];
vimeoVideoTable=nil;
}
vimeoVideoTable=[[UITableView alloc]initWithFrame:CGRectMake(10, 20, 300, self.view.bounds.size.height-100)];
[vimeoVideoTable setDelegate:self];
[vimeoVideoTable setHidden:YES];
[vimeoVideoTable setDataSource:self];
[self.view addSubview:vimeoVideoTable];
//[vimeoVideoTable reloadData];
}
回答by Nour1991
If you wanna play youtube, here's a link to youtube player projecton github, It's really helpful. and yes it is possible to play it in your uiwebview, just give the webview the url and tell it to load, it shouldn't open in the default player, as far as i believe at least.
如果你想玩 youtube,这里有一个链接到github 上的youtube 播放器项目,它真的很有帮助。是的,可以在你的 uiwebview 中播放它,只需给 webview url 并告诉它加载,它不应该在默认播放器中打开,至少我相信。
回答by Luca Davanzo
I definitely suggest youtube_ios_player_helper, "sponsored by" Google.
我绝对建议youtube_ios_player_helper,“由”谷歌“赞助” 。
import youtube_ios_player_helper
class YTViewController: YTPlayerViewDelegate {
@IBOutlet weak var player: YTPlayerView!
// MARK: - Public properties -
var videoID = "k_okcNVZqqI"
// MARK: - View life cycle -
override func viewDidLoad() {
super.viewDidLoad()
self.player.delegate = self
}
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
self.load()
self.player.fadeOut()
}
/**
Play video with the relative youtube identifier.
*/
func load() {
Utils.showHUD(self.view)
let options = ["playsinline" : 1]
self.player.loadWithVideoId(self.videoID, playerVars: options)
}
/**
Stop video playing.
*/
func stop() {
}
// MARK: - YOUTUBE video player delegate -
func playerViewDidBecomeReady(playerView: YTPlayerView) {
self.player.playVideo()
}
func playerView(playerView: YTPlayerView, didChangeToState state: YTPlayerState) {
switch state {
case .Playing:
self.player.fadeIn(duration: 0.5)
Utils.hideHUD(self.view)
print("Started playback")
break;
case .Paused:
print("Paused playback")
break;
default:
break;
}
}
}
回答by JonasChen
I used the following method to solve the same problem successfully.
我使用以下方法成功解决了同样的问题。
Use youtube-ios-player-helperand add the code:
使用youtube-ios-player-helper并添加代码:
[_playerView loadWithVideoId:@"DmTzboEqfNk" playerVars:@{
@"playsinline" : @1
}];
You can find more vars in Youtube > IFrame API.
您可以在Youtube > IFrame API 中找到更多变量。
回答by JaspreetKour
I have used WKWebViewin storyboard with constraints and added code :
我在故事板中使用了WKWebView并带有约束并添加了代码:
func playVideo() {
if yourLink.lowercased().contains("youtu.be"){
getVideo(videoCode: yourVideoCode)
if let range = yourLink.range(of: "be/"){
let videoId = yourLink[range.upperBound...].trimmingCharacters(in: .whitespaces)
getVideo(videoCode: videoId)
}
} else if yourLink.lowercased().contains("youtube.com"){
if let range = yourLink.range(of: "?v="){
let videoId = yourLink[range.upperBound...].trimmingCharacters(in: .whitespaces)
getVideo(videoCode: videoId)
}
} else if yourLink.lowercased().contains("vimeo.com") {
let url: NSURL = NSURL(string: yourLink)
webKitView.contentMode = UIViewContentMode.scaleAspectFit
webKitView.load(URLRequest(url: url as URL))
}
}
func getVideo(videoCode: String) {
guard
let url = URL(string: "https://www.youtube.com/embed/\(videoCode)")
else { return }
webKitView.load(URLRequest(url: url))
}
To get videoId from youtube/Vimeo links, please refer to :
要从 youtube/Vimeo 链接获取 videoId,请参考:
Youtube Video Id from URL - Swift3
来自 URL 的 Youtube 视频 ID - Swift3
Regex to get vimeo video id in swift 2
正则表达式在 swift 2 中获取 vimeo 视频 ID
Hope will help! :)
希望会有所帮助!:)
回答by Prabhjot Singh Gogana
Use this
用这个
NSMutableString *html = [[NSMutableString alloc] initWithCapacity:1] ;
[html appendString:@"<html><head>"];
[html appendString:@"<style type=\"text/css\">"];
[html appendString:@"body {"];
[html appendString:@"background-color: transparent;"];
[html appendString:@"color: white;"];
[html appendString:@"}"];
[html appendString:@"</style>"];
[html appendString:@"</head><body style=\"margin:0\">"];
[html appendString:@"<iframe src=\"//player.vimeo.com/video/84403700?autoplay=1&loop=1\" width=\"1024\" height=\"768\" frameborder=\"0\" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>"];
[html appendString:@"</body></html>"];
[viewWeb loadHTMLString:html baseURL:urlMovie];