随着智能手机的普及,移动应用的发展也越来越快速。iPhone作为全球最热门的智能手机,其应用开发领域也得到了蓬勃发展。而iOS开发,成为了越来越多开发者所追逐的方向。
在移动应用中,视频播放已经成为了用户体验的重要组成部分。而在iOS开发中,avplayer作为一款强大的视频播放器,起到了非常重要的作用。今天,我们就来讲一讲如何使用avplayer播放视频。
一、引入avplayer
avplayer是ios系统提供的播放音视频的框架,它的具体实现是AVPlayer类。在项目中,我们需要通过引入MediaPlayer框架来使用AVPlayer类。
在Xcode工程中,选择Targets->Build Phases->Link Binary With Libraries,然后在弹出的窗口中增加MediaPlayer.framework。
二、创建avplayer实例
在使用avplayer播放视频前,首先我们要创建一个AVPlayer的实例。通过alloc和initWithURL创建即可。
AVPlayer *xplayer=[AVPlayer playerWithURL:self.videoURL];
需要注意的一点是,在创建实例时需要传入视频的URL地址。如果视频地址无效,无论后面如何使用avplayer,视频也将无法播放。
三、创建avplayerlayer并添加到view上
avplayer是一个核心组件,它不能直接被添加到UIView上播放,而应该使用avplayerlayer类,让其作为一个图层进行播放。
AVPlayerLayer * playerLayer = [AVPlayerLayer playerLayerWithPlayer:xplayer];
playerLayer.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 300);
[self.view.layer addSublayer:playerLayer];
在创建avplayerlayer时需要指明该图层所对应的AVPlayer实例,以及图层的frame大小。
四、播放视频
在avplayer实例创建成功之后,调用play方法即可开始播放视频。
[xplayer play];
如果想要停止播放视频,可以使用pause方法。
[xplayer pause];
五、添加视频时间观察器
在实际应用中,我们通常需要对视频的播放时间进行观察和管理。为此,avplayer提供了一个timeObserver属性,它可以对视频时间变化进行观察。
__weak typeof(self) weakSelf = self;
[self.player addPeriodicTimeObserverForInterval:CMTimeMakeWithSeconds(1.0, NSEC_PER_SEC) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {
CGFloat currentSecond = weakSelf.player.currentItem.currentTime.value / weakSelf.player.currentItem.currentTime.timescale;// 计算当前在第几秒
CGFloat totalTime = weakSelf.player.currentItem.duration.value / weakSelf.player.currentItem.duration.timescale;// 视频总时长
weakSelf.progressView.value = currentSecond / totalTime;
weakSelf.slider.value = currentSecond / totalTime;
weakSelf.currentTimeLabel.text = [weakSelf convertTime:currentSecond];//显示已播放时长
weakSelf.totalTimeLabel.text = [weakSelf convertTime:totalTime];//显示视频总时长
}];
使用timeObserver需要注意的是,在观察视频时间变化前,需要先对该属性进行初始化,此处的代码相当于创建一个观察器,每秒更新一次视频时间,并且将已播放时长和视频总时长显示出来。
六、触摸Slider控制视频播放
为了控制视频播放时间,我们通常会使用slider控件。Slider的最小值为0,最大值为视频总时长。通过Drag事件和TouchUpInside事件,可以为Slider添加相应的事件。代码如下:
[self.slider addTarget:self action:@selector(sliderChange:) forControlEvents:UIControlEventValueChanged];
[self.slider addTarget:self action:@selector(sliderChangeEnd:) forControlEvents:UIControlEventTouchUpInside];
- (void)sliderChange:(UISlider *)slider{
[_player pause];
CGFloat totalTime = _player.currentItem.duration.value / _player.currentItem.duration.timescale;
CGFloat dragedSeconds = floorf(totalTime * slider.value);
CMTime dragedCMTime = CMTimeMake(dragedSeconds, 1);
[_player seekToTime:dragedCMTime completionHandler:^(BOOL finished) {
if (finished) {
[_player play];
}
}];
}
- (void)sliderChangeEnd:(UISlider *)slider{
_isDragging = NO;
[_player play];
}
在Slider的ValueChanged事件中,我们暂停视频的播放,并计算出拖动的秒数,使用seekToTime方法跳转到相应的视频时间点。在Slider的TouchUpInside事件中,我们恢复视频的播放。
七、总结
以上就是如何使用avplayer播放视频的方法和技巧。avplayer作为iOS开发中重要的音视频播放扩展,其强大的功能和灵活的接口,能够为开发人员带来更好的用户体验和视听效果。