首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >采用AVPlayer- Swift的无缝循环视频

采用AVPlayer- Swift的无缝循环视频
EN

Stack Overflow用户
提问于 2017-02-08 05:32:35
回答 1查看 7.3K关注 0票数 3

我使用AVPlayer在后台播放本地视频,使用循环,视频播放很好,但在完成视频后,需要暂停播放循环视频。我尝试过很多方法,也见过很多关于堆栈溢出的帖子,但是我没有找到合适的解决方案。我正在使用Swift3。

代码在这里:

代码语言:javascript
复制
var videoplayer :AVPlayer = AVPlayer()

override func viewDidLoad() {
super.viewDidLoad()

let path = Bundle.main.path(forResource: "background4", ofType: "mp4")
        videoplayer = AVPlayer(url: URL(fileURLWithPath: path!))
        videoplayer.volume = 0     
        videoplayer.actionAtItemEnd = AVPlayerActionAtItemEnd.none;

        let playerLayer = AVPlayerLayer(player: videoplayer)
        playerLayer.frame = self.view.frame
        playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill

        if (videoplayer.rate != 0) {
            print("playing videoplayer")
            self.blurBgImage.isHidden = true
        }

        playerLayer.zPosition = -1
        videoplayer.rate = 0
        videoplayer.play()
        self.blurBgImage.layer.addSublayer(playerLayer)

 NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: videoplayer.currentItem, queue: nil, using: { (_) in
        DispatchQueue.main.async {

             let t1 = CMTimeMake(5, 100)
            self.videoplayer.seek(to: t1)
            self.videoplayer.play()
        }
    })
}

我也尝试过AVPlayerLooper。守则是:

代码语言:javascript
复制
 var playerLooper: NSObject?
var playerLayer:AVPlayerLayer!
var queuePlayer: AVQueuePlayer?

 func playVideo(_ filmName: String){
       if let path = Bundle.main.path(forResource: filmName, ofType: "mp4")        let url =  URL(fileURLWithPath: path)
         if #available(tvOS 10.0, *) {
          let playerItem = AVPlayerItem(url: url as URL)
            self.videoplayer = AVQueuePlayer(items: [playerItem])
            self.playerLayer = AVPlayerLayer(player: self.videoplayer)
            self.playerLooper = AVPlayerLooper(player: self.videoplayer as! AVQueuePlayer, templateItem: playerItem)
            self.blurBgImage.layer.addSublayer(playerLayer!)
            self.playerLayer?.frame = self.view.frame
            self.videoplayer.volume = 10
            self.videoplayer.play()
        } else {
            videoplayer = AVPlayer(url: url)
            videoplayer.play()
            loopVideo(videoplayer)
        }
}
}

我该怎么做才能实现无缝循环?提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2017-05-30 19:49:23

这里有示例代码:https://developer.apple.com/library/content/samplecode/avloopplayer/Introduction/Intro.html

@matt删除的答案对我(在设备/模拟器上)对于iOS 10+设备来说很好:

使用AVPlayerLooper。这正是它的目的。 https://developer.apple.com/reference/avfoundation/avplayerlooper 基本上,它为您实现AVQueuePlayer,不断更新队列,使其永不结束。

它无缝地循环,没有任何白色/黑色的斑点。

例如。

代码语言:javascript
复制
private var looper: AVPlayerLooper?

...

let queuePlayer = AVQueuePlayer(playerItem: item)
looper = AVPlayerLooper(player: queuePlayer, templateItem: item)
videoPlayerLayer.player = queuePlayer

如果在可重用单元(例如UICollectionView)中这样做,那么确保在单元重复使用之前禁用循环,否则会出现一些模糊的崩溃:

代码语言:javascript
复制
looper?.disableLooping()
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42105431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档