【问题标题】:How to dismiss MPMoviePlayerController after stopping video停止视频后如何关闭 MPMoviePlayerController
【发布时间】:2012-10-06 08:16:28
【问题描述】:

我已在 30 秒内成功停止视频。但我无法关闭MP MovieViewController,我想停止缓冲活动。我用过这段代码.....

视频播放代码:

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

self.movie = [[MPMoviePlayerController alloc] initWithContentURL:url];
self.movie .controlStyle = MPMovieControlStyleEmbedded;
[  self.movie  play];
[self.view addSubview:self.movie.view];
[self.movie setFullscreen:YES animated:YES];
self.movie.initialPlaybackTime = 0.5;
[NSTimer scheduledTimerWithTimeInterval:15.0
                                 target:self
                               selector:@selector(stopVideo)
                               userInfo:nil
                                repeats:NO];

停止视频:

[self.movie stop];
[self.movie.view removeFromSuperview];
[self.movie release];

【问题讨论】:

    标签: iphone objective-c nstimer nsurl mpmoviewcontroller


    【解决方案1】:

    将您的 MPMoviePlayerController 放在一个单独的类中并加载它:

    MoviePlayerViewController.h

    #import <MediaPlayer/MediaPlayer.h> 
    
    @interface MoviePlayerViewController : UIViewController
    
    @end
    

    MoviePlayerViewController.m

    #import "MoviePlayerViewController.h"
    
    MPMoviePlayerViewController *movieController;
    
    @interface MoviePlayerViewController ()
    
    @end
    
    @implementation MoviePlayerViewController
    
    
    
    - (void)willEnterFullscreen:(NSNotification*)notification {
        NSLog(@"willEnterFullscreen");
    }
    
    - (void)enteredFullscreen:(NSNotification*)notification {
        NSLog(@"enteredFullscreen");
    }
    
    - (void)willExitFullscreen:(NSNotification*)notification {
        NSLog(@"willExitFullscreen");
    }
    
    - (void)exitedFullscreen:(NSNotification*)notification {
        NSLog(@"exitedFullscreen");
    
        [[NSNotificationCenter defaultCenter] removeObserver:self];
    }
    
    - (void)playbackFinished:(NSNotification*)notification {
        NSNumber* reason = [[notification userInfo] objectForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey];
        switch ([reason intValue]) {
            case MPMovieFinishReasonPlaybackEnded:
                [self dismissModalViewControllerAnimated:YES];
                break;
            case MPMovieFinishReasonPlaybackError:
                break;
            case MPMovieFinishReasonUserExited:
                [self dismissModalViewControllerAnimated:YES];
                break;
            default:
                break;
        }
    }
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willEnterFullscreen:) name:MPMoviePlayerWillEnterFullscreenNotification object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willExitFullscreen:) name:MPMoviePlayerWillExitFullscreenNotification object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(enteredFullscreen:) name:MPMoviePlayerDidEnterFullscreenNotification object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(exitedFullscreen:) name:MPMoviePlayerDidExitFullscreenNotification object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackFinished:) name:MPMoviePlayerPlaybackDidFinishNotification object:nil];
    
    
    
        NSString *videoName = @"Videoname";
    
        NSString *filepath   =   [[NSBundle mainBundle] pathForResource:videoName @"movietype"];
        NSURL    *fileURL    =   [NSURL fileURLWithPath:filepath];
        movieController = [[MPMoviePlayerViewController alloc] initWithContentURL:fileURL];
    
    
        [movieController.view setFrame:CGRectMake(0, -20, 320, 480)];
        [self.view addSubview:movieController.view];
    
        [movieController.moviePlayer play];
    
    }
    

    ViewController.m

        MoviePlayerViewController *player = [[MoviePlayerViewController alloc] initWithNibName:nil bundle:nil];
     [self presentModalViewController:player animated:YES];
    

    它的作用:

    MoviePlayerViewController 是一个自定义类,它加载带有视频的MPMoviePlayerController。在viewDidLoad 方法(或任何你想要的方法)中加载MoviePlayerViewController。 ([self presentModalViewController:animated]).... 这样做的好处是,您的主类不会因moviecrap/定义而过载,并且您可以在MoviePlayerViewController 完成使用通知检查它是否已停止时轻松关闭它。 如果它已停止:

    [self dismissModalViewControllerAnimated:YES];
    

    希望对您有所帮助!

    【讨论】:

      【解决方案2】:

      如下面的代码所示,您应该在实际停止之前暂停并将 initialPlaybackTime 设置为 -1。这是 MPMoviePlayerController 提供的棘手的事情之一。

          [_moviePlayerController pause];
      
          if ([_moviePlayerController isKindOfClass:[MPMoviePlayerController class]]) {
              ((MPMoviePlayerController*)_moviePlayerController).initialPlaybackTime = -1;
          }
      
          [_moviePlayerController stop];
          if ([_moviePlayerController isKindOfClass:[MPMoviePlayerController class]]) {
              ((MPMoviePlayerController*)_moviePlayerController).initialPlaybackTime = -1;
          }
          [_moviePlayerController.view removeFromSuperview];
      

      【讨论】:

      • 不知道为什么我删除第二个((MPMoviePlayerController*)_moviePlayerController).initialPlaybackTime = -1;
      【解决方案3】:

      需要在viewDidLoad中添加通知观察者:

       [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerPlaybackDidFinishNotification:) name:MPMoviePlayerPlaybackDidFinishNotification object:nil];
      

      然后添加方法:

       - (void)moviePlayerPlaybackDidFinishNotification:(NSNotification*)notification 
       {
          [self dismissMoviePlayerViewControllerAnimated];
       }
      

      【讨论】:

        【解决方案4】:

        在您的标头中导入一些标头:

         #import <MediaPlayer/MediaPlayer.h>
         #import <MediaPlayer/MPMoviePlayerViewController.h>
        

        您可能还需要平衡您的“presentMoviePlayer”调用与某处的关闭:

        [self dismissMoviePlayerViewControllerAnimated];
        

        如果您提前完成了资源,您可以通过使用 NotificationManager 监视 MPMoviePlayerPlaybackDidFinishNotification 来更快地释放它。

        还有

        - (void)dealloc {
           [movie release], 
           movie = nil;
           [super dealloc];
        }
        

        【讨论】:

        • MPMoviePlayerControllerMPMoviPlayerViewController 是两个不同的类...
        • @Paul.s 是的。 MPMoviePlayerController 只是一个电影播放器​​,它为您提供了一种在 iPhone 上播放电影的方式,MPMoviePlayerViewController 是一个实际的视图控制器子类,负责展示 MPMoviePlayerController。
        • @Paul.s 因此,MPMoviePlayerController 是您可以访问的 MPMoviePlayerViewController 中的一个属性。 MPMoviePlayerViewController.movi​​ePlayer 是您用来访问 MPMoviePlayerController 属性的属性。
        • 我知道这一点。 OP 正在谈论使用MPMoviePlayerController,但您的解决方案是调用dismissMoviePlayerViewControllerAnimated,这适用于提供的MPMoviPlayerViewController
        • @Paul.s 看我的第二条评论并调用 MyMoviePlayerViewController * moviePlayerVC = [[MPMoviePlayerViewController alloc]initWithContentURL:movieURL]; MPMoviePlayerViewController 使用 MPMoviePlayerController 显示电影/视频。
        【解决方案5】:

        试试这个......

        self.movie.initialPlaybackTime = -1; 
        [self.movie stop]; 
        [self.movie release]; 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-04-30
          • 1970-01-01
          • 1970-01-01
          • 2021-07-27
          • 1970-01-01
          • 2020-10-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多