2015-03-10 19 views
2

Я пытаюсь использовать MPMoviePlayerController для воспроизведения локально сохраненного видео, однако оно не работает.MPMoviePlayerController: Не воспроизводится видео

Вот мой источник:

self.moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:url]; 
[self.moviePlayer prepareToPlay]; 

CGRect frame = self.movieView.frame; 
frame.origin = CGPointZero; 

self.moviePlayer.view.frame = frame; 

self.moviePlayer.allowsAirPlay   = NO; 
self.moviePlayer.shouldAutoplay  = NO; 
self.moviePlayer.movieSourceType  = MPMovieSourceTypeFile; 
self.moviePlayer.scalingMode   = MPMovieScalingModeAspectFit; 
self.moviePlayer.controlStyle   = MPMovieControlStyleEmbedded; 
self.moviePlayer.view.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; 

[self.movieView addSubview:self.moviePlayer.view]; 

Это делает работы, когда у меня есть URL, как «активы-библиотека:? //asset/asset.MOV ID = 2C7D89F6-2211-4920-A842-30D773B075D6 & ext = MOV ", но когда у меня есть URL-адрес, например" file: ///var/mobile/Media/DCIM/101APPLE/IMG_1454.mp4 ", он не работает.

Я использую следующий код, чтобы получить пользователей последнее видео и играть в плеере:

- (void)mostRecentVideo:(void (^)(NSURL *url))completion 
{ 
PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init]; 
fetchOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]]; 

PHFetchResult *fetchResult = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeVideo options:fetchOptions]; 
PHAsset *lastAsset = [fetchResult lastObject]; 

PHVideoRequestOptions *options = [PHVideoRequestOptions new]; 
options.deliveryMode = PHVideoRequestOptionsDeliveryModeMediumQualityFormat; 

[[PHImageManager defaultManager] requestAVAssetForVideo:lastAsset options:options resultHandler:^(AVAsset *asset, AVAudioMix *audioMix, NSDictionary *info) { 
    if ([asset isKindOfClass:[AVURLAsset class]]) 
     completion(((AVURLAsset *)asset).URL); 
}]; 
} 
+0

как вы получите URL в self.moviePlayer = [[MPMoviePlayerController Alloc] initWithContentURL: URL]; –

+0

Функция mostRecentVideo - это то, где я ее получаю, в первый раз, когда я использую UIImagePickerController, чтобы получить его. –

+0

Что вы имеете в виду, не работает? Каково поведение? – gabbler

ответ

2

Тот же самый код работает для меня, я использовал его, как это. Поскольку получение url является асинхронной операцией, необходимо обновить интерфейс пользователя в основной очереди. Просто введите код в viewDidAppear и повторите попытку.

[self mostRecentVideo:^(NSURL *url){ 
    NSLog(@"did play!, url is %@",url); 
    self.moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:url]; 
    [self.moviePlayer prepareToPlay]; 

    CGRect frame = self.view.frame; 
    frame.origin = CGPointZero; 

    self.moviePlayer.view.frame = frame; 

    self.moviePlayer.allowsAirPlay   = NO; 
    self.moviePlayer.shouldAutoplay  = NO; 
    self.moviePlayer.movieSourceType  = MPMovieSourceTypeFile; 
    self.moviePlayer.scalingMode   = MPMovieScalingModeAspectFit; 
    self.moviePlayer.controlStyle   = MPMovieControlStyleEmbedded; 
    self.moviePlayer.view.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.view addSubview:self.moviePlayer.view]; 
    }); 
    [self.moviePlayer play]; 
}]; 
+0

Спасибо! Вот в чем проблема. Боже, я чувствую себя глупо. –

+0

Я пробовал код выше, но он появляется пустой экран! Я слышу звук, но не вижу видео! – kb920

+0

@ kb920, я не знаю почему. – gabbler

1

Я предполагаю использовать NSUrl *url = [NSURL URLWithString:urlStr]; для url в

self.moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:url]; 

Но Filepath как : file:///var/mobile/Media/DCIM/101APPLE/IMG_1454.mp4 Вы должны использовать:

NSUrl *url = [NSURL fileURLWithPath:filePath]; 

См. NSUrl Document

+0

URL-адрес, который я использую, - это «(ресурс AVURLAsset *)) .URL ', и это то, что не работает. Должен ли я преобразовать его в строку или что-то еще? –

+0

- файл: ///var/mobile/Media/DCIM/101APPLE/IMG_1454.mp4 результат (AVURLAsset *) актив) .URL тоже? –

+0

Да, они оба NSURL's –

0

Я внес некоторые изменения в свой код и поместил код фильма в блок PHImageManager и его работу для меня.

 [[PHImageManager defaultManager] requestAVAssetForVideo:lastAsset options:options resultHandler:^(AVAsset *asset, AVAudioMix *audioMix, NSDictionary *info) { 
      if ([asset isKindOfClass:[AVURLAsset class]]) 
       NSLog(@"%@",((AVURLAsset *)asset).URL); 

      AVURLAsset *assetURL = [AVURLAsset assetWithURL:((AVURLAsset *)asset).URL]; 

      NSString *str= [NSString stringWithFormat:@"%@",assetURL.URL]; 

      NSURL *url = [NSURL URLWithString:str]; 

      // Initialize the MPMoviePlayerController object using url 
      _videoPlayer = [[MPMoviePlayerController alloc] 
          initWithContentURL:url]; 

      [_videoPlayer.view setFrame:CGRectMake(0, 0, 320, 568)]; 

      // Add a notification. (It will call a "moviePlayBackDidFinish" method when _videoPlayer finish or stops the plying video) 
      [[NSNotificationCenter defaultCenter] addObserver:self 
                selector:@selector(moviePlayBackDidFinish:) 
                 name:MPMoviePlayerPlaybackDidFinishNotification 
                 object:_videoPlayer]; 

      // Set control style to default 
      _videoPlayer.controlStyle = MPMovieControlStyleDefault; 

      // Set shouldAutoplay to YES 
      _videoPlayer.shouldAutoplay = YES; 
      [_videoPlayer setMovieSourceType:MPMovieSourceTypeFile]; 

      // Add _videoPlayer's view as subview to current view. 
      [self.view addSubview:_videoPlayer.view]; 

      // Set the screen to full. 
      [_videoPlayer setFullscreen:YES animated:YES]; 

     }]; 

Пожалуйста, проверьте, если он может помочь вам ...

+0

Извините за то, что вы так долго отвечаете, но этот источник не работает для меня ... есть ли ошибка для игрока? –

Смежные вопросы