112

AVPlayer再生が停止したか最後に達したかを知る方法はありますか?

4

11 に答える 11

345

次を使用して再生していることがわかります。

AVPlayer *player = ...
if ((player.rate != 0) && (player.error == nil)) {
    // player is playing
}

Swift 3拡張機能:

extension AVPlayer {
    var isPlaying: Bool {
        return rate != 0 && error == nil
    }
}
于 2012-02-15T06:05:58.107 に答える
61

iOS10 では、このためのビルトイン プロパティがあります: timeControlStatus

たとえば、この関数は、ステータスに基づいて avPlayer を再生または一時停止し、再生/一時停止ボタンを適切に更新します。

@IBAction func btnPlayPauseTap(_ sender: Any) {
    if aPlayer.timeControlStatus == .playing {
        aPlayer.pause()
        btnPlay.setImage(UIImage(named: "control-play"), for: .normal)
    } else if aPlayer.timeControlStatus == .paused {
        aPlayer.play()
        btnPlay.setImage(UIImage(named: "control-pause"), for: .normal)
    }
}

2 番目の質問についてですが、avPlayer が終了したかどうかを知るには、通知を設定するのが最も簡単な方法です。

NotificationCenter.default.addObserver(self, selector: #selector(self.didPlayToEnd), name: .AVPlayerItemDidPlayToEndTime, object: nil)

たとえば、最後に到達したら、ビデオの最初に巻き戻し、一時停止ボタンを再生にリセットできます。

@objc func didPlayToEnd() {
    aPlayer.seek(to: CMTimeMakeWithSeconds(0, 1))
    btnPlay.setImage(UIImage(named: "control-play"), for: .normal)
}

これらの例は、独自のコントロールを作成する場合に役立ちますが、AVPlayerViewController を使用する場合は、コントロールが組み込まれています。

于 2016-12-13T15:43:23.110 に答える
58

アイテムの終わりに到達したことを通知するには ( Apple経由):

[[NSNotificationCenter defaultCenter] 
      addObserver:<self>
      selector:@selector(<#The selector name#>)
      name:AVPlayerItemDidPlayToEndTimeNotification 
      object:<#A player item#>];

再生を追跡するには、次のことができます。

addPeriodicTimeObserverForInterval:queue:usingBlock:またはaddBoundaryTimeObserverForTimes:queue:usingBlock:を使用して、「AVPlayer オブジェクトの再生ヘッドの位置の変更を追跡」します。

例はAppleのものです:

// Assume a property: @property (retain) id playerObserver;

Float64 durationSeconds = CMTimeGetSeconds([<#An asset#> duration]);
CMTime firstThird = CMTimeMakeWithSeconds(durationSeconds/3.0, 1);
CMTime secondThird = CMTimeMakeWithSeconds(durationSeconds*2.0/3.0, 1);
NSArray *times = [NSArray arrayWithObjects:[NSValue valueWithCMTime:firstThird], [NSValue valueWithCMTime:secondThird], nil];

self.playerObserver = [<#A player#> addBoundaryTimeObserverForTimes:times queue:NULL usingBlock:^{
    // Passing NULL for the queue specifies the main queue.

    NSString *timeDescription = (NSString *)CMTimeCopyDescription(NULL, [self.player currentTime]);
    NSLog(@"Passed a boundary at %@", timeDescription);
    [timeDescription release];
}];
于 2011-04-13T23:03:33.160 に答える
6

maxkonovalov の答えの Swift バージョンは次のとおりです。

player.addObserver(self, forKeyPath: "rate", options: NSKeyValueObservingOptions.New, context: nil)

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
    if keyPath == "rate" {
        if let rate = change?[NSKeyValueChangeNewKey] as? Float {
            if rate == 0.0 {
                print("playback stopped")
            }
            if rate == 1.0 {
                print("normal playback")
            }
            if rate == -1.0 {
                print("reverse playback")
            }
        }
    }
}

ありがとうマックスコノバロフ!

于 2016-03-21T19:40:29.953 に答える
2

答えはObjective Cです

if (player.timeControlStatus == AVPlayerTimeControlStatusPlaying) {
    //player is playing
}
else if (player.timeControlStatus == AVPlayerTimeControlStatusPaused) {
    //player is pause
}
else if (player.timeControlStatus == AVPlayerTimeControlStatusWaitingToPlayAtSpecifiedRate) {
    //player is waiting to play
}
于 2019-08-07T09:19:32.033 に答える