2

全画面表示モードにならずに、iPhone の MPMoviePlayerController で YouTube ビデオを再生するにはどうすればよいですか?

この質問はここで提起されています: MPMoviePlayerController は YouTube ビデオを再生していますか? そしてここ:MPMoviePlayerControllerでYoutubeビデオを再生するか、RTSPを再生します-そのような機能は不可能であると主張する回答付きの3GPリンク。

しかし、このアプリ Deja はまさに私が望んでいた機能を備えています。フレームを明示的に制御できるシームレスな MPMoviePlayerController です。http://itunes.apple.com/app/deja/id417625158

これはどのように行われますか!?

4

5 に答える 5

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
于 2013-11-16T11:28:35.880 に答える
1

MPMoviePlayerController期間中、YouTube SWF(Flash)動画の再生には対応していません。

あなたが言及しているそのアプリは、YouTube がそのコンテンツの一部にも提供している MP4 形式でプログレッシブにダウンロードされたファイルを実際に再生します。これは実際には、時間枠ごとのアプリごとのプログレッシブ ダウンロードの最大量を超えるため、Apple のガイドラインに違反しています。iTunesの承認を通過したことに驚いています。

警告: App Store での配布用に提出された iOS アプリは、これらの要件に準拠する必要があります。アプリがセルラー ネットワーク経由で動画を配信し、動画の長さが 10 分間または 5 分間で 5 MB を超える場合は、HTTP ライブ ストリーミングを使用する必要があります。(小さなクリップにはプログレッシブ ダウンロードを使用できます。)

アプリがセルラー ネットワーク経由で HTTP ライブ ストリーミングを使用する場合、64 Kbps 以下の帯域幅で少なくとも 1 つのストリームを提供する必要があります (低帯域幅ストリームは、音声のみまたは静止画像付きの音声である可能性があります)。

これらの要件は、Apple 製品で使用するために App Store で配布するために提出された iOS アプリに適用されます。準拠していないアプリは、Apple の裁量により拒否または削除される場合があります。

したがって、あなたの仕事は、YouTube を通じて提供されるビデオの MP4 URL を取得する方法に関する質問に要約されます。その部分は非常にトリッキーで、Deja によってうまく解決されています。パケット スニファを使用するだけで、MPMoviePlayerController にフィードするローカル サーバーが実際に作成されることがわかります。

于 2012-05-03T00:05:25.800 に答える
0

Youtube ToS に違反していると思いますが、ここでこのコードを使用できます。

https://github.com/larcus94/LBYouTubeView

使い方は簡単で、魔法のように機能します!

于 2013-08-15T14:53:11.977 に答える
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];
于 2012-05-02T09:53:54.610 に答える