MPMoviePlayerViewController работает, MPMoviePlayerController не ... почему? - PullRequest
3 голосов
/ 21 октября 2011

У меня есть этот код

NSString *filepath   =   [[NSBundle mainBundle] pathForResource:@"d" ofType:@"mp4"];  
NSURL    *url    =   [NSURL fileURLWithPath:filepath];  

//part 1
MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL: url];
[player.view setFrame: self.view.bounds];  
//[player prepareToPlay];
//[player setShouldAutoplay:YES];
//[player setControlStyle:2];
[self.view addSubview: player.view];
[player play];

//part2
MPMoviePlayerViewController *mp = [[MPMoviePlayerViewController alloc] initWithContentURL:url];
[[mp moviePlayer] prepareToPlay];
[[mp moviePlayer] setShouldAutoplay:YES];
[[mp moviePlayer] setControlStyle:2];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(videoPlayBackDidFinish:) name:MPMoviePlayerPlaybackDidFinishNotification object:mp];
[self presentMoviePlayerViewControllerAnimated:mp];

часть 2 работает, часть 1 нет ... они используют один и тот же URL, и я почти скопировал и вставил фрагмент с сайта ADC

Я использую ios5

Ответы [ 3 ]

1 голос
/ 05 июля 2012

Прошло много времени с тех пор, как этот вопрос был опубликован, но ответ таков: вы должны хранить ссылку на переменную MPMoviePlayerController.

Если у вас есть код part1 в функции, объявитеMPMoviePlayerController *player в вашем .h файле.Если вы этого не сделаете (и вы разрабатываете с ARC), ваша переменная игрока будет освобождена, как только вы выйдете из функции.Обратите внимание, что вы добавляете player.view к self.view, поэтому вид игрока сохраняется, а контроллер игрока - нет, и он освобождается.

Таким образом, вы должны иметь в своем файле .h:

MPMoviePlayerController *player;

и в этом случае ваша функция должна выглядеть примерно так:

-(void) playMovie
{
    NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] 
                                         pathForResource:@"mymovie" 
                                         ofType:@"mov"]];    

    player = [[MPMoviePlayerController alloc] initWithContentURL: url];
    [player.view setFrame: self.view.bounds];  
    [self.view addSubview: player.view];
    [player play];        
}
0 голосов
/ 23 января 2012

У меня была похожая проблема на iOS 5 с MPPlayerController, и я проверил пример проекта Apple, разница была только в установке фрейма, поэтому я установил фрейм вручную, и он работал отлично.

0 голосов
/ 13 декабря 2011

Вы не можете добавить вид проигрывателя к основному виду, пока видео не будет загружено.

Таким образом, вы должны заменить эту строку:

[self.view addSubview: player.view];

на эту:

[[NSNotificationCenter defaultCenter] 
    addObserver:self 
    selector:@selector(movieLoadStateDidChange:) 
    name:MPMoviePlayerLoadStateDidChangeNotification 
    object:player];

И добавьте этот метод:

-(void)movieLoadStateDidChange: (NSNotification*)notification{
    if (player.loadState & MPMovieLoadStatePlayable == MPMovieLoadStatePlayable) {
        [[NSNotificationCenter defaultCenter] 
            removeObserver:self 
            name:MPMoviePlayerLoadStateDidChangeNotification 
            object:player] ; 
        [self.view addSubview:player.view];
    }
}
...