ストリーミング バッファが空のときにサーバーに再接続したい。
AVPlayer
またはAVPlayerItem
バッファーが空のときにメソッドをトリガーするにはどうすればよいですか?
playbackLikelyToKeepUp
、playbackBufferEmpty
およびバッファのステータスをチェックするメソッドがあることは知ってplaybackBufferFull
いますが、それらはコールバックではありません。
追加する必要があるコールバック関数やオブザーバーはありますか?
ストリーミング バッファが空のときにサーバーに再接続したい。
AVPlayer
またはAVPlayerItem
バッファーが空のときにメソッドをトリガーするにはどうすればよいですか?
playbackLikelyToKeepUp
、playbackBufferEmpty
およびバッファのステータスをチェックするメソッドがあることは知ってplaybackBufferFull
いますが、それらはコールバックではありません。
追加する必要があるコールバック関数やオブザーバーはありますか?
これらのキーのオブザーバーを追加できます。
[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
}
}
}
これを行うには、Core Audio と CFReadStream にドロップダウンする必要があります。CFReadStream を使用すると、終了の検出、読み取りエラーなどの特定のストリーム イベントで呼び出されるコールバックを提供できます。そこから、サーバーへの再接続をトリガーできます。HTTP ストリームを使用している場合は、範囲ヘッダーを HTTP 要求に追加して、指定したポイント (+ 1 の前に受信した最後のバイト) からストリームを送信するようにサーバーに指示できます。