1. ホーム
  2. iphone

[解決済み] AVPlayerオブジェクトが再生可能な状態になったかどうかを確認する

2023-05-04 18:14:39

質問

私は MP3 ファイルに渡された UIView に渡されます。 UIView (に格納されている)。 NSURL *fileURL 変数に格納されています)。

を初期化しているのですが AVPlayer を使っています。

player = [AVPlayer playerWithURL:fileURL];

NSLog(@"Player created:%d",player.status);

NSLog は印刷します。 Player created:0, と表示され、まだ再生する準備ができていないことを意味すると思いました。

再生ボタンをクリックすると UIButton をクリックすると、実行されるコードは次のようになります。

-(IBAction)playButtonClicked
{
    NSLog(@"Clicked Play. MP3:%@",[fileURL absoluteString]);

    if(([player status] == AVPlayerStatusReadyToPlay) && !isPlaying)
//  if(!isPlaying)
    {
        [player play];
        NSLog(@"Playing:%@ with %d",[fileURL absoluteString], player.status);
        isPlaying = YES;
    }
    else if(isPlaying)
    {

        [player pause];
        NSLog(@"Pausing:%@",[fileURL absoluteString]);
        isPlaying = NO;
    }
    else {
        NSLog(@"Error in player??");
    }

}

これを実行すると、いつも Error in player?? と表示されます。 しかし、もし私が if をチェックする条件を AVPlayer が再生可能かどうかをチェックするもので、単純な if(!isPlaying) をクリックすると、音楽が再生されます。 UIButton .

コンソールログは

Clicked Play. MP3:http://www.nimh.nih.gov/audio/neurogenesis.mp3
Playing:http://www.nimh.nih.gov/audio/neurogenesis.mp3 **with 0**

Clicked Play. MP3:http://www.nimh.nih.gov/audio/neurogenesis.mp3
Pausing:http://www.nimh.nih.gov/audio/neurogenesis.mp3

Clicked Play. MP3:http://www.nimh.nih.gov/audio/neurogenesis.mp3
2011-03-23 11:06:43.674 Podcasts[2050:207] Playing:http://www.nimh.nih.gov/audio/neurogenesis.mp3 **with 1**

なるほど、SECOND TIMEは player.status は 1 を保持しているようで、これは推測ですが AVPlayerReadyToPlay .

最初に再生ボタンをクリックしたときに、再生が正しく行われるようにするには、どうしたらよいでしょうか。 UIButton ? (つまり、どうすれば AVPlayer が単に作成されただけでなく、再生可能であることを確認するにはどうしたらよいでしょうか?)

どのように解決するのですか?

リモートファイルを再生しています。が表示されるまでに時間がかかることがあります。 AVPlayer が十分なデータをバッファリングし、ファイルを再生できるようになるまでに時間がかかることがあります ( AV Foundation プログラミングガイド )

しかし、再生ボタンをタップする前に、プレーヤーの準備が整うのを待つ必要はないようです。このボタンを無効にして、プレイヤーの準備ができたときだけ有効にするのがいいと思います。

KVOを使用することで、プレーヤーの状態変化を通知することが可能です。

playButton.enabled = NO;
player = [AVPlayer playerWithURL:fileURL];
[player addObserver:self forKeyPath:@"status" options:0 context:nil];   

このメソッドはステータスが変更されたときに呼び出されます。

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
                        change:(NSDictionary *)change context:(void *)context {
    if (object == player && [keyPath isEqualToString:@"status"]) {
        if (player.status == AVPlayerStatusReadyToPlay) {
            playButton.enabled = YES;
        } else if (player.status == AVPlayerStatusFailed) {
            // something went wrong. player.error should contain some information
        }
    }
}