Ios 如何在AVPlayer上显示缓冲区进度?
我有一个音乐播放器应用程序,允许用户从服务器流歌曲。我已经能够流从url使用AVPlayer的歌曲。我想实现以下目标: 我试着把这篇文章的答案转换成swift,但是我找不到“kloadeTimeRanges” 这是我的代码:Ios 如何在AVPlayer上显示缓冲区进度?,ios,iphone,progress-bar,audio-streaming,avplayer,Ios,Iphone,Progress Bar,Audio Streaming,Avplayer,我有一个音乐播放器应用程序,允许用户从服务器流歌曲。我已经能够流从url使用AVPlayer的歌曲。我想实现以下目标: 我试着把这篇文章的答案转换成swift,但是我找不到“kloadeTimeRanges” 这是我的代码: override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutable
override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) {
if object as? NSObject == songPlayer && keyPath == "status" {
if songPlayer?.status == AVPlayerStatus.Failed {
println("AVPlayerStatusReadyToFailed")
}else if songPlayer?.status == AVPlayerStatus.ReadyToPlay {
println("AVPlayerStatusReadyToPlay")
self.songPlayer!.play()
}else if songPlayer?.status == AVPlayerStatus.Unknown {
println("AVPlayerStatusReadyToUnknown")
}
}
}
@IBAction func playAction(sender: UIButton) {
var songUrl = "http://a575.phobos.apple.com/us/r1000/119/Music/v4/67/9d/b0/679db0ba-a7f4-35ea-3bf1-e817e7bcf11f/mzaf_3227008615944938675.aac.m4a"
var songPlayerItem = self.songPlayer?.currentItem
self.songPlayer = AVPlayer(URL: NSURL(string: songUrl))
NSNotificationCenter.defaultCenter().addObserver(self, selector: "playerItemDidReachEnd:", name: AVPlayerItemDidPlayToEndTimeNotification, object: self.songPlayer?.currentItem)
self.songPlayer?.addObserver(self, forKeyPath: "status", options: nil, context: nil)
//NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: "updateProgress:", userInfo: nil, repeats: true)
}
override func observeValueForKeyPath(键路径:String,of对象对象:AnyObject,change:[NSObject:AnyObject],上下文:UnsafeMutablePointer){
如果对象为?NSObject==songPlayer&&keyPath==“状态”{
if songPlayer?.status==AVPlayerStatus.Failed{
println(“AVPlayerStatusReadyToFailed”)
}如果是songPlayer?.status==AVPlayerStatus.ReadyToPlay,则为else{
println(“AVPlayerStatusReadyToPlay”)
self.songPlayer!.play()
}如果songPlayer?.status==AVPlayerStatus,则为else。未知{
println(“AVPlayerStatusReadyToUnknown”)
}
}
}
@iAction func playAction(发送方:UIButton){
var songUrl=”http://a575.phobos.apple.com/us/r1000/119/Music/v4/67/9d/b0/679db0ba-a7f4-35ea-3bf1-e817e7bcf11f/mzaf_3227008615944938675.aac.m4a"
var songPlayerItem=self.songPlayer?.currentItem
self.songPlayer=AVPlayer(URL:NSURL(字符串:songUrl))
NSNotificationCenter.defaultCenter().addObserver(self,选择器:“PlayerItemDidReachen:”,名称:AVPlayerItemDidPlayToEndTimeNotification,对象:self.songPlayer?.currentItem)
self.songPlayer?.addObserver(self,forKeyPath:“状态”,选项:nil,上下文:nil)
//scheduledTimerWithTimeInterval(0.1,目标:self,选择器:“updateProgress:”,userInfo:nil,repeats:true)
}
如果有任何建议,我将不胜感激,使用objective c或swift无关紧要
[avPlayerItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew context:nil];
kLoadedTimeRanges可能只是定义为
static NSString *kLoadedTimeRanges = @"loadedTimeRanges";
目标C: 注意:我制作了一个自定义UISlider(),其中添加了一个UIProgressView以显示缓冲区进度。下面代码中显示的
setBufferValue
方法是一个自定义方法,它将设置UIProgressView
值
static void *PlayerViewControllerLoadedTimeRangesObservationContext = &PlayerViewControllerLoadedTimeRangesObservationContext;
[self.playerItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew context:PlayerViewControllerLoadedTimeRangesObservationContext];
- (void)observeValueForKeyPath:(NSString*) path
ofObject:(id)object
change:(NSDictionary*)change
context:(void*)context
{
if (context == PlayerViewControllerLoadedTimeRangesObservationContext) {
NSArray *timeRanges = (NSArray*)[change objectForKey:NSKeyValueChangeNewKey];
if (timeRanges && [timeRanges count]) {
CMTimeRange timerange=[[timeRanges objectAtIndex:0]CMTimeRangeValue];
float bufferTimeValue=CMTimeGetSeconds(timerange.duration)/CMTimeGetSeconds(_player.currentItem.duration);
[self.playerSlider setBufferValue:bufferTimeValue>.95?1:bufferTimeValue animated:YES];
}
}
}
为什么不接受此代码?非常简单和有用。