AVPlayer
再生が停止したか最後に達したかを知る方法はありますか?
11 に答える
次を使用して再生していることがわかります。
AVPlayer *player = ...
if ((player.rate != 0) && (player.error == nil)) {
// player is playing
}
Swift 3拡張機能:
extension AVPlayer {
var isPlaying: Bool {
return rate != 0 && error == nil
}
}
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 を使用する場合は、コントロールが組み込まれています。
アイテムの終わりに到達したことを通知するには ( 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];
}];
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")
}
}
}
}
ありがとうマックスコノバロフ!
答えは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
}