【发布时间】:2016-04-12 10:56:47
【问题描述】:
我去创建AVPlayerItem到AVURLAsset,我的代码:
let asset = AVURLAsset(URL: safeURL, options: [AVURLAssetPreferPreciseDurationAndTimingKey: true])
asset.loadValuesAsynchronouslyForKeys([assetKeyPlayable, self.assetKeyTracks, self.assetKeyHasProtectedContent]) {
() -> Void in
dispatch_async(dispatch_get_main_queue(), {
() -> Void in
// Use the AVAsset playable property to detect whether the asset can be played
if !asset.playable {
let localizedDescription = "Item cannot be played,Item cannot be played description"
let localizedFailureReason = "The assets tracks were loaded, but could not be made playable,Item cannot be played failure reason"
let userInfo = [NSLocalizedDescriptionKey: localizedDescription, NSLocalizedFailureReasonErrorKey: localizedFailureReason]
let error = NSError(domain: "domain", code: 0, userInfo: userInfo)
self.videoPlayerDelegate?.videoPlayer?(self, playerItemStatusDidFail: error)
self.cleanPlayer()
return
}
// At this point we're ready to set up for playback of the asset. Stop observing
if let _ = self.player?.currentItem {
self.cleanPlayer()
}
if asset.URL.absoluteString != safeURL.absoluteString {
return
}
var error: NSError?
let status = asset.statusOfValueForKey(self.assetKeyTracks, error: &error)
var playerItem = AVPlayerItem(URL: safeURL)
if status == .Loaded {
playerItem = AVPlayerItem(asset: asset)
} else {
// You should deal with the error appropriately.If Loaded fails, create an AVPlayerItem directly from the URL
playerItem = AVPlayerItem(URL: safeURL)
}
self.player = self.playerWithPlayerItem(playerItem)
self.registerMonitoring()
self.registerNotification()
self.addTimeObserver()
completionBlock?(loadURLString: playerURL.absoluteString)
})
}
在我的视图中添加AVPlayerLayer显示视频,我的代码:
// MARK: - 属性
var player: AVPlayer? {
get {
return playerLayer.player
}
set {
playerLayer.player = newValue
}
}
var playerLayer: AVPlayerLayer {
return layer as! AVPlayerLayer
}
加载完成后显示视频时
self.videoPlayer?.loadPlayer({
[weak self](loadURLString) in
if let strongSelf = self {
strongSelf.player = strongSelf.videoPlayer?.player
strongSelf.startPlay()
}
})
调用seekToTime方法指定播放:
self.player?.currentItem?.seekToTime(CMTimeMakeWithSeconds(time, Int32(NSEC_PER_SEC)), toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero) {
[weak self] finished in
if let weakSelf = self {
if weakSelf.isPlaying {
weakSelf.videoPlayerDelegate?.videoPlayerDidplayerItemSeekToTime?(weakSelf)
}
}
}
卡住界面的部分图片:
第一张图有声音,但是界面卡住了。
在第二张图片中,视频可以播放,但我没有声音。
我的问题:
完成后调用seekToTime方法时,有时视频有声音,但界面卡住,偶尔视频能正常播放。我尝试调用CALayersetNeedsDisplay 方法来更新AVPlayerLayer 图片,但这并没有帮助。我不知道该怎么办了,我会很感激每一个帮助。
【问题讨论】:
-
香农;我不确定,但也许你的 AVURLAsset 超出了这里的范围; AVPlayer 是一段非常有弹性的代码;有时会让你悬而未决而不是在黑暗中。
-
你应该做的是创建一个非常简单的演示项目,添加一些平淡无奇的资产,并在那里复制问题。您可以在 Dropbox 等上发布该项目,然后寻求帮助进行调试。
标签: ios objective-c swift video avfoundation