为什么 iOS 中的 avplayer 时间不正确
Why the avplayer time is incorrect in iOS
我的公司需要一个视频应用程序,所以我昨天开始工作。
你可以看到这段avplayer的代码:
// to get palying time
-(void)addProgressObserver{
__weak typeof(self) weakSelf = self ;
//这里设置每秒执行一次
[self.player addPeriodicTimeObserverForInterval:CMTimeMake(1.0, 1.0) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {
double current=weakSelf.player.currentItem.duration.value/weakSelf.player.currentItem.duration.timescale*1.0;
weakSelf.playerProgressDuration = current ;
}];
}
// to get total time
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
AVPlayerItem *playerItem=object;
if ([keyPath isEqualToString:@"status"]) {
AVPlayerStatus status= [[change objectForKey:@"new"] intValue];
if(status==AVPlayerStatusReadyToPlay){
self.playerTotalDuration = playerItem.duration.value / playerItem.duration.timescale * 1.0 ;
}
}
}
您可以看到这段代码。
方法'addProgressObserver'可以获得播放时间:
weakSelf.playerProgressDuration = current ;
KVO方法可以监听一个属性(属性的名字是'status'),得到视频的总时长:
self.playerTotalDuration = playerItem.duration.value / playerItem.duration.timescale * 1.0 ;
但是,构建此代码和 运行 ipad 3 (ios 8.1),我发现了一个问题:
视频播放完毕,但是self.playerProgressDuration不能等于self.playerTotalDuration!
所以我添加了一个通知:AVPlayerItemDidPlayToEndTimeNotification,但是通知无法执行!
问题:
1、视频播放完毕,为什么self.playerProgressDuration不能等于self.playerTotalDuration?
2、视频播放完成,为什么没有执行通知?
请帮助我,谢谢。
回答:
1、请使用double或int_64;
2、因为通知的对象存在错误!请将通知对象设置为nil或AVPlayerItem,不能将AVPlayer设置为通知对象!
我的公司需要一个视频应用程序,所以我昨天开始工作。
你可以看到这段avplayer的代码:
// to get palying time
-(void)addProgressObserver{
__weak typeof(self) weakSelf = self ;
//这里设置每秒执行一次
[self.player addPeriodicTimeObserverForInterval:CMTimeMake(1.0, 1.0) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {
double current=weakSelf.player.currentItem.duration.value/weakSelf.player.currentItem.duration.timescale*1.0;
weakSelf.playerProgressDuration = current ;
}];
}
// to get total time
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
AVPlayerItem *playerItem=object;
if ([keyPath isEqualToString:@"status"]) {
AVPlayerStatus status= [[change objectForKey:@"new"] intValue];
if(status==AVPlayerStatusReadyToPlay){
self.playerTotalDuration = playerItem.duration.value / playerItem.duration.timescale * 1.0 ;
}
}
}
您可以看到这段代码。 方法'addProgressObserver'可以获得播放时间:
weakSelf.playerProgressDuration = current ;
KVO方法可以监听一个属性(属性的名字是'status'),得到视频的总时长:
self.playerTotalDuration = playerItem.duration.value / playerItem.duration.timescale * 1.0 ;
但是,构建此代码和 运行 ipad 3 (ios 8.1),我发现了一个问题:
视频播放完毕,但是self.playerProgressDuration不能等于self.playerTotalDuration!
所以我添加了一个通知:AVPlayerItemDidPlayToEndTimeNotification,但是通知无法执行!
问题: 1、视频播放完毕,为什么self.playerProgressDuration不能等于self.playerTotalDuration? 2、视频播放完成,为什么没有执行通知?
请帮助我,谢谢。
回答: 1、请使用double或int_64; 2、因为通知的对象存在错误!请将通知对象设置为nil或AVPlayerItem,不能将AVPlayer设置为通知对象!