我使用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)
}
}
}我该怎么做才能实现无缝循环?提前谢谢。
发布于 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,不断更新队列,使其永不结束。
它无缝地循环,没有任何白色/黑色的斑点。
例如。
private var looper: AVPlayerLooper?
...
let queuePlayer = AVQueuePlayer(playerItem: item)
looper = AVPlayerLooper(player: queuePlayer, templateItem: item)
videoPlayerLayer.player = queuePlayer如果在可重用单元(例如UICollectionView)中这样做,那么确保在单元重复使用之前禁用循环,否则会出现一些模糊的崩溃:
looper?.disableLooping()https://stackoverflow.com/questions/42105431
复制相似问题