16

ストリーミング バッファが空のときにサーバーに再接続したい。

AVPlayerまたはAVPlayerItemバッファーが空のときにメソッドをトリガーするにはどうすればよいですか?

playbackLikelyToKeepUpplaybackBufferEmptyおよびバッファのステータスをチェックするメソッドがあることは知ってplaybackBufferFullいますが、それらはコールバックではありません。

追加する必要があるコールバック関数やオブザーバーはありますか?

4

4 に答える 4

55

これらのキーのオブザーバーを追加できます。

[playerItem addObserver:self forKeyPath:@"playbackBufferEmpty" options:NSKeyValueObservingOptionNew context:nil];
[playerItem addObserver:self forKeyPath:@"playbackLikelyToKeepUp" options:NSKeyValueObservingOptionNew context:nil];

1つ目は、バッファが空のときに警告を発し、2つ目は、バッファが再び使用できるようになったときに警告を発します。

次に、キーの変更を処理するために、次のコードを使用できます。

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
                        change:(NSDictionary *)change context:(void *)context {
    if (!player)
    {
        return;
    }

    else if (object == playerItem && [keyPath isEqualToString:@"playbackBufferEmpty"])
    {
        if (playerItem.playbackBufferEmpty) {
            //Your code here
        }
    }

    else if (object == playerItem && [keyPath isEqualToString:@"playbackLikelyToKeepUp"])
    {
        if (playerItem.playbackLikelyToKeepUp)
        {
            //Your code here
        }
    }
}
于 2011-08-25T19:16:34.143 に答える
2

これを行うには、Core Audio と CFReadStream にドロップダウンする必要があります。CFReadStream を使用すると、終了の検出、読み取りエラーなどの特定のストリーム イベントで呼び出されるコールバックを提供できます。そこから、サーバーへの再接続をトリガーできます。HTTP ストリームを使用している場合は、範囲ヘッダーを HTTP 要求に追加して、指定したポイント (+ 1 の前に受信した最後のバイト) からストリームを送信するようにサーバーに指示できます。

于 2011-08-23T02:18:01.927 に答える