0

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

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

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

}

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

4

2 回答 2

0

我实现了解决问题。缺少的部分是 if 子句,它仅在播放器准备播放时才发出开始播放的信号。否则,播放器会在缓冲区完全加载之前开始播放,因此不会播放音频。这就是我的 Playing 标签立即显示而不是缓冲标签的原因。

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

    }

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

于 2012-11-20T03:21:28.440 回答
0

实际上有一个通知叫做

MPMediaPlaybackIsPreparedToPlayDidChangeNotification

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

于 2013-07-17T02:24:10.253 回答