AVPlayerのUISlider(scrubber)を作成したいと思います。ただし、これはAVAudioPlayerではないため、組み込みの期間はありません。再生の早送り、巻き戻し、進行のためのスライダーの作成方法に関する提案はありますか?
私はAVPlayerでドキュメントを読みました。それにはseekToTimeまたはseekToTime:toleranceBefore:toleranceAfter:が組み込まれています。よくわかりません。これは私のスライダーの答えでしょうか? AVPlayerにはaddPeriodicTimeObserverForInterval:queue:usingBlock:もあります。これはトラックの継続時間を取得するためですか?誰かがこのコードを実装する方法の例を教えてもらえますか?私はAppleのドキュメントのファンではありません。理解するのは非常に難しいようです。
self.player.currentItem.asset.duration
とった!
ヘッダー
#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
For Swift秒単位で期間を取得する場合
if let duration = player.currentItem?.asset.duration {
let seconds = CMTimeGetSeconds(duration)
print("Seconds :: \(seconds)")
}
IOS 4.3では、少し短いものを使用できます。
self.player.currentItem.duration;
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);
}
この例では、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];
}