как улучшить производительность поиска при использовании avplayer

Я использую AVPlayer для создания видеоплеера, но метод seekToTime довольно медленный. Я впечатлен поисковой производительностью приложения Apple «Фотографии». Кто-нибудь знает, как Apple удалось сделать такой быстрый поиск?

Это как-то связано с нитями? Пробовал ставить вызов seekToTime в очередь отправки, тоже не помогает.


person Zhiqiang Li    schedule 25.05.2015    source источник
comment
Если бы вы предоставили пример кода своей реализации, я думаю, люди лучше знают, что можно улучшить.   -  person kchromik    schedule 01.06.2015
comment
Привет @kcpac, на самом деле я нашел решение. Я пытаюсь позволить пользователю просматривать видео с помощью ползунка. Если я использую seekToTime для очистки, это довольно медленно. Что я должен использовать, так это метод под названием stepByCount из AVPlayerItem   -  person Zhiqiang Li    schedule 02.06.2015


Ответы (2)


Я нашел решение.

Если я использую seekToTime для очистки, это довольно медленно. Я должен использовать метод под названием stepByCount из AVPlayerItem.

person Zhiqiang Li    schedule 02.06.2015
comment
приведите пример [playerItem stepByCount:x];, что нам нужно вместо x, чтобы снова запустить то же видео. - person Lalit Kumar; 07.07.2015

Этот код взят с: https://developer.apple.com/library/archive/qa/qa1820/_index.html

Это немного помогает, и поиск вперед выглядит плавным. Но поиск назад все еще занимает слишком много времени (здесь SeekToTime работает гладко для перемотки вперед, стоп-кадр назад объясняет, почему).

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()
            }
        })
    }
 
}
person Petro Novosad    schedule 23.02.2021