MPMoviePlayerController 在 iOS4 中不起作用

Posted

技术标签:

【中文标题】MPMoviePlayerController 在 iOS4 中不起作用【英文标题】:MPMoviePlayerController not working in iOS4 【发布时间】:2010-07-14 15:28:37 【问题描述】:

我正在使用来自的第一个答案 ios 4 + MPMoviePlayerController

尝试让MPMoviePlayerController 玩。在模拟器(iOS4 的 iPhone 设备)中,我听到声音但没有视频。在设备(iPhone 3GS 和 iOS4)上,我什么也没得到。这是我的代码:

    MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:moviePath]];
    moviePlayer.movieControlMode = MPMovieControlModeDefault;

    if ([moviePlayer respondsToSelector:@selector(view)]) 
        moviePlayer.controlStyle = MPMovieControlStyleFullscreen;
        [moviePlayer.view setFrame:self.view.bounds];
        [self.view addSubview:moviePlayer.view];
    

    [moviePlayer play];

任何想法我做错了什么?

【问题讨论】:

【参考方案1】:

我刚刚在 iOS4 + iPhone 4(和 3GS)上测试了以下代码——它运行良好。乍一看,我认为您的代码的问题是没有在您的 MPMoviePlayerController 实例上调用 setFullscreen:animated

- (void)willEnterFullscreen:(NSNotification*)notification 
    NSLog(@"willEnterFullscreen");


- (void)enteredFullscreen:(NSNotification*)notification 
    NSLog(@"enteredFullscreen");


- (void)willExitFullscreen:(NSNotification*)notification 
    NSLog(@"willExitFullscreen");


- (void)exitedFullscreen:(NSNotification*)notification 
    NSLog(@"exitedFullscreen");
    [self.movieController.view removeFromSuperview];
    self.movieController = nil;
    [[NSNotificationCenter defaultCenter] removeObserver:self];


- (void)playbackFinished:(NSNotification*)notification 
    NSNumber* reason = [[notification userInfo] objectForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey];
    switch ([reason intValue]) 
        case MPMovieFinishReasonPlaybackEnded:
            NSLog(@"playbackFinished. Reason: Playback Ended");         
            break;
        case MPMovieFinishReasonPlaybackError:
            NSLog(@"playbackFinished. Reason: Playback Error");
            break;
            case MPMovieFinishReasonUserExited:
            NSLog(@"playbackFinished. Reason: User Exited");
            break;
        default:
            break;
    
    [self.movieController setFullscreen:NO animated:YES];


- (void)showMovie 
    [[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];

    NSURL* movieURL =  [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"tron" ofType:@"mov"]];
    self.movieController = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];
    if ([self.movieController respondsToSelector:@selector(view)]) 
        self.movieController.view.frame = self.view.frame;
        [self.view addSubview:movieController.view];
        [self.movieController setFullscreen:YES animated:YES];
    
    [self.movieController play];


// This method is set as the action for an on-screen button
- (void)movieTime:(id)sender 
    [self showMovie];

【讨论】:

不适用于 iOS4 和 iPhone 3GS。在调试器中,它到达 self.movi​​eController.view.frame 行并跳过接下来的两个。 如果我没看错,你是说执行到第一行 inside if 块但跳过接下来的两行?似乎极不可能。让我挖出我们的 3GS 测试单元之一…… ... 是的,在这里可以使用运行 iOS4 的 3GS。可能会有所不同的是上下文——在我的应用程序中,代码是从事件处理程序调用的,而不是在viewDidLoad 我已经用UIViewController 实例中的所有相关代码编辑了我的原始答案。 谢谢。现在,当我将您更新的代码放入其中时,self.view 上出现错误。我所在的文件是 NSObject 类型的。它是从 UIView 调用的。 NSObject 文件是否需要创建一个视图来放置视频播放器?另外,你在哪里处理所有的玩家分配?每次播放视频时我都会分配。【参考方案2】:

对于MPMoviePlayerController view 是一个属性,而不是一个方法,所以如果它没有为它合成或编写的方法(即声明为@dynamic),你不能在它上面使用respondsToSelector:。我认为 UIKit 中的大多数只读属性都是如此。

【讨论】:

任何@property都会有对应的getter方法。 显然不是,因为respondsToSelector: 将始终返回带有动态属性的 false。

以上是关于MPMoviePlayerController 在 iOS4 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MPMoviePlayerController 上处理多个 SRT 文件

在 MPMoviePlayerController 上执行捏合手势时屏幕黑屏

在 UITableViewCell 中嵌入 MPMoviePlayerController

MPMoviePlayerController 在影片结尾更改控件样式

后台的 MPMoviePlayerController / AVAudioSession 在来电后不会重新开始播放

MPMoviePlayerController 在启动前显示空白屏幕?