如何在iPhone上的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 :(得分: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
答案 1 :(得分:1)
MPMoviePlayerController
不支持播放YouTube SWF(Flash)视频。
您提到的那个应用程序实际上是以MP4格式逐步下载的文件,YouTube也提供了一些内容。这实际上违反了Apple的指导原则,因为它将(并且确实)超过每个应用程序每个时间帧的最大渐进式下载量。经过iTunes的批准,我感到很惊讶。
警告:提交在App Store中分发的iOS应用必须 符合这些要求。如果您的应用提供了视频 蜂窝网络,视频超过10分钟或 5分钟内需要5 MB数据,您需要使用HTTP 直播。 (渐进式下载可用于较小的剪辑。)
如果您的应用通过蜂窝网络使用HTTP直播,那么您就是 需要以64 Kbps或更低带宽提供至少一个流 (低带宽流可以是仅音频流或具有静止的音频 图像)。
这些要求适用于提交分发的iOS应用程序 App Store用于Apple产品。不符合要求的应用可能是 拒绝或删除,由Apple自行决定。
因此,您的任务归结为如何获取通过YouTube提供的视频的MP4网址的问题。这部分真的很棘手,很好地解决了Deja。只需使用数据包嗅探器,您就会看到它实际上创建了一个本地服务器,用于提供MPMoviePlayerController。
答案 2 :(得分: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];
答案 3 :(得分: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];
答案 4 :(得分:0)