web-dev-qa-db-ja.com

AVPlayer、再生/一時停止状態の通知?

AVPlayerの再生開始の正確なタイミングを通知する方法を探しています。 「レート」プロパティがありますが、現在、更新を取得するためにNSTimerで定期的にチェックしています。

KVOを試しましたが、KVOに準拠していないようです。

events があるときは、プレーヤー [〜#〜] End [〜#〜] があることを知っています。ここで一時停止について話しています。

私もKVOがAVPlayerItem's "status"をサブスクライブしましたが、HTTPアセットがキャッシュを終了したときに再生/一時停止が表示されません。私はまた、play/pauseのすべての呼び出しの収集を開始し、後でインスタントUI更新を要求しましたが、AVPlayerが実際に再生を開始するまでに、さらにいくつかの実行ループが必要です。ボタンを更新したいすぐに

34
steipete

I OS 1以降の場合AVPlayerの新しいプロパティtimeControlStatusを確認できます。

if(avPlayerObject.timeControlStatus==AVPlayerTimeControlStatusPaused)
{
//Paused mode
}
else if(avPlayerObject.timeControlStatus==AVPlayerTimeControlStatusPlaying)
{
 //Play mode
}
18
The iCoder

なぜ「レート」はKVOの苦情ではないと言うのですか?わたしにはできる。

これが私がしたことです:

- (void)viewDidLoad
{
    ...

    [self.player addObserver:self forKeyPath:@"rate" options:0 context:nil];
}

その後:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if ([keyPath isEqualToString:@"rate"]) {
    if ([self.player rate]) {
        [self changeToPause];  // This changes the button to Pause
    }
    else {
        [self changeToPlay];   // This changes the button to Play
    }
}
}
48
raixer

ビデオの現在の継続時間を追跡するデフォルトのオブザーバーとしてのAVPalyer。ビデオを一時停止または再開すると、1つのグローバル変数を使用して一時停止時間を取得できます(オブザーバー内でその変数を更新します)。

CMTime interval = CMTimeMake(1, 1);

//The capture of self here is coming in with your implicit property access of self.currentduration - you can't refer to self or properties on self from within a block that will be strongly retained by self.

//You can get around this by creating a weak reference to self before accessing timerDisp inside your block
__weak typeof(self) weakSelf = self;

self.timeObserverToken = [_player addPeriodicTimeObserverForInterval:interval queue:NULL usingBlock: ^(CMTime time)
{
    _currentDuration = (int)CMTimeGetSeconds (_player.currentTime);

    if(!_isPlaying)
    {
        _pausedDuration = _currentDuration;
    }
}
6
Kumar Swamy
    player = AVPlayer(url: URL(fileURLWithPath: path))
player.addObserver(self, forKeyPath: "rate", options: NSKeyValueObservingOptions.new, context: nil)

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if keyPath == "rate" {
        if player.rate > 0 {
            print("video started")
        }
    }
}

スウィフトで

1
Jatin Rathod