【问题标题】:How to play video in Objective-C - Causes Jerk when loads如何在 Objective-C 中播放视频 - 加载时导致 Jerk
【发布时间】:2011-02-28 09:32:09
【问题描述】:

我正在开发一个在应用程序启动时加载视频的应用程序。当视频播放并从屏幕上移除时,我观察到一个巨大的混蛋。

我的代码如下:

VideoPlayer.m

-(id)initWithVideo: (CGRect)frame file:(NSString *)videoFile 
{
    if (self = [super initWithFrame:frame]) 
    {
        NSArray *file = [videoFile componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"."]];

        NSString *moviePath = [[NSBundle mainBundle] pathForResource:[file objectAtIndex:0] ofType:[file objectAtIndex:1]];

        if (nil != moviePath) 
        {
            if (nil != theMovie) 
            {
                [theMovie.view removeFromSuperview];
            }

            theMovie = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL fileURLWithPath:moviePath]];

            theMovie.view.frame = self.bounds;
            theMovie.moviePlayer.scalingMode = MPMovieScalingModeAspectFit;
            theMovie.moviePlayer.controlStyle = MPMovieControlStyleNone;
            theMovie.moviePlayer.movieSourceType = MPMovieSourceTypeFile;
            theMovie.moviePlayer.fullscreen = NO;           

            [self addSubview:theMovie.view];            
        }
    }

    return self;
}

请指导我在哪里错过它。

【问题讨论】:

    标签: objective-c ios ipad mpmovieplayer


    【解决方案1】:
    -(void)prepareMoviePlayer:(NSURL *)moviePath {
        self.moviePlayerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:moviePath];
        if ([[self.moviePlayerViewController moviePlayer] respondsToSelector:@selector(loadState)]) {
          [[self.moviePlayerViewController moviePlayer] setControlStyle:MPMovieControlStyleEmbedded];
          [[self.moviePlayerViewController moviePlayer] setFullscreen:NO];      
          [[self.moviePlayerViewController moviePlayer] prepareToPlay];
          [[NSNotificationCenter defaultCenter] addObserver:self 
                               selector:@selector(moviePlayerLoadStateDidChange:) 
                                 name:MPMoviePlayerLoadStateDidChangeNotification 
                                 object:nil];
    }
    
    
    - (void)moviePlayerLoadStateDidChange:(NSNotification *)notification {
      if ([[self.moviePlayerViewController moviePlayer] loadState] == MPMovieLoadStateStalled) {
        NSLog(@"Movie Playback Stalled");
      } else if([[self.moviePlayerViewController moviePlayer] loadState] != MPMovieLoadStateUnknown) {
    
        [[NSNotificationCenter defaultCenter] removeObserver:self
                                name:MPMoviePlayerLoadStateDidChangeNotification
                                object:nil];
    
        [[[self.moviePlayerViewController moviePlayer] view] setFrame:self.view.bounds];
        [[self view] addSubview:[[self.moviePlayerViewController moviePlayer] view]];     
        [[self.moviePlayerViewController moviePlayer] play];
      }
    }
    

    NSMoviePlayerViewController prepareToPlay 方法似乎是这里的关键。我还建议添加其他通知来处理播放完成和播放停止。此外,其中一些代码设计为在窗口的子视图中工作。

    【讨论】:

    • 非常感谢凯尔。今天将实施这一点,并将更新你。
    • 太好了,您应该接受答案,以便其他人知道解决方法!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 2018-09-02
    • 1970-01-01
    • 2013-07-12
    相关资源
    最近更新 更多