使用avplayer时如何提高seek的性能
how to improve the performance of seek when using avplayer
我正在使用 AVPlayer
创建视频播放器,但是 seekToTime
方法非常慢。 Apple 应用程序 "Photos" 的搜索性能给我留下了深刻的印象。有谁知道 Apple 是如何做到如此快速的搜索的?
跟线程有关系吗?我试图将 seekToTime
调用放入调度队列,它也无济于事。
我找到了解决方案。
如果我使用 seekToTime
进行清理,速度会很慢。我应该使用的是 AVPlayerItem
.
中称为 stepByCount
的方法
此代码取自:https://developer.apple.com/library/archive/qa/qa1820/_index.html
有点帮助,求前途顺利。但是向后查找仍然花费了太多时间(这里解释原因)。
import AVFoundation
class MyClass {
var isSeekInProgress = false
let player = <#A valid player object #>
var chaseTime = kCMTimeZero
// your player.currentItem.status
var playerCurrentItemStatus:AVPlayerItemStatus = .Unknown
...
func stopPlayingAndSeekSmoothlyToTime(newChaseTime:CMTime)
{
player.pause()
if CMTimeCompare(newChaseTime, chaseTime) != 0
{
chaseTime = newChaseTime;
if !isSeekInProgress
{
trySeekToChaseTime()
}
}
}
func trySeekToChaseTime()
{
if playerCurrentItemStatus == .Unknown
{
// wait until item becomes ready (KVO player.currentItem.status)
}
else if playerCurrentItemStatus == .ReadyToPlay
{
actuallySeekToTime()
}
}
func actuallySeekToTime()
{
isSeekInProgress = true
let seekTimeInProgress = chaseTime
player.seekToTime(seekTimeInProgress, toleranceBefore: kCMTimeZero,
toleranceAfter: kCMTimeZero, completionHandler:
{ (isFinished:Bool) -> Void in
if CMTimeCompare(seekTimeInProgress, chaseTime) == 0
{
isSeekInProgress = false
}
else
{
trySeekToChaseTime()
}
})
}
}
我正在使用 AVPlayer
创建视频播放器,但是 seekToTime
方法非常慢。 Apple 应用程序 "Photos" 的搜索性能给我留下了深刻的印象。有谁知道 Apple 是如何做到如此快速的搜索的?
跟线程有关系吗?我试图将 seekToTime
调用放入调度队列,它也无济于事。
我找到了解决方案。
如果我使用 seekToTime
进行清理,速度会很慢。我应该使用的是 AVPlayerItem
.
stepByCount
的方法
此代码取自:https://developer.apple.com/library/archive/qa/qa1820/_index.html
有点帮助,求前途顺利。但是向后查找仍然花费了太多时间(这里
import AVFoundation
class MyClass {
var isSeekInProgress = false
let player = <#A valid player object #>
var chaseTime = kCMTimeZero
// your player.currentItem.status
var playerCurrentItemStatus:AVPlayerItemStatus = .Unknown
...
func stopPlayingAndSeekSmoothlyToTime(newChaseTime:CMTime)
{
player.pause()
if CMTimeCompare(newChaseTime, chaseTime) != 0
{
chaseTime = newChaseTime;
if !isSeekInProgress
{
trySeekToChaseTime()
}
}
}
func trySeekToChaseTime()
{
if playerCurrentItemStatus == .Unknown
{
// wait until item becomes ready (KVO player.currentItem.status)
}
else if playerCurrentItemStatus == .ReadyToPlay
{
actuallySeekToTime()
}
}
func actuallySeekToTime()
{
isSeekInProgress = true
let seekTimeInProgress = chaseTime
player.seekToTime(seekTimeInProgress, toleranceBefore: kCMTimeZero,
toleranceAfter: kCMTimeZero, completionHandler:
{ (isFinished:Bool) -> Void in
if CMTimeCompare(seekTimeInProgress, chaseTime) == 0
{
isSeekInProgress = false
}
else
{
trySeekToChaseTime()
}
})
}
}