MPMoviePlayerController playing YouTube video

2019-05-27 09:49发布

How can I play a YouTube video in an MPMoviePlayerController on the iPhone while avoiding going into fullscreen mode?

This question has been raised here: MPMoviePlayerController is playing YouTube video? and here: Play Youtube video in MPMoviePlayerController or play RTSP - 3GP link with answers claiming such functionality was impossible.

Yet this app, Deja, has exactly the functionality I would like: a seamless MPMoviePlayerController whose frame I have explicit control over. http://itunes.apple.com/app/deja/id417625158

How is this done!?

5条回答
混吃等死
2楼-- · 2019-05-27 09:54

add this sample into you project instantiate YoutubeStreamPathExtractorTest

invoke test method of YoutubeStreamPathExtractorTest instance. Follow logs and be happy

#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
查看更多
地球回转人心会变
3楼-- · 2019-05-27 09:56

try this code:

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];
查看更多
放荡不羁爱自由
4楼-- · 2019-05-27 10:06

MPMoviePlayerController does not support the playback of YouTube SWF (Flash) video, period.

That app you are mentioning actually plays progressively downloaded files in MP4 format which YouTube also offers for some of its content. This actually is a violation of Apple's guidelines as it will (and does) exceed the maximum amount of progressive download per app per timeframe. I am surprised it got through the iTunes approval.

Warning: iOS apps submitted for distribution in the App Store must conform to these requirements. If your app delivers video over cellular networks, and the video exceeds either 10 minutes duration or 5 MB of data in a five minute period, you are required to use HTTP Live Streaming. (Progressive download may be used for smaller clips.)

If your app uses HTTP Live Streaming over cellular networks, you are required to provide at least one stream at 64 Kbps or lower bandwidth (the low-bandwidth stream may be audio-only or audio with a still image).

These requirements apply to iOS apps submitted for distribution in the App Store for use on Apple products. Non-compliant apps may be rejected or removed, at the discretion of Apple.

So your task boils down to the question on how to get the MP4 URL of a video offered through YouTube. That part is really tricky and nicely solved by Deja. Just use a packet sniffer and you will see that it actually creates a local server that feeds MPMoviePlayerController.

查看更多
相关推荐>>
5楼-- · 2019-05-27 10:14

I guess it is against Youtube ToS but you can use this code here:

https://github.com/larcus94/LBYouTubeView

It is simple to use and works like a charm!

查看更多
倾城 Initia
6楼-- · 2019-05-27 10:16

Use UIWebView. Copy HtML code video in youtube.

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];
查看更多
登录 后发表回答