3

Apple のAVPlayerDemoサンプル プロジェクトの AVPlayerDemoPlaybackViewController に設定mPlayer.usesExternalPlaybackWhileExternalScreenIsActiveした後、AppleTV で遅れないようにスクラブを調整するにはどうすればよいですか?YES

つまり、スライダーを非常に速く前後に動かすと、AppleTV はすべてのseekToTime操作を実行しますが、ユーザーがスライドするよりも時間がかかります。

デモの問題の 1 つは、「Touch Drag Inside」イベントと「Value Changed」イベントの両方を使用しているため、同じ値が 2 回送信されることです。「Value Changed」を削除すると、少し改善されますが、それでも遅れます。

秒単位に丸めてから、秒seekToTimeが変わったときにのみ送信しようとしましたが、それほど役に立たないようです。私が実際に行う必要があるのは、ユーザーがスライダーを速く動かすほど少ないコマンドを送信することですが、ユーザーの動きが遅いほど多くのコマンドを送信することです。

これを達成する方法についてのアイデアはありますか?

4

2 に答える 2

4

UISlider は、すでにいくらかそれ自体を抑制しています。移動速度が速ければ速いほど、ポイント A からポイント B に到達する値が少なくなります。これは、シーク操作が AirPlay でスタックするのを止めるのに十分ではありません。

ただし、 を使用しseekToTime:completionHandler:て、次のようにスタックアップを防ぐことができます。

if(seeking) {
    return;
}

seeking = YES;
[player seekToTime:CMTimeMakeWithSeconds(time, NSEC_PER_SEC) completionHandler:^(BOOL finished) {
    seeking = NO;
}];

これにより、進行中のシークが終了するまで、新しいシークがドロップされます。これはうまくいくようです。ユーザーがスクラブを停止した後、最後のシーク操作を送信する必要があるだけです。

NSTimer は同じことを行うことができますが、精度が低く、結果は接続の待ち時間によって異なります。この方法で使用される completionHandler は、待ち時間に関係なく、シークがスタックしないようにします。

また、UISlider の「Value Changed」アクションは、タッチ開始アクションの前に発生する可能性があることもわかりました。そのため、代わりに、タッチ開始後に発生することが保証されているタッチ ドラッグ インサイド/アウトサイド アクションを使用することをお勧めします。

于 2013-02-19T23:39:20.993 に答える