2012-11-06 33 views
0

我正在制作一个无线电流媒体应用程序,我的应用程序工作正常。我的屏幕上有两个按钮,一个用于播放,另一个用于暂停,另外还有一个标签,用于指示播放器的状态。我没有任何问题,使这个标签显示状态“正在播放”或“已暂停”我的问题是,当我按下播放按钮有一个时间缓冲区正在收集信息,我不能找出一种方式来显示“缓冲......“标签,然后播放器开始流式传输音频。使用MPMoviePlayer缓冲流中的标签

这是用于流式广播电台的代码。

NSString *url = [NSString stringWithFormat:@"http://66.7.218:8816"]; 

     player = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL URLWithString:url]]; 
     player.movieSourceType = MPMovieSourceTypeStreaming; 
     player.view.hidden = YES; 
     [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; 
     [[AVAudioSession sharedInstance]setActive:YES error:nil]; 
     [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 
     [player prepareToPlay]; 

     [player play]; 

我使用了一个函数,我创建了一个名为changeStatus的函数,每秒调用一次该函数来标识播放器的状态。

-(void)changeStatus 
{ 

    if (player.loadState == MPMovieLoadStateUnknown) { 
     status.text = @"Buffering..."; 
    } 
    if(player.playbackState == MPMoviePlaybackStatePlaying) 
     { 
      status.text = @"Playing."; 
     } 
    if(player.playbackState == MPMoviePlaybackStatePaused) 
     { 
      status.text = @"Paused"; 
     } 

} 

我真的需要解决这个问题,我尽我所能解决它。希望你能帮我!提前致谢。

回答

0

我实现了解决问题。缺少的部分是if子句,该子句只在玩家准备玩时才会开始播放信号。如果没有这些,播放器在缓冲区完全加载之前就开始播放,因此它不播放音频。这就是我的播放标签立即显示而不是缓冲的原因。

NSString *url = [NSString stringWithFormat:@"http://66.7.218:8816"]; 

     player = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL URLWithString:url]]; 
     player.movieSourceType = MPMovieSourceTypeStreaming; 
     player.view.hidden = YES; 
     [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; 
     [[AVAudioSession sharedInstance]setActive:YES error:nil]; 
     [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 

     [player prepareToPlay]; 

     if(player.isPreparedToPlay) 
     { 
     [player play]; 
     } 

此外,MPMoviePlaybackStateInterrupted指的是执行流时的缓冲过程。所以如果你想在缓冲过程中发生一些事情,请参考这个方法。

-(void)changeStatus 

    { 

     if(player.playbackState == MPMoviePlaybackStatePlaying) 
      { 
       status.text = @"Playing."; 
      } 
     if(player.playbackState == MPMoviePlaybackStateInterrupted) 
      { 
       status.text = @"Buffering..."; 
      } 

    } 

非常感谢用户那个帮我解决这个问题的人。

+0

嗨,我正面临一个问题。在我的情况下,播放器处于缓冲状态时,播放状态为MPMoviePlaybackStatePaused。我从来没有得到MPMoviePlaybackStateInterrupted状态。请帮助我。 – HarshIT

0

其实有一个名为

MPMediaPlaybackIsPreparedToPlayDidChangeNotification

通知观察员将得到通知后,准备播放。它或多或少具有相同的效果,但具有不同的机制。

+0

感谢您的回答,我最近在XCode中了解了观察者,当时我不知道他们的存在。 –