【问题标题】:MPMoviePlayerController not working in iOS4MPMoviePlayerController 在 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];

任何想法我做错了什么?

【问题讨论】:

    标签: iphone objective-c mpmovieplayercontroller ios4


    【解决方案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。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    相关资源
    最近更新 更多