Je crée une application où je veux lire des vidéos à partir d'url comme Youtube, Vimeo, URL directe. Je crée un lecteur personnalisé en utilisant AVPlayer pour lire une vidéo à partir d'une URL directe de clip vidéo (comme www.abc/play.mp4). Mais plus tard, j'ai rencontré un énorme problème pour lire des vidéos YouTube et Vimeo. Et après avoir beaucoup cherché, j'ai trouvé ces liens là où il est dit sans utiliser UIWebview que je ne peux pas lire un lien Youtube:
Lire des vidéos YouTube avec MPMoviePlayerController au lieu de UIWebView
Lecture de vidéo à partir d'un lien YouTube sans UIWebView
Je viens donc d'utiliser ce 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]];
Maintenant, lorsque je clique sur le lien vidéo youtube/Vimeo de tableview, il lit la vidéo avec le lecteur par défaut, c'est-à-dire le lecteur quicktime. Il ne fait pas tourner la vidéo dans le cadre UIWebview lui-même. Mais je veux montrer la vidéo dans la 1ère moitié de l'écran, c'est-à-dire mon cadre UIWebview. Est-ce possible?
Dans mon application, je peux voir ceci:
Il en va de même pour MusicTube et PlayTube .
Ou existe-t-il un autre moyen d'y parvenir? Toute aide serait appréciée. Merci d'avance.
J'ai utilisé cette classe juste pour ça.
La vidéo que vous voyez à l'intérieur du UIViewController
est jouable dans sa taille actuelle.
C'est le seul code que j'ai utilisé:
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];
Pour le lecteur Vimeo, vous pouvez vérifier ce lien https://github.com/lilfaf/YTVimeoExtractor il lit la vidéo dans le lecteur réel et si vous souhaitez exécuter la vidéo dans uiwebview, voici le code pour cela https://stackoverflow.com/a/15918011/1865424 .
Passez l'URL de la vidéo YouTube dans "urlStr".
//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
Espérons que cela va vous aider. Si cela ne vous aide pas, veuillez consulter ces liens: -
http://blog.softwareispoetry.com/2010/03/how-to-play-youtube-videos-in-your.html
J'ai utilisé youtube et vimeo dans mon projet, je partage mes codages pour vous, il sera très optimiste pour vous
à mon avis 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];
}
Je ne connais pas le Vimeo mais pour les vidéos youtube, vous pouvez utiliser HCYouTubeParser pour récupérer les URL mp4 pour les vidéos youtube qui peuvent ensuite être lues sur AVPlayer ou MpMoviePlayerVC selon les exigences.
Si vous voulez jouer à YouTube, voici un lien vers le lecteur YouTube projet sur github, c'est vraiment utile. et oui, il est possible de le jouer dans votre uiwebview, donnez simplement l'url à la webview et dites-lui de la charger, elle ne devrait pas s'ouvrir dans le lecteur par défaut, autant que je pense au moins.
Je suggère définitivement youtube_ios_player_helper , "sponsorisé par" Google .
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;
}
}
}
J'ai utilisé WKWebView dans le storyboard avec des contraintes et du code ajouté:
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))
}
Pour obtenir videoId à partir des liens youtube/Vimeo, veuillez vous référer à:
Identifiant vidéo Youtube de l'URL - Swift
Regex pour obtenir l'identifiant vidéo vimeo dans Swift 2
L'espoir vous aidera! :)
J'ai utilisé la méthode suivante pour résoudre le même problème avec succès.
Utilisez youtube-ios-player-helper et ajoutez le code:
[_playerView loadWithVideoId:@"DmTzboEqfNk" playerVars:@{
@"playsinline" : @1
}];
Vous pouvez trouver plus de vars dans Youtube> API IFrame .
Utilisez ceci
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];