【问题标题】:Buffering label in a stream using MPMoviePlayer使用 MPMoviePlayer 在流中缓冲标签
【发布时间】:2012-11-06 22:02:31
【问题描述】:

我正在制作一个广播流媒体应用程序,我的应用程序运行良好。我的屏幕上有两个按钮,一个用于播放,另一个用于暂停,还有一个标签,指示播放器的状态。我没有问题让这个标签显示状态“正在播放”或“暂停”我的问题是当我按下播放按钮时,缓冲区有一段时间正在收集信息,我想不出一种方法来显示“ 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";
        }

}

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

【问题讨论】:

    标签: iphone label audio-streaming buffering mpmovieplayer


    【解决方案1】:

    我实现了解决问题。缺少的部分是 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。

    【讨论】:

    • 嗨,我遇到了一个问题。在我的情况下,当播放器正在缓冲时,playbackState 是 MPMoviePlaybackStatePaused。我从来没有得到 MPMoviePlaybackStateInterrupted 的状态。请帮助我。
    【解决方案2】:

    其实有个通知叫

    MPMediaPlaybackIsPreparedToPlayDidChangeNotification

    观察者准备好播放后会收到通知。效果差不多,但作用机制不同。

    【讨论】:

    • 感谢您的回答,我最近正在学习 XCode 中的观察者,当时我不知道它们的存在。
    猜你喜欢
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    • 2012-06-07
    相关资源
    最近更新 更多