2012-05-02 138 views
2

如何在iPhone上的MPMoviePlayerController中播放YouTube视频,同时避免进入全屏模式?MPMoviePlayerController播放YouTube视频

这里提出了这个问题:MPMoviePlayerController is playing YouTube video?和这里:Play Youtube video in MPMoviePlayerController or play RTSP - 3GP link与答案声称这种功能是不可能的。

然而,这个应用程序,Deja,正是我想要的功能:一个无缝的MPMoviePlayerController,其框架我有明确的控制。 http://itunes.apple.com/app/deja/id417625158

这是如何完成的!?

+0

检查此链接为一个工作示范:: https://github.com/DpzAtMicRO/IOSYoutubePlayer –

回答

0

试试这个代码:

NSString *urlStr=[Your url is here]; 
NSURL *url = [NSURL fileURLWithPath:urlStr]; 
MPMoviePlayerController* moviePlayer = [[MPMoviePlayerController alloc]initWithContentURL:url]; 
[self.view addSubview:moviePlayer.view]; 
moviePlayer.view.frame = CGRectMake(set frame is here); 
[moviePlayer play]; 

[moviePlayer setFullscreen:NO animated:YES]; 


[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(moviePlayBackDidFinish) 
              name:MPMoviePlayerPlaybackDidFinishNotification 
              object:nil]; 
+0

它不是为我工作 的NSString * urlStr = @“https://开头www.youtube.com/watch?v=ffHyA6JX4-0" ; NSURL * url = [NSURL fileURLWithPath:urlStr]; MPMoviePlayerController * moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:url]; [self.view addSubview:moviePlayer.view]; moviePlayer.view.frame = myframe; [moviePlayer play]; [moviePlayer setFullscreen:NO animated:YES]; 它的任何变化PLZ修改谢谢你 –

1

MPMoviePlayerController不支持YouTube的SWF(闪光灯)视频,期间播放。

您提及的应用程序实际上会播放逐步下载的MP4格式的文件,YouTube也提供其中一些内容。这实际上违反了Apple的准则,因为它会(并且确实)超过每个应用程序每个时间帧的最大渐进下载量。我很惊讶它通过了iTunes的批准。

警告:提交在App Store中分发的iOS应用程序必须符合这些要求 。如果您的应用通过 蜂窝网络传输视频,并且视频超过10分钟的持续时间或在5分钟内超过5 MB的数据,则需要使用HTTP 直播流。 (渐进式下载可用于较小的剪辑。)

如果你的应用在蜂窝网络上使用HTTP实时流,你需要 以64 Kbps或更低的带宽 (低带宽数据流提供至少一个流可是仅音频或音频与仍然 图像)。

这些要求适用于提交用于在Apple产品上使用的 App Store中分发的iOS应用程序。苹果可能会拒绝或删除不符合规范的应用程序。

因此,您的任务归结为如何获取通过YouTube提供的视频的MP4网址的问题。这部分真的很棘手,很好的解决了Deja。只需使用数据包嗅探器,您将看到它实际上创建了一个为MPMoviePlayerController提供数据的本地服务器。

0

使用UIWebView。在YouTube上复制HtML代码视频。

UIWevView* movie = [UIWebView alloc] initWithFrame:CGRectMake(0,0,320,460)]; 

NSString* urlString = @"past HTML code"; 
[self.webView loadHTMLString:urlString baseURL:nil]; 

[self.view addSubview:movie]; 
0

我想这是对YouTube服务,但你可以在这里使用此代码:

https://github.com/larcus94/LBYouTubeView

它是使用简单,就像一个魅力!

+0

它是反对Youtube ToS? 我可以在没有苹果拒绝的情况下使用它吗? – Atrash

2

到你的项目 实例化YoutubeStreamPathExtractorTest

调用测试YoutubeStreamPathExtractorTest实例方法添加此样本。 跟踪日志和快乐

#import "AFHTTPRequestOperationManager.h" 
#import <MediaPlayer/MediaPlayer.h> 

typedef void (^CallbackBlock)(NSArray* result, NSError* error); 
static NSString* const kYouTubeStreamPathPattern = @"\\\"url_encoded_fmt_stream_map\\\\\":.*?url=(.*?)\\\\u0026"; 

@interface YoutubeStreamPathExtractorTest : NSObject 
- (void)test; 
- (void)youtubeURLPath:(NSString*)youtubeURLPath extractStreamURLPathsWithCallback:(CallbackBlock)callback; 
@end 

@implementation YoutubeStreamPathExtractorTest 

- (void) test { 
    NSString* path = @"http://www.youtube.com/watch?v=TEV5DZpAXSw"; 
    [self youtubeURLPath:path extractStreamURLPathsWithCallback:^(NSArray *result, NSError *error) { 
     if (error){ 
      NSLog(@"extracting error:%@",[error localizedDescription]); 
     } 
     for(NSString* streamURLPath in result) { 

      NSLog(@"streamURLPath:%@",streamURLPath); 

      /* 
       NSURL* url = [NSURL URLWithString:streamURLPath]; 
       MPMoviePlayerController* mpMoviePlayerController_ = [[MPMoviePlayerController alloc] initWithContentURL:url]; 
       mpMoviePlayerController_.controlStyle = MPMovieControlStyleDefault; 
       [mpMoviePlayerController_ play]; 
       */ 

     } 
    }]; 
} 

- (void)youtubeURLPath:(NSString*)youtubeURLPath extractStreamURLPathsWithCallback:(CallbackBlock)callback { 
    __block NSMutableArray* resultArray = [NSMutableArray new]; 
    AFHTTPRequestOperationManager* manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:nil]; 
    manager.responseSerializer = [AFHTTPResponseSerializer serializer]; 
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html", nil]; 
    [manager GET:youtubeURLPath 
     parameters:nil 
     success:^(AFHTTPRequestOperation* operation, id responseObject) { 
      NSData* data = (NSData*)responseObject; 
      NSString* string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 


      NSError* error = nil; 
      NSRegularExpression* expression = [NSRegularExpression regularExpressionWithPattern:kYouTubeStreamPathPattern 
                         options:NSRegularExpressionCaseInsensitive 
                          error:&error]; 

      NSRange range = NSMakeRange(0,[string length]); 

      NSArray* matches = [expression matchesInString:string options:0 range:range]; 

      for(NSTextCheckingResult* checkingResult in matches) { 
       if ([checkingResult numberOfRanges]>1){ 
        NSString* resultStr = [string substringWithRange:[checkingResult rangeAtIndex:1]]; 
        //remove extra slashes 
        [resultArray addObject:[resultStr stringByReplacingOccurrencesOfString:@"\\" withString:@""]]; 
       } 
      } 

      if (callback) { 
       callback(resultArray,error); 
      } 

     } failure:^(AFHTTPRequestOperation* operation, NSError* error) { 
      if (callback) { 
       callback(resultArray, error); 
      } 
     }]; 


} 
@end 
相关问题