2

我試圖在模式視圖控制器內使用MPMoviePlayerController對象播放HTTP實時流式視頻。如果我像這樣運行代碼,一切正常。我收到一條MPMoviePlaybackStatePlaying通知,並播放視頻。MPMoviePlayerController prepareToPlay不支持HTTP實時流式傳輸

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerPlaybackStateDidChange:) name:MPMoviePlayerPlaybackStateDidChangeNotification object:nil]; 

    NSURL *url = [NSURL URLWithString:@"http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"]; 
    self.moviePlayerController = [[[MPMoviePlayerController alloc] initWithContentURL:url] autorelease]; 
    self.moviePlayerController.view.frame = CGRectMake(0,0,320,416); 
    self.moviePlayerController.controlStyle = MPMovieControlStyleNone; 
    self.moviePlayerController.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 
    [self.view addSubview:self.moviePlayerController.view]; 
    self.moviePlayerController.fullscreen = NO; 
    [self.moviePlayerController play]; 
} 

我寧願使用prepareToPlay方法,這樣我就可以顯示負載指示,併爲更好的體驗。但是,我似乎無法得到這個工作。沒有MPMoviePlayerPlaybackStateDidChangeNotification被調用,並且該流不播放。活動指標只是坐在那裏永遠旋轉。

我已確認prepareToPlay確實被調用,但在此之後似乎沒有其他發生。我也確認了這段代碼可以很好地處理本地電影文件。它似乎與HTTP實時流傳輸失敗。任何人都可以看到我做錯了什麼?

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    [self.activityIndicator startAnimating]; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerPlaybackStateDidChange:) name:MPMoviePlayerPlaybackStateDidChangeNotification object:nil]; 

    NSURL *url = [NSURL URLWithString:@"http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"]; 
    self.moviePlayerController = [[[MPMoviePlayerController alloc] initWithContentURL:url] autorelease]; 

    [self registerForMovieNotifications]; 
} 

- (void)registerForMovieNotifications { 
    //movie is ready to play notifications 
    if ([self.moviePlayerController respondsToSelector:@selector(loadState)]) { 
     //this is a 3.2+ device 
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerLoadStateChanged:) name:MPMoviePlayerLoadStateDidChangeNotification object:nil];  
     self.moviePlayerController.movieSourceType = MPMovieSourceTypeStreaming; 
     [self.moviePlayerController prepareToPlay]; 
    } else { 
     //pre-3.2 device 
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePreloadDidFinish:) name:MPMoviePlayerContentPreloadDidFinishNotification object:nil]; 
    } 

    //movie has finished notification 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayBackDidFinish:) name:MPMoviePlayerPlaybackDidFinishNotification object:nil]; 
} 

- (void) moviePlayerPlaybackStateDidChange:(NSNotification*)notification { 
    NSLog(@"playbackDidChanged"); 
    MPMoviePlayerController *moviePlayer = notification.object; 
    MPMoviePlaybackState playbackState = moviePlayer.playbackState; 
    if(playbackState == MPMoviePlaybackStateStopped) { 
     NSLog(@"MPMoviePlaybackStateStopped"); 
    } else if(playbackState == MPMoviePlaybackStatePlaying) { 
     NSLog(@"MPMoviePlaybackStatePlaying"); 
    } else if(playbackState == MPMoviePlaybackStatePaused) { 
     NSLog(@"MPMoviePlaybackStatePaused"); 
    } else if(playbackState == MPMoviePlaybackStateInterrupted) { 
     NSLog(@"MPMoviePlaybackStateInterrupted"); 
    } else if(playbackState == MPMoviePlaybackStateSeekingForward) { 
     NSLog(@"MPMoviePlaybackStateSeekingForward"); 
    } else if(playbackState == MPMoviePlaybackStateSeekingBackward) { 
     NSLog(@"MPMoviePlaybackStateSeekingBackward"); 
    } 
} 

//3.2+ devices 
- (void)moviePlayerLoadStateChanged:(NSNotification*)notification { 
    NSLog(@"load state changed"); 

    //unless state is unknown, start playback 
    if ([self.moviePlayerController loadState] != MPMovieLoadStateUnknown) { 
     [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerLoadStateDidChangeNotification object:nil]; 

     self.moviePlayerController.view.frame = CGRectMake(0,0,320,416); 
     self.moviePlayerController.controlStyle = MPMovieControlStyleNone; 
     self.moviePlayerController.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 
     [self.view addSubview:self.moviePlayerController.view]; 
     self.moviePlayerController.fullscreen = NO; 
     [self.moviePlayerController play]; 
    } 
} 

//pre 3.2 devices 
- (void) moviePreloadDidFinish:(NSNotification*)notification { 
    // Remove observer 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerContentPreloadDidFinishNotification object:nil]; 
    [self.moviePlayerController play]; 
} 

回答

5

我不知道爲什麼,但我可以通過移動線self.moviePlayerController.controlStyle = MPMovieControlStyleNone;moviePlayerLoadStateChanged:的方法來解決這個問題,而進入viewDidLoad方法。

任何人有任何想法,爲什麼這有所作爲?

相關問題