【问题标题】:Weird behavior running MPMoviePlayerController in viewDidLoad在 viewDidLoad 中运行 MPMoviePlayerController 的奇怪行为
【发布时间】:2011-08-21 18:32:12
【问题描述】:

我正在使用MediaPlayer 框架在我的应用程序启动后立即播放相当大的电影(~200 MB)。当我尝试在我的viewDidLoad 中播放视频时,断点指示已添加视图,但视频未显示在设备上。

然后我设置了一个按钮来确认视频是否有效。从按钮运行 IBAction 没有问题。

然后我被难住了。我想知道这是否与应用程序一启动就调用视频这一事实有关。所以我在 viewDidLoad 调用中添加了一个延迟 5 秒的NSTimer。瞧,它工作得很好。任何人都可以解释为什么视频不会播放,除非有初始延迟?代码如下。

- (void)viewDidLoad {
      NSTimer *currentTimer = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(playMovie) userInfo:nil repeats:NO];
        [[NSRunLoop mainRunLoop] addTimer:currentTimer forMode:NSRunLoopCommonModes];
      [super viewDidLoad];
}

-(IBAction)playMovie
{  
    NSString *filepath   =   [[NSBundle mainBundle] pathForResource:@"Speed" ofType:@"mov"];  
    NSURL    *fileURL    =   [NSURL fileURLWithPath:filepath];  
    MPMoviePlayerController *moviePlayerController = [[MPMoviePlayerController alloc] initWithContentURL:fileURL];  

    [[NSNotificationCenter defaultCenter] addObserver:self  
                                             selector:@selector(moviePlaybackComplete:)  
                                                 name:MPMoviePlayerPlaybackDidFinishNotification  
                                               object:moviePlayerController];  

    [self.view addSubview:moviePlayerController.view];  
    moviePlayerController.fullscreen = YES;  
    [moviePlayerController play]; 
}  

【问题讨论】:

    标签: ios cocoa-touch mpmovieplayercontroller nstimer viewdidload


    【解决方案1】:

    尝试用viewDidAppear: 代替viewDidLoad 播放电影。在调用viewDidLoad 时,视图尚未在视图层次结构中。你仍然可以在viewDidLoad 中创建 MPMoviePlayerController,只是在视图真正出现之前不要播放它。

    【讨论】:

      【解决方案2】:

      我认为视频的大小与此有关。我尝试用较小的视频做同样的事情,效果很好。似乎视频首先加载然后播放(请参阅此堆栈溢出问题:MPMoviePlayerController not showing controls until video is loaded)。显然,预加载 200 MB 的视频需要 4-5 秒。尝试那些不适用于较小尺寸视频的代码。如果它工作正常,那肯定是尺寸问题。

      编辑:我在MPMoviePlayerController Class Reference "找到这个在播放之前明确的源类型,电影播放器​​控制器必须收集此信息,这可能会延迟播放。“我注意到你没有声明源类型。再加上视频的大小,您将获得 4-5 秒的加载时间。

      玩之前也可以试试[moviePlayerController prepareToPlay];

      【讨论】:

        【解决方案3】:

        我有不同的经历,但将代码移动到 viewDidAppear: 也对我的情况有所帮助。我有从一个情节提要到另一个情节提要的 IOS 代码,一旦转接完成 - 在viewDidLoad: 中,我正在初始化一个周期性计时器。计时器的代码如下 [我在viewDidLoad: 中'调用' startTimer]:

        // Schedules a new timer, adds it to the current run loop and waits forever.
        - (void) startTimer
        {
            _timer = [NSTimer scheduledTimerWithTimeInterval: 10.0
                                                      target:self
                                                    selector:@selector(request)
                                                    userInfo:nil
                                                     repeats:YES];
        //    [[NSRunLoop mainRunLoop] addTimer:_timer forMode:NSDefaultRunLoopMode];
            [[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSDefaultRunLoopMode];
        //    [[NSRunLoop mainRunLoop] runUntilDate:[NSDate distantFuture]];
            [[NSRunLoop currentRunLoop] runUntilDate:[NSDate distantFuture]];
        }
        

        有趣的是,当我在 viewDidLoad 中调用 startTimer 时:我永远无法观察到 iPhone 上的视图更改为下一个控制器 - 我可以看到显示控件到达的 NSLog 语句

        - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
        

        但控件没有转到 ViewController。

        此行为与周期性计时器的计时无关 - 设置低或高不会影响问题。当我将 startTimer 调用移至 viewDidAppear:

        时,观察到的问题消失了

        即使我将计时器代码移至viewDidAppear:,也会出现另一组挑战。这个有一个常规计时器的代码 - 我已经创建了这个,以便我可以获得蓝牙低功耗连接的 RSSI 值。我观察到的是,我停止为蓝牙委托获取委托回调。

        【讨论】:

          猜你喜欢
          • 2023-04-09
          • 1970-01-01
          • 1970-01-01
          • 2021-02-23
          • 1970-01-01
          • 1970-01-01
          • 2010-12-01
          • 2011-10-07
          • 2012-02-29
          相关资源
          最近更新 更多