MPMoviePlayerController не работает в iOS 5 xcode (с раскадровкой), но отлично работает в iOS 4 - PullRequest
1 голос
/ 13 сентября 2011

У меня проблемы с воспроизведением фильма с новым xcode, который поставляется с бета-версией iOS 5. Я создал простой проект (с раскадровками и всем) и добавил этот код к кнопке:

MPMoviePlayerController *moviePlayer;
NSString *path = [[NSBundle mainBundle] pathForResource:@"position" ofType:@"m4v"];
NSURL *videoURL = [NSURL fileURLWithPath:path];
moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:videoURL];
//[moviePlayer setControlStyle:MPMovieControlStyleDefault];
[moviePlayer.view setFrame: self.view.bounds];  // player's frame must match parent's
[self.view addSubview: moviePlayer.view];
[moviePlayer prepareToPlay];
[moviePlayer play];

Смущает то, что он отлично работает, когда я добавляю код в проект, созданный с использованием предыдущей версии xcode (особенно той, которая поставляется с iOS 4.3).

Есть идеи?

Ответы [ 6 ]

13 голосов
/ 20 октября 2011

Впервые в Objective-C, но я попробую.В Xcode 4.2 (который предлагает код для iOS5) по умолчанию в новых проектах включен ARC (автоматический подсчет ссылок).Для кода, который вы дали, поскольку вы объявляете moviePlayer внутри этого блока кода, moviePlayer автоматически освобождается, когда он выходит из блока.В более старых проектах moviePlayer просто задерживался, потенциально создавая утечку памяти.Я начал работать с включенной по умолчанию настройкой ARC в Xcode 4.2, объявив moviePlayer в заголовочном файле класса, что означает, что он освобождается только при освобождении экземпляра объекта этого класса.

7 голосов
/ 05 декабря 2011
MPMoviePlayerController *moviePlayer;

поместите его в файл заголовка (.h) и его работа

1 голос
/ 18 августа 2012

Попробуйте ... это работает в iOS 5. Вы можете отредактировать код, чтобы он воспроизводился с помощью кнопки IBAction.Удачи

#import <UIKit/UIKit.h>
#import <MediaPlayer/MediaPlayer.h>
@interface Playing_Video_FilesViewController : UIViewController
@property (nonatomic, strong) MPMoviePlayerController *moviePlayer;
@property (nonatomic, strong) UIButton *playButton;
@end
 - (void) startPlayingVideo:(id)paramSender{
  NSBundle *mainBundle = [NSBundle mainBundle];
  NSString *urlAsString = [mainBundle pathForResource:@"Sample"
                                               ofType:@"m4v"];
  NSURL    *url = [NSURL fileURLWithPath:urlAsString];
  if (self.moviePlayer != nil){
    [self stopPlayingVideo:nil];
}

  self.moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:url];
  if (self.moviePlayer != nil){
    [[NSNotificationCenter defaultCenter]
     addObserver:self
     selector:@selector(videoHasFinishedPlaying:)
     name:MPMoviePlayerPlaybackDidFinishNotification
     object:self.moviePlayer];
    NSLog(@"Successfully instantiated the movie player.");

    self.moviePlayer.scalingMode = MPMovieScalingModeAspectFit;

    [self.moviePlayer play];
    [self.view addSubview:self.moviePlayer.view];
    [self.moviePlayer setFullscreen:YES
                           animated:YES];
  } else {
    NSLog(@"Failed to instantiate the movie player.");
} 
}
- (void) stopPlayingVideo:(id)paramSender {
  if (self.moviePlayer != nil){
    [[NSNotificationCenter defaultCenter]
     removeObserver:self
     name:MPMoviePlayerPlaybackDidFinishNotification
     object:self.moviePlayer];
    [self.moviePlayer stop];
    if ([self.moviePlayer.view.superview isEqual:self.view]){
      [self.moviePlayer.view removeFromSuperview];
} }
}
- (void) viewDidUnload{
  self.playButton = nil;
  [self stopPlayingVideo:nil];
  self.moviePlayer = nil;
  [super viewDidUnload]; 
}
- (void) videoHasFinishedPlaying:(NSNotification *)paramNotification{
  /* Find out what the reason was for the player to stop */
  NSNumber *reason =
  [paramNotification.userInfo
   valueForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey];
  if (reason != nil){
    NSInteger reasonAsInteger = [reason integerValue];
    switch (reasonAsInteger){
      case MPMovieFinishReasonPlaybackEnded:{
        /* The movie ended normally */
break; }
      case MPMovieFinishReasonPlaybackError:{
        /* An error happened and the movie ended */
        break; 
}
case MPMovieFinishReasonUserExited:{
        /* The user exited the player */
        break;
} 
}
    NSLog(@"Finish Reason = %ld", (long)reasonAsInteger);
    [self stopPlayingVideo:nil];
  } /* if (reason != nil){ */ 
} 
1 голос
/ 12 апреля 2012

Я нашел решение в этом коде:

movieView = [moviePlayer view];

[movieView setFrame: CGRectMake(0, 0, 1024, 768)];
0 голосов
/ 23 января 2012

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

0 голосов
/ 16 ноября 2011
// link the method to a button and it will work in iOS5
-(void)playMovie

    {
   NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] 
                 pathForResource:@"MOVIENAME" ofType:@"MOV"]];
    moviePlayer =  [[MPMoviePlayerController alloc]
                 initWithContentURL:url];

    [[NSNotificationCenter defaultCenter] addObserver:self
                   selector:@selector(moviePlayBackDidFinish:)
                   name:MPMoviePlayerPlaybackDidFinishNotification
                   object:moviePlayer];

    moviePlayer.controlStyle = MPMovieControlStyleDefault;
    moviePlayer.shouldAutoplay = YES;
    [self.view addSubview:moviePlayer.view];
    [moviePlayer setFullscreen:YES animated:YES];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...