1. ホーム
  2. ios

[解決済み] AVFoundation AVPlayerで動画をループさせる?

2022-05-08 21:15:40

質問

AVFoundationで動画をループさせる比較的簡単な方法はありますか?

AVPlayerとAVPlayerLayerはこのように作成しました。

avPlayer = [[AVPlayer playerWithURL:videoUrl] retain];
avPlayerLayer = [[AVPlayerLayer playerLayerWithPlayer:avPlayer] retain];

avPlayerLayer.frame = contentView.layer.bounds;
[contentView.layer addSublayer: avPlayerLayer];

で動画を再生しています。

[avPlayer play];

動画は正常に再生されますが、最後に止まってしまいます。 MPMoviePlayerController の場合は、その repeatMode プロパティに正しい値を設定してください。 AVPlayerには同様のプロパティがないようです。 また、ムービーが終了したときに教えてくれるコールバックもないようなので、最初に戻って再生することができます。

MPMoviePlayerControllerを使用しないのは、重大な制限があるからです。 複数のビデオストリームを一度に再生できるようにしたいのです。

どのように解決するのですか?

プレーヤーの終了時に通知を受け取ることができます。確認 AVPlayerItemDidPlayToEndTimeNotification

プレーヤーの設定時。

ObjC

  avPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone; 

  [[NSNotificationCenter defaultCenter] addObserver:self
                                           selector:@selector(playerItemDidReachEnd:)
                                               name:AVPlayerItemDidPlayToEndTimeNotification
                                             object:[avPlayer currentItem]];

これにより、最後にプレイヤーが一時停止するのを防ぐことができます。

を通知で表示します。

- (void)playerItemDidReachEnd:(NSNotification *)notification {
    AVPlayerItem *p = [notification object];
    [p seekToTime:kCMTimeZero];
}

をクリックすると、ムービーが巻き戻されます。

プレーヤーを離すときは、通知の登録を解除するのを忘れないでください。

スウィフト

avPlayer?.actionAtItemEnd = .none

NotificationCenter.default.addObserver(self,
                                       selector: #selector(playerItemDidReachEnd(notification:)),
                                       name: .AVPlayerItemDidPlayToEndTime,
                                       object: avPlayer?.currentItem)

@objc func playerItemDidReachEnd(notification: Notification) {
    if let playerItem = notification.object as? AVPlayerItem {
        playerItem.seek(to: kCMTimeZero)
    }
}

Swift 4+

@objc func playerItemDidReachEnd(notification: Notification) {
    if let playerItem = notification.object as? AVPlayerItem {
        playerItem.seek(to: CMTime.zero, completionHandler: nil)
    }
}