【问题标题】:Is there a way to make a video repeat in swift?有没有办法让视频快速重复?
【发布时间】:2022-01-28 02:37:46
【问题描述】:

我在 viewController() 中添加了一个视频作为背景,我想循环播放它,或者换句话说,让它永远重复。 以下是全部代码:

import UIKit
import AVKit
import AVFoundation

class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
}
override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(true)
    let player = AVPlayer(url: URL(fileURLWithPath: Bundle.main.path(forResource: "background", ofType: "mp4")!))
    let layer = AVPlayerLayer(player: player)
    layer.frame = view.bounds
    layer.videoGravity = .resizeAspectFill
    layer.repeatCount = .greatestFiniteMagnitude
    layer.repeatDuration = .greatestFiniteMagnitude
    
    view.layer.addSublayer(layer)
    player.play()

}

}

当我运行应用程序时,它只播放一次,从不重复。 有什么建议?谢谢。

【问题讨论】:

    标签: ios swift xcode


    【解决方案1】:

    一种解决方案是观察AVPlayerItemDidPlayToEndTime,然后简单地重新启动视频。

    NotificationCenter.default.addObserver(
        forName: .AVPlayerItemDidPlayToEndTime, 
        object: player.currentItem, 
        queue: .main
    ) { [weak player] _ in
        player?.seek(to: .zero)
        player?.play()
    }
    

    不要忘记在不再需要时将其分离。

    【讨论】:

      【解决方案2】:

      使用 AVPlayerLooper。它的名字告诉你这正是它的用途。

      https://developer.apple.com/documentation/avfoundation/avplayerlooper

      【讨论】:

        【解决方案3】:

        几个厘米。

        1. 根据 AVPlayerLayer 文档:设置一个或另一个。两者都不是。

        如果同时指定了repeatDuration 和repeatCount,则行为是 未定义。

        1. 总的来说,我一直在努力让 AVPlayerLayer 使用 repeatCount 或 repeatDuration 方式重复 mp4。相反,我将 AVQueuePlayer 与 AVPlayerLooper 一起使用。归功于:https://developer.apple.com/forums/thread/658909
            import AVFoundation
            var playerQueue: AVQueuePlayer!
            var playerLayer: AVPlayerLayer!
            var playerLooper: AVPlayerLooper!
        
            private func configLooper(file: String, ext: String) {
                guard let videoURL = Bundle.main.url(forResource: file, withExtension: ext) else { return }
        
                playerQueue = AVQueuePlayer()
                playerLayer = AVPlayerLayer(player: playerQueue)
                let playerItem = AVPlayerItem(url: videoURL)
                playerLooper = AVPlayerLooper(player: playerQueue, templateItem: playerItem)
                playerLayer.frame = view.bounds
                playerLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
                view.layer.insertSublayer(playerLayer, below: someOtherView.layer)
                playerQueue.play()
            }
        

        【讨论】:

          猜你喜欢
          • 2012-09-01
          • 2010-11-06
          • 2017-03-26
          • 1970-01-01
          • 2016-04-05
          • 1970-01-01
          • 2013-05-17
          • 1970-01-01
          相关资源
          最近更新 更多