AVPlayer自定制视频播放器(1)——视频播放器基本实现
在iOS多媒体开发的过程中,经常会用到视频播放器,简单是视频播放器,直接使用苹果封装好的MPMoviePlayerController和MPMoviePlayerViewController就可以实现视频播放功能了,但是,多数情况下,都需要自定制视频播放器,这是,就要使用神器AVPlayer来进行开发了,下面,就讲述一下AVPlayer的使用,这里列出两篇比较好的博客,供大家参考:
iOS开发系列--音频播放、录音、视频播放、拍照、视频录制
<span style="font-size:18px;">#import <AVFoundation/AVFoundation.h></span>
<span style="font-size:18px;">@property (nonatomic,strong) AVPlayer * player;</span>
<span style="font-size:18px;"> //网络视频NSString * urlStr = [NSString stringWithFormat:@"http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"];urlStr = [urlStr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];NSURL * url = [NSURL URLWithString:urlStr];</span>
<span style="font-size:18px;">self.player = [[AVPlayer alloc] initWithURL:url];</span>
<span style="font-size:18px;">@property (nonatomic,strong) AVPlayerLayer * playerLayer;</span>
<span style="font-size:18px;"> self.player = [[AVPlayer alloc] initWithURL:url];self.playerLayer.frame = self.layer.bounds;self.playerLayer.videoGravity = AVLayerVideoGravityResizeAspect;[self.layer addSublayer:self.playerLayer];</span>
<span style="font-size:18px;">@property (nonatomic,strong) AVPlayerItem * playerItem;</span>
然后,在.m文件中进行下面的操作:
<span style="font-size:18px;"> AVURLAsset * movieAsset = [[AVURLAsset alloc] initWithURL:URL options:nil];self.playerItem = [AVPlayerItem playerItemWithAsset:movieAsset];self.player = [AVPlayer playerWithPlayerItem:self.playerItem];self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];self.playerLayer.frame = self.layer.bounds;self.playerLayer.videoGravity = AVLayerVideoGravityResizeAspect;[self.layer addSublayer:self.playerLayer];</span>
<span style="font-size:18px;"> /*** 监听AVPlayerItem的属性*/[self.playerItem addObserver:self forKeyPath:@"status" options:0 context:NULL];[self.playerItem addObserver:self forKeyPath:@"loadedTimeRanges" options:0 context:NULL];self.player = [AVPlayer playerWithPlayerItem:self.playerItem];
</span>
<span style="font-size:18px;">/*** KVO监听playItem的属性变化** @param keyPath keyPath description* @param object object description* @param change change description* @param context context description*/
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{AVPlayerItem * item = self.player.currentItem;if ([keyPath isEqualToString:@"status"]) {//正在播放if (AVPlayerItemStatusReadyToPlay == item.status) {NSLog(@"正在播放...,视频总长度:%.2f",CMTimeGetSeconds(item.duration));}else if (AVPlayerItemStatusUnknown == item.status){NSLog(@"视频加载中");}else if (AVPlayerStatusFailed == item.status){NSLog(@"视频获取失败");NSLog(@"%@",item.error);}} else if([keyPath isEqualToString:@"loadedTimeRanges"]){NSArray *array=item.loadedTimeRanges;CMTimeRange timeRange = [array.firstObject CMTimeRangeValue];//本次缓冲时间范围float startSeconds = CMTimeGetSeconds(timeRange.start);float durationSeconds = CMTimeGetSeconds(timeRange.duration);NSTimeInterval totalBuffer = startSeconds + durationSeconds;//缓冲总长度NSLog(@"共缓冲:%.2f",totalBuffer);}
}</span>
<span style="font-size:18px;"> [self.player play];</span>
<span style="font-size:18px;">//移除观察者
-(void)removeObserverFromPlayerItem:(AVPlayerItem *)playerItem{[playerItem removeObserver:self forKeyPath:@"status"];[playerItem removeObserver:self forKeyPath:@"loadedTimeRanges"];
}</span>
<span style="font-size:18px;">/*** 添加播放器通知*/
-(void)addNotification{//给AVPlayerItem添加播放完成通知[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackFinished:) name:AVPlayerItemDidPlayToEndTimeNotification object:self.player.currentItem];
}</span>
<span style="font-size:18px;">- (void)playbackFinished:(NSNotification *)notification{[self.playButton setImage:[UIImage imageNamed:@"button_normal"] forState:UIControlStateNormal];}</span>
<span style="font-size:18px;"> [self removeNotification];</span>
<span style="font-size:18px;">//当前播放进度
@property (nonatomic,assign) double currentTime;</span>
<span style="font-size:18px;">/*** 开始播放*/
- (void)play{AVPlayerItem * item = self.player.currentItem;
// [item seekToTime:CMTimeMakeWithSeconds(0, 1.0)];[item seekToTime:CMTimeMakeWithSeconds(0, 1.0) toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];self.progressBar.value = 0;[self.player play];//设置播放速度
}</span>
<span style="font-size:18px;">/*** 暂停播放*/
- (void)pause{self.currentTime = [self playableCurrentTime];[self.player pause];//设置播放按钮[self.playButton setImage:[UIImage imageNamed:@"button_normal"] forState:UIControlStateNormal];
}</span>
<span style="font-size:18px;">/*** 继续播放*/
- (void)resume{AVPlayerItem * item = self.player.currentItem;
// [item seekToTime:CMTimeMakeWithSeconds(self.currentTime, 1.0)];[item seekToTime:CMTimeMakeWithSeconds(self.currentTime, 1.0) toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];[self.player play];//设置播放速度self.player.rate = self.rate;
}</span>
<span style="font-size:18px;">/*** 停止*/
- (void)stop{AVPlayerItem * item = self.player.currentItem;
// [item seekToTime:CMTimeMakeWithSeconds(0, 1.0)];[item seekToTime:CMTimeMakeWithSeconds(0, 1.0) toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];[self.player pause];self.currentTime = 0;}</span>
//音量
@property (nonatomic,assign) float volumn;
<span style="font-size:18px;">/*** 设置静音** @param mute 静音传入的一个BOOL值,YES为静音,NO不静音*/
- (void)playerMute:(BOOL)mute{if (mute) {[self.player setVolume:0];} else {[self.player setVolume:self.volumn];}
}</span>
<span style="font-size:18px;">/*** 进度更新设置,监听视频播放进度,同时更新进度条的value*/
- (void)addProgressBarObserver{AVPlayerItem *playerItem=self.player.currentItem;__weak typeof(self) weakSelf = self;[self.player addPeriodicTimeObserverForInterval:CMTimeMake(1.0, 1.0) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {float current = CMTimeGetSeconds(time);float total = CMTimeGetSeconds([playerItem duration]);if (current) {[weakSelf.progressBar setValue:(current/total) animated:YES];}}];
}</span>
<span style="font-size:18px;">- (id)addPeriodicTimeObserverForInterval:(CMTime)interval queue:(nullable dispatch_queue_t)queue usingBlock:(void (^)(CMTime time))block;</span>
这个方法的前一个参数还是CMTime类型的,后面是一个block,表示每个interval的时间,就回调一下这个block,这样的话,我们就可以在这里通过播放进度和总时长,来设置进度条的value值了。
通过以上的方法,基本上就能实现一个简单的视频播放器了,可能有些地方说的不好或者说法有误,欢迎大家在下面进行评论,指出我的错误,大家共同进步。想进一步了解视频播放器的内容,欢迎阅读下一篇博客:
AVPlayer自定制视频播放器(2)——耳机线控、中断以及AVAudioSession的使用
AVPlayer自定制视频播放器(1)——视频播放器基本实现相关推荐
- AVPlayer自定制视频播放器(2)——耳机线控、中断以及AVAudioSession的使用
在上一篇博客中说到了使用AVPlayer进行自定义视频播放器.这里讲继续讲述视频播放器的自定制.下面是上一篇博客的链接,本篇博客将承接上一篇博客进行讲解,如果有AVPlayer自定制视频播放器基础的同 ...
- Qt实用技巧:使用OpenCV库的视频播放器(支持播放器操作,如暂停、恢复、停止、时间、进度条拽托等...
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 需求 使用OpenCV库的视频播放器(支持播放器操作,如暂停.恢复 ...
- android vr播放器 开发,Android应用开发之Android VR Player(全景视频播放器)- ExoPlayer播放器MPEG-DASH视频播放...
本文将带你了解Android应用开发之Android VR Player(全景视频播放器)- ExoPlayer播放器MPEG-DASH视频播放,希望本文对大家学Android有所帮助. Androi ...
- 基于qt开发的智能系统:电子相册,监控摄像头模块,音乐播放器,视频播放器,电子时钟
登录模块 源码请移步 //登录验证按钮函数 void MainWindow::on_loginBtn_clicked() {//获得userNameLEd输入框的文本userNameLEd->t ...
- 安卓视频播放器 一行代码快速实现视频播放,Android视频播放,AndroidMP3播放,安卓视频播放一行代码搞定,仿今日头条 Android视频播放器
一行代码快速实现视频播放,Android视频播放,AndroidMP3播放,安卓视频播放一行代码搞定,真正实现Android的全屏功能 github地址:https://github.com/qius ...
- html做全景视频播放器,一种全景视频播放方法及播放器的制造方法
一种全景视频播放方法及播放器的制造方法 [技术领域] [0001]本发明涉及视频播放领域,尤其涉及一种全景视频播放方法及播放器. [背景技术] [0002]随着近年来视频拍摄技术的发展,全景图片.全景 ...
- jqm视频播放器,html5视频播放器,html5音乐播放器,html5播放器,video开发demo,html5视频播放示例,html5手机视频播放器
最近在论坛中看到了很多实用html5开发视频播放,音乐播放的功能,大部分都在寻找答案.因此我就在这里做一个demo,供大家相互学习.html5开发越来越流行了,而对于视频这一块也是必不可少的一部分.如 ...
- Android制作简易的音乐播放器和视频播放器
文章目录 制作简易的音乐播放器和视频播放器 播放多媒体文件 播放音频 MediaPlayer的工作流程 项目示例 播放视频 项目示例 制作简易的音乐播放器和视频播放器 播放多媒体文件 Android在 ...
- iOS开发之AVPlayer的精彩使用---网易新闻视频播放界面的另类实现
遇到个需求需要涉及到视频播放,那么没办法,先找资料开始进一步了解下这个不熟悉的东西 . 一个是 MP ,一个 是AV,MP是封装好的,用起来非常简单,但是自定义样式就基本不可能了.AVPlayer存在 ...
最新文章
- 非抢占式优先算法例题_三维点云的经典算法与前沿技术有哪些?
- 学python可以做什么知乎-学会python有哪些好处?python抓取知乎神回复
- fopen需要改写成fopen_s的时候
- iOS UISegmentedControl 的使用
- android 界面跳转封装,【Android】Fragment跳转系列
- 用uGUI开发自定义Toggle Slider控件
- pyQt显示系统文件目录
- 经典算法大全之河内之塔
- 互动教程 for Excel 2016
- 没有提取码怎么获取百度网盘资源?
- 2017.4.8微软笔试题
- ERP和SAP是什么意思
- 服务器系统分辨率调不了,win10系统分辨率调整显示灰色_网站服务器运行维护
- adb 查看浏览器内核版本
- 一张思维导图完成淘宝精细化运营
- alios 系统配置转存到一个头文件
- 制作自定义图标(icon)
- Minecraft基岩版电脑端游戏按键整合
- java日期格式化为json字符串,看这个就够了
- Java生成名片式的二维码源码分享
热门文章
- 模拟电路复习--总结
- 【转载】关于模拟电路的学习历程
- java基础项目_Java 教程整理:基础、项目全都有
- 在Oracle中巧用column_value解决游标传入多值问题
- SpringBoot+shiro 实现rememberMe
- 【3D实践】3D模型骨架提取及分析
- 《富爸爸的财富自由之路》
- 当删除后微软再次出现如何再次关掉微软输入法
- odbc java 驱动程序_java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 在指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配...
- Ubuntu给clion添加快捷图标