使用MPMoviePlayer缓冲流中的标签

时间:2012-11-06 22:02:32

标签: iphone label audio-streaming buffering mpmovieplayer

我正在制作无线电流媒体应用程序,我的应用程序运行正常。我的屏幕上有两个用于播放的按钮,另一个用于暂停,还有一个标签,用于指示播放器的状态。我没有问题,这个标签显示状态“播放”或“暂停”我的问题是,当我按下播放按钮时,有一个时间缓冲区正在收集信息,我无法想出一种方式来显示“缓冲...“播放器开始播放音频之前的标签。

这是Im用于流式传输电台的代码。

 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";
        }

}

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

2 个答案:

答案 0 :(得分:0)

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

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...";
            }

    }

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

答案 1 :(得分:0)

实际上有一个名为

的通知
  

MPMediaPlaybackIsPreparedToPlayDidChangeNotification

观察员在准备好比赛后会收到通知。它或多或少具有相同的效果,但具有不同的机制。