Как воспроизводить видео youtube/vimeo в приложении в iPhone

Я создаю приложение, в котором хочу играть видео с url, например Youtube, Vimeo, Direct url. Я делаю пользовательский плеер с помощью AVPlayer для воспроизведения видео с прямого URL файла видеоклипа (например, www.abc/play.mp4). Но позже я столкнулся с огромной проблемой для воспроизведения youtube и vimeo видео. И после многого поиска я нашел эту ссылку там, где она говорит, не используя UIWebview. Я не могу воспроизвести ссылку Youtube:

Воспроизвести видео на YouTube с помощью MPMoviePlayerController вместо UIWebView

Воспроизведение видео с YouTube без интерфейса UIWebView

Итак, я просто использовал этот код:

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

Теперь, когда я нажимаю на ссылку youtube/Vimeo video from tableview, вы воспроизводите видео с проигрывателем по умолчанию, то есть оператором Quicktime. Его не запускает видео в рамках самого кадра UIWebview. Но я хочу показать видео в первой половине экрана, то есть в моем кадре UIWebview. Возможно ли это?

В моем приложении я вижу это:

при нажатии на кнопку красного воспроизведения. Я вижу видео в полноэкранном режиме в QuickTime:

enter image description hereenter image description here

Но я хочу показать видео в одном и том же кадре webView не через быстрый проигрыватель времени. Он должен выглядеть следующим образом:

enter image description here

То же самое происходит в MusicTube и PlayTube.

Или есть ли другой способ добиться того же? Любая помощь будет оценена. Спасибо заранее.

Ответы

Ответ 1

enter image description hereenter image description here

Я использовал этот класс именно для этого.

Видео, которое вы видите внутри UIViewController, воспроизводится в текущем размере.

Это единственный код, который я использовал:

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

Ответ 2

Для игрока Vimeo вы можете проверить эту ссылку https://github.com/lilfaf/YTVimeoExtractor, он воспроизводит видео в реальном проигрывателе, и если вы хотите запустить видео в uiwebview, вот код для этого fooobar.com/questions/330569/....

Передайте URL-адрес YouTube видео в "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

Надеюсь, это поможет вам. Если это не поможет вам, ознакомьтесь с этими ссылками: -

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

Ответ 3

Если вы хотите воспроизвести youtube, здесь ссылка на youtube player проект на github, это действительно полезно. и да, можно воспроизвести его в своем uiwebview, просто дайте webview URL-адрес и скажите ему загрузить, он не должен открываться в проигрывателе по умолчанию, насколько я считаю, по крайней мере.

Ответ 4

Я не знаю о Vimeo, но для видео youtube вы можете использовать HCYouTubeParser, чтобы извлекать URL-адреса mp4 для видео YouTube, которые могут позже воспроизводиться на AVPlayer или MpMoviePlayerVC согласно требованиям.

Ответ 5

Я использовал youtube и vimeo в своем проекте, я разделяю свои кодировки для вас, и он очень надеется на вас.

на мой взгляд 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];

}

Ответ 6

Я определенно предлагаю youtube_ios_player_helper, "спонсируется 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;
        }
    }
}

Ответ 7

Используйте этот

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

Ответ 8

Я использовал следующий метод для успешного решения одной и той же проблемы.

Используйте youtube-ios-player-helper и добавьте код:

[_playerView loadWithVideoId:@"DmTzboEqfNk" playerVars:@{
                                                         @"playsinline" : @1
                                                         }];

Вы можете найти больше vars в Youtube > IFrame API.

Ответ 9

Я использовал 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))
}

Чтобы получить идентификатор видео по ссылкам YouTube/Vimeo, пожалуйста, обратитесь к:

Идентификатор видео с YouTube - Swift3

Regex для получения идентификатора видео Vimeo в Swift 2

Надеюсь поможет! :)