我正在使用 AVPlayer 在后台循环播放本地视频,视频播放正常,但完成视频后需要暂停才能循环播放视频。我尝试了很多方法,也看到了很多关于堆栈溢出的帖子,但我未能找到合适的解决方案。我正在使用 Swift3。
代码在这里:
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。
代码是:
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)
}
}
}
我应该怎么做才能实现无缝循环?提前致谢。
仅供参考,这里有示例代码:https://developer.apple.com/library/content/samplecode/avloopplayer/Introduction/Intro.html https://developer.apple.com/library/content/samplecode/avloopplayer/Introduction/Intro.html
@matt 删除的答案对我来说(在设备/模拟器上)适用于 iOS 10+ 设备:
使用AVPlayerLooper。这正是它的用途。
https://developer.apple.com/reference/avfoundation/avplayerlooper https://developer.apple.com/reference/avfoundation/avplayerlooper
基本上它为你实现了 AVQueuePlayer,不断更新
队列,使其永远不会结束。
它无缝循环,没有任何白/黑斑点。
E.g.
private var looper: AVPlayerLooper?
...
let queuePlayer = AVQueuePlayer(playerItem: item)
looper = AVPlayerLooper(player: queuePlayer, templateItem: item)
videoPlayerLayer.player = queuePlayer
如果您最终在可重复使用的单元中执行此操作(例如UICollectionView
),然后确保在单元重新使用之前禁用循环,否则您会遇到一些不起眼的崩溃:
looper?.disableLooping()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)