iOS AVPlayer ищет время блокировки в определенных точках - PullRequest
6 голосов
/ 05 октября 2011

Я более или менее использую код отсюда: AVPlayer Video SeekToTime Однако, когда я пытаюсь прокрутить, кажется, что он привязан к определенным моментам времени (в основном, каждый кадр, который находится на второй отметке времени)), поэтому, когда я чищу через скруббер, продолжаю стрелять вперед и назад между тем, где находится мой палец, и последней секундой его прохождения, и видео изменяется только с этими вторыми отметками.

Теперь одно «большое» изменение, которое я сделал, потому что мы хотим плавной прокрутки, заключается в том, что везде, где есть «seekToTime», я заменил его на seekToTime: допуска -.Вам нужна дополнительная информация, пожалуйста, дайте мне знать!Заранее спасибо!

Ответы [ 2 ]

12 голосов
/ 05 октября 2011

см. Код ниже: этот код является частью кода Apple. Пример кода

AVPlayerDemo

Если вы пытаетесь реализовать потоковый проигрыватель, обратитесь к примеру кода ниже.

StitchedStreamPlayer

Кроме того, полный набор инструментов для точной очистки состоит в использовании аналогичного ползунка ниже.потому что отличный видеоплеер должен учитывать UX.как вы знаете, работает приложение видео по умолчанию.когда вы чистите, если ползунок перетаскивания должен быть точной настройкой.

CPSlider | OBSlider

/* The user is dragging the movie controller thumb to scrub through the movie. */
- (IBAction)beginScrubbing:(id)sender
{
    mRestoreAfterScrubbingRate = [mPlayer rate];
    [mPlayer setRate:0.f];

    /* Remove previous timer. */
    [self removePlayerTimeObserver];
}

/* Set the player current time to match the scrubber position. */
- (IBAction)scrub:(id)sender
{
    if ([sender isKindOfClass:[UISlider class]])
    {
        UISlider* slider = sender;

        CMTime playerDuration = [self playerItemDuration];
        if (CMTIME_IS_INVALID(playerDuration)) {
            return;
        } 

        double duration = CMTimeGetSeconds(playerDuration);
        if (isfinite(duration))
        {
            float minValue = [slider minimumValue];
            float maxValue = [slider maximumValue];
            float value = [slider value];

            double time = duration * (value - minValue) / (maxValue - minValue);

            [mPlayer seekToTime:CMTimeMakeWithSeconds(time, NSEC_PER_SEC)];
        }
    }
}

/* The user has released the movie thumb control to stop scrubbing through the movie. */
- (IBAction)endScrubbing:(id)sender
{
    if (!mTimeObserver)
    {
        CMTime playerDuration = [self playerItemDuration];
        if (CMTIME_IS_INVALID(playerDuration)) 
        {
            return;
        } 

        double duration = CMTimeGetSeconds(playerDuration);
        if (isfinite(duration))
        {
            CGFloat width = CGRectGetWidth([mScrubber bounds]);
            double tolerance = 0.5f * duration / width;

            mTimeObserver = [[mPlayer addPeriodicTimeObserverForInterval:CMTimeMakeWithSeconds(tolerance, NSEC_PER_SEC) queue:NULL usingBlock:
            ^(CMTime time)
            {
                [self syncScrubber];
            }] retain];
        }
    }

    if (mRestoreAfterScrubbingRate)
    {
        [mPlayer setRate:mRestoreAfterScrubbingRate];
        mRestoreAfterScrubbingRate = 0.f;
    }
}
3 голосов
/ 02 ноября 2012

Наряду с ответом bitmapdata.com (используя [AVPlayer setRate] вместо pause / seekTime) вам необходимо иметь видео, закодированное с помощью ключевого кадра в каждом кадре. Просто перекодируйте мое видео с этой настройкой, и теперь я могу очень плавно перемещаться по нему!

...