web-dev-qa-db-ja.com

(AVAudioPlayerではなく)AVPlayerからDurationを取得する方法は?

AVPlayerのUISlider(scrubber)を作成したいと思います。ただし、これはAVAudioPlayerではないため、組み込みの期間はありません。再生の早送り、巻き戻し、進行のためのスライダーの作成方法に関する提案はありますか?

私はAVPlayerでドキュメントを読みました。それにはseekToTimeまたはseekToTime:toleranceBefore:toleranceAfter:が組み込まれています。よくわかりません。これは私のスライダーの答えでしょうか? AVPlayerにはaddPeriodicTimeObserverForInterval:queue:usingBlock:もあります。これはトラックの継続時間を取得するためですか?誰かがこのコードを実装する方法の例を教えてもらえますか?私はAppleのドキュメントのファンではありません。理解するのは非常に難しいようです。

38
slowman21
self.player.currentItem.asset.duration

とった!

126
slowman21

ヘッダー

#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
35
neoneye

For Swift秒単位で期間を取得する場合

if let duration = player.currentItem?.asset.duration {
    let seconds = CMTimeGetSeconds(duration)
    print("Seconds :: \(seconds)")
}
14
Hardik Thakkar

IOS 4.3では、少し短いものを使用できます。

self.player.currentItem.duration;
11
Douglas

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);
}
4
onmyway133

この例では、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];

}
3
r farnell