web-dev-qa-db-fra.com

Comment lire une vidéo YouTube / Vimeo dans l'application sur iPhone

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:

en cliquant sur le bouton de lecture rouge, je peux voir la vidéo en plein écran dans QuickTime Player comme ceci:

enter image description hereenter image description here

Mais je veux montrer la vidéo dans le même cadre webView et non via le lecteur Quick Time. Il devrait jouer comme ceci:

enter image description here

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.

16
Avijit

enter image description hereenter image description here

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];
14
Segev

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

https://Gist.github.com/darkredz/5334409

http://maniacdev.com/2012/02/open-source-library-for-easily-playing-a-youtube-video-in-an-mpmovieplayer

7
Shivaay

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];

}
2
Anbu.Karthik

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.

2
channi

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.

2
Nour1991

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;
        }
    }
}
1
Luca Davanzo

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! :)

0
JaspreetKour

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 .

0
JonasChen

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&amp;loop=1\" width=\"1024\" height=\"768\" frameborder=\"0\" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>"];
[html appendString:@"</body></html>"];


[viewWeb loadHTMLString:html baseURL:urlMovie];
0