Подтвердить что ты не робот

Как получить длительность с AVPlayer (не AVAudioPlayer)?

Я хотел бы сделать UISlider (скруббер) для своего AVPlayer. Но поскольку это не AVAudioPlayer, он не имеет встроенной продолжительности. Любое предложение о том, как создать слайдер для быстрой перемотки вперед, перемотки назад и хода воспроизведения?

Я прочитал документ на AVPlayer, у него есть встроенное seekToTime или seekToTime: toleranceBefore: toleranceAfter:. Я этого не понимаю. Будет ли это ответом для моего слайдера? AVPlayer также имеет addPeriodicTimeObserverForInterval: queue: usingBlock:, это для получения продолжительности моего трека? Может ли кто-нибудь дать мне пример о том, как реализовать этот код? Я не являюсь поклонником документации Apple. Кажется очень трудно понять.

4b9b3361

Ответ 1

self.player.currentItem.asset.duration

Получил это!

Ответ 2

заголовки

#import <AVFoundation/AVPlayer.h>
#import <AVFoundation/AVPlayerItem.h>
#import <AVFoundation/AVAsset.h>

код

CMTime duration = self.player.currentItem.asset.duration;
float seconds = CMTimeGetSeconds(duration);
NSLog(@"duration: %.2f", seconds);

рамки

AVFoundation
CoreMedia

Ответ 3

Как и в iOS 4.3, вы можете использовать немного короче:

self.player.currentItem.duration;

Ответ 4

Для быстрого получения продолжительности в секундах

 let duration : CMTime = player.currentItem!.asset.duration
 let seconds : Float64 = CMTimeGetSeconds(duration)
 print(seconds)

Ответ 5

Отмечается StitchedStreamPlayer

Вы должны использовать player.currentItem.duration

- (CMTime)playerItemDuration
{
    AVPlayerItem *thePlayerItem = [player currentItem];
    if (thePlayerItem.status == AVPlayerItemStatusReadyToPlay)
    {        
        /* 
         NOTE:
         Because of the dynamic nature of HTTP Live Streaming Media, the best practice 
         for obtaining the duration of an AVPlayerItem object has changed in iOS 4.3. 
         Prior to iOS 4.3, you would obtain the duration of a player item by fetching 
         the value of the duration property of its associated AVAsset object. However, 
         note that for HTTP Live Streaming Media the duration of a player item during 
         any particular playback session may differ from the duration of its asset. For 
         this reason a new key-value observable duration property has been defined on 
         AVPlayerItem.

         See the AV Foundation Release Notes for iOS 4.3 for more information.
         */     

        return([playerItem duration]);
    }

    return(kCMTimeInvalid);
}

Ответ 6

В этом примере avPlayer является экземпляром AVPlayer.

Я создал видеоконтроль, который использует следующее:

чтобы позиционировать слайдер, используйте что-то подобное, чтобы получить процент воспроизведения в фильме, вам нужно будет повторно запускать эту функцию. Поэтому я бы запускал такую ​​функцию, как:

float scrubberBarLocation = (scrubberBgImageView.frame.size.width / 100.0f) * [self moviePercentage];


- (float)moviePercentage {

    CMTime t1 = [avPlayer currentTime];
    CMTime t2 = avPlayer.currentItem.asset.duration;

    float myCurrentTime = CMTimeGetSeconds(t1);
    float myDuration = CMTimeGetSeconds(t2);

    float percent = (myCurrentTime / myDuration)*100.0f;
    return percent;

}

Затем, чтобы обновить видео, я бы сделал что-то вроде:

- (void)updateVideoPercent:(float)thisPercent {

    CMTime t2 = avPlayer.currentItem.asset.duration;
    float myDuration = CMTimeGetSeconds(t2);

    float result = myDuration * thisPercent /100.0f;

    //NSLog(@"this result = %f",result); // debug

    CMTime seekTime = CMTimeMake(result, 1);

    [avPlayer seekToTime:seekTime];

}