这是Xib的图,不知道怎么直接传工程,知道的朋友可以说一下,我就直接发工程了,仅供参考



#import "PlayerViewController.h"
#import <AVFoundation/AVFoundation.h>
@interface PlayerViewController ()
{BOOL falg;BOOL falg1;AVPlayerLayer *playerLayer;NSString *URLString;UIImageView *media_starImageView;NSString *filePath;NSURL *url;NSString *urlStr;NSArray *arr1;unsigned int i;
}
@property (nonatomic,strong) AVPlayer *player;//播放器对象
@property (weak, nonatomic) IBOutlet UIView *container; //播放器容器
@property (weak, nonatomic) IBOutlet UIButton *playOrPause; //播放/暂停按钮
@property (weak, nonatomic) IBOutlet UIButton *nextButton;//下一集按钮
@property (strong, nonatomic) IBOutlet UISlider *slider;//滑块调整播放进度
@property (weak, nonatomic) IBOutlet UIButton *fullButton;//全屏按钮
@property (weak, nonatomic) IBOutlet UILabel *leftLabel;
@property (weak, nonatomic) IBOutlet UILabel *rightLabel;
@end@implementation PlayerViewController#pragma mark - 控制器视图方法- (void)viewDidLoad {[super viewDidLoad];self.navigationItem.title = @"视频播放器";//初始化视频数组(在线播放)arr1 = @[@"http://123.134.67.201:80/play/BEDF14F6FF4FF604DCCB053EEE20536EB33EFC37.mp4",@"http://221.204.189.54:80/play/0F7758AF15BD3895E07E360C34B95AB42E631487.mp4",@"http://123.134.67.198:80/play/BFD75E46DE50B2D8BBD810F259B2CC892DE9F690.mp4",@"http://123.134.67.197:80/play/4B07614CBE84228E2645AC9F14C4BABFC5E6F0E1.mp4",@"http://58.244.255.12/play/82846AEB3B80981E4A674374C05B3F771144D3AF/1074654_smooth.mp4"];i = 0;//初始化容器self.container.frame = CGRectMake(0, 64, self.view.bounds.size.width, self.view.bounds.size.width);falg = YES;falg1 = YES;[self.playOrPause setImage:[UIImage imageNamed:@"pui_pausebtn_b_disable@2x"] forState:UIControlStateNormal];//创建播放器层[self setupUI];//播放[self.player play];//将底部进度条等视图提前,不然会被播放内容覆盖掉[self.container bringSubviewToFront:_playOrPause];[self.container bringSubviewToFront:_nextButton];[self.container bringSubviewToFront:_leftLabel];[self.container bringSubviewToFront:_slider];[self.container bringSubviewToFront:_rightLabel];[self.container bringSubviewToFront:_fullButton];}-(void)dealloc{[self removeObserverFromPlayerItem:self.player.currentItem];[self removeNotification];
}#pragma mark - 私有方法
-(void)setupUI{//创建播放器层playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];playerLayer.frame = self.container.bounds;playerLayer.videoGravity = AVLayerVideoGravityResize;//视频填充模式[self.container.layer addSublayer:playerLayer];
}/***  截取指定时间的视频缩略图**  @param timeBySecond 时间点*//***  初始化播放器**  @return 播放器对象*/
//初始化播放器
-(AVPlayer *)player{if (!_player) {AVPlayerItem *playerItem=[self getPlayItem:0];_player=[AVPlayer playerWithPlayerItem:playerItem];//给播放器添加进度更新[self addProgressObserver];//给AVPlayerItem添加监控[self addObserverToPlayerItem:playerItem];}return _player;
}/***  根据视频索引取得AVPlayerItem对象**  @param videoIndex 视频顺序索引**  @return AVPlayerItem对象*/
-(AVPlayerItem *)getPlayItem:(int)videoIndex{
#warning 为了节约体积,本地视频没有上传,自己找mp4格式的本地视频//本地播放
//    NSString *file = [[NSBundle mainBundle] pathForResource:@"火影忍者65" ofType:@"mp4"];
//    NSURL *url = [NSURL fileURLWithPath:file];//在线播放urlStr=[NSString stringWithFormat:@"http://123.134.67.201:80/play/BEDF14F6FF4FF604DCCB053EEE20536EB33EFC37.mp4"];url=[NSURL URLWithString:urlStr];AVPlayerItem *playerItem=[AVPlayerItem playerItemWithURL:url];return playerItem;
}
#pragma mark - 通知
/***  添加播放器通知*/
-(void)addNotification{//给AVPlayerItem添加播放完成通知[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackFinished:) name:AVPlayerItemDidPlayToEndTimeNotification object:self.player.currentItem];
}
//移除本地通知
-(void)removeNotification{[[NSNotificationCenter defaultCenter] removeObserver:self];
}/***  播放完成通知**  @param notification 通知对象*/
-(void)playbackFinished:(NSNotification *)notification{NSLog(@"视频播放完成.");
}#pragma mark - 监控
/***  给播放器添加进度更新*/
-(void)addProgressObserver{AVPlayerItem *playerItem = self.player.currentItem;UISlider *slider = self.slider;[slider addTarget:self action:@selector(changeValue:) forControlEvents:UIControlEventValueChanged];__weak PlayerViewController *blockSelf = 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]);[blockSelf leftLabel:[blockSelf convertTime:current]];NSLog(@"当前播放时长%@", [blockSelf convertTime:current]);if (current) {[slider setValue:(current/total) animated:YES];}}];
}
- (void)changeValue:(UISlider *)aSlider
{AVPlayerItem *playerItem = self.player.currentItem;//从当前位置播放[self.player seekToTime:CMTimeMakeWithSeconds(aSlider.value * CMTimeGetSeconds([playerItem duration]), 1)];//机智的暂停,防止造成拖动时进度条卡顿的尴尬(因为AVPlayer这个拖动后会暂停,不会自动播放)[self.player pause];[self.playOrPause setImage:[UIImage imageNamed:@"pui_playbtn_b_disable@2x"] forState:UIControlStateNormal];
}
//计算时间,返回字符串
- (NSString *)convertTime:(CGFloat)second{NSDate *d = [NSDate dateWithTimeIntervalSince1970:second];NSDateFormatter *formatter = [[NSDateFormatter alloc] init];if (second/3600 >= 1) {[formatter setDateFormat:@"01:mm:ss"];} else {[formatter setDateFormat:@"mm:ss"];}NSString *showtimeNew = [formatter stringFromDate:d];return showtimeNew;
}/***  给AVPlayerItem添加监控**  @param playerItem AVPlayerItem对象*/
-(void)addObserverToPlayerItem:(AVPlayerItem *)playerItem{//监控状态属性,注意AVPlayer也有一个status属性,通过监控它的status也可以获得播放状态[playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];//监控网络加载情况属性[playerItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew context:nil];
}
-(void)removeObserverFromPlayerItem:(AVPlayerItem *)playerItem{[playerItem removeObserver:self forKeyPath:@"status"];[playerItem removeObserver:self forKeyPath:@"loadedTimeRanges"];
}
/***  通过KVO监控播放器状态**  @param keyPath 监控属性*  @param object  监视器*  @param change  状态改变*  @param context 上下文*/
//通过KVO监控播放器状态
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{AVPlayerItem *playerItem=object;__weak PlayerViewController *blockSelf = self;if ([keyPath isEqualToString:@"status"]) {AVPlayerStatus status= [[change objectForKey:@"new"] intValue];if(status==AVPlayerStatusReadyToPlay){[blockSelf rightLabel:[blockSelf convertTime:CMTimeGetSeconds(playerItem.duration)]];NSLog(@"视频总时长%@", [blockSelf convertTime:CMTimeGetSeconds(playerItem.duration)]);}}else if([keyPath isEqualToString:@"loadedTimeRanges"]){NSArray *array=playerItem.loadedTimeRanges;CMTimeRange timeRange = [array.firstObject CMTimeRangeValue];//本次缓冲时间范围float startSeconds = CMTimeGetSeconds(timeRange.start);float durationSeconds = CMTimeGetSeconds(timeRange.duration);NSTimeInterval totalBuffer = startSeconds + durationSeconds;//缓冲总长度NSLog(@"视频共缓冲时长%@", [blockSelf convertTime:totalBuffer]);}
}- (void)leftLabel:(NSString *)leftLabelText
{_leftLabel.text = leftLabelText;
}- (void)rightLabel:(NSString *)rightLabelText
{_rightLabel.text = rightLabelText;
}
#pragma mark - UI事件
/***  点击播放/暂停按钮**  @param sender 播放/暂停按钮*/
- (IBAction)playClick:(UIButton *)sender {if(self.player.rate==0){ //说明时暂停[sender setImage:[UIImage imageNamed:@"pui_pausebtn_b_disable@2x"] forState:UIControlStateNormal];[self.player play];}else if(self.player.rate==1){//正在播放[self.player pause];[sender setImage:[UIImage imageNamed:@"pui_playbtn_b_disable@2x"] forState:UIControlStateNormal];}
}
//关闭自动旋转
- (BOOL)shouldAutorotate{return NO;
}
//全屏或退出Button
- (IBAction)fullOrExit:(UIButton *)sender {if (falg) {[sender setImage:[UIImage imageNamed:@"pui_zoomoutbtn@2x"] forState:UIControlStateNormal];falg = !falg;self.container.frame = CGRectMake(0, 0, self.view.bounds.size.height, self.view.bounds.size.width);playerLayer.frame = self.container.bounds;[self.view bringSubviewToFront:self.container];
//        playerLayer.videoGravity = AVLayerVideoGravityResize;//视频填充模式//旋转屏幕,但是只旋转当前的View[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight];self.view.transform = CGAffineTransformMakeRotation(M_PI/2);CGRect frame = [UIScreen mainScreen].applicationFrame;self.view.bounds = CGRectMake(0, 64, frame.size.height, frame.size.width);//隐藏导航栏[[self navigationController] setNavigationBarHidden:YES animated:YES];} else {[sender setImage:[UIImage imageNamed:@"pui_zoominbtn@2x"] forState:UIControlStateNormal];falg = !falg;self.container.frame = CGRectMake(0, 0, self.view.bounds.size.height, self.view.bounds.size.height);playerLayer.frame = self.container.bounds;[self.view bringSubviewToFront:self.container];//旋转屏幕,但是只旋转当前的View[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft];self.view.transform = CGAffineTransformMakeRotation(M_PI*2);CGRect frame = [UIScreen mainScreen].applicationFrame;self.view.bounds = CGRectMake(0, 0, frame.size.height, frame.size.width);//显示导航栏[[self navigationController] setNavigationBarHidden:NO animated:YES];}
}
//下一个视频Button
- (IBAction)nextButton:(UIButton *)sender {i++;[self removeNotification];if (i == arr1.count) {i = 0;}urlStr=[NSString stringWithFormat:arr1[i]];url=[NSURL URLWithString:urlStr];AVPlayerItem *playerItem=[AVPlayerItem playerItemWithURL:url];[self.player replaceCurrentItemWithPlayerItem:playerItem];[self addNotification];}
//点击隐藏或者出现播放进度控制栏
- (IBAction)tapPlayer:(id)sender {if (falg1) {falg1 = !falg1;_playOrPause.hidden = YES;_nextButton.hidden = YES;_slider.hidden = YES;_fullButton.hidden = YES;_leftLabel.hidden = YES;_rightLabel.hidden = YES;} else {falg1 = !falg1;_playOrPause.hidden = NO;_nextButton.hidden = NO;_slider.hidden = NO;_fullButton.hidden = NO;_leftLabel.hidden = NO;_rightLabel.hidden = NO;}}

下面上传图片,只是解压别的软件里面的图片,也不知道上传了能不能下载下来,png的传不上去,就转成jpg的了。

github主页:https://github.com/ShaoWenLe



  

转载于:https://www.cnblogs.com/chushenruhua/p/4359295.html

AVPlayerDemo(视频播放器)相关推荐

  1. python开发视频播放器_python视频播放器

    广告关闭 100GB直播流量包仅需9.9元,10TB点播流量包仅需999元,参与活动还赠移动直播SDK,短视频SDK,小程序插件等,大促100%中奖率 最近研究了python的两个gui包,tkint ...

  2. Qt实用技巧:使用OpenCV库的视频播放器(支持播放器操作,如暂停、恢复、停止、时间、进度条拽托等...

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 需求 使用OpenCV库的视频播放器(支持播放器操作,如暂停.恢复 ...

  3. java视频播放器制作_java创建简易视频播放器

    java创建简易视频播放器 发布时间:2020-09-23 04:28:09 来源:脚本之家 阅读:98 作者:南柯一梦xihe 最近有个多媒体的作业,要求使用visualC++和OpenCV编写一个 ...

  4. 让我为你介绍一个神器:Chimee,一套可扩展的 H5 视频播放器解决方案

    Chimee(读"奇米", [tʃɪ'mɪ:])是由奇舞团开源的一套 H5 视频播放器解决方案,由奇舞团视频云前端团队结合在业务和视频编解码方向的沉淀积累倾心打造. Chimee ...

  5. c#万能视频播放器 (转)

    c#万能视频播放器(附代码) c#万能视频播放器 本人之前很多的文章中均提到了使用libvlc为播放器内核制作的播放器,也许有些朋友对此感兴趣,于是我用c#写了一个调用libvlc api实现的万能视 ...

  6. 【分享】分享一款不错的网页视频播放器

    作为一名前端开发,在做页面时会碰到视频展示,一般都是用 flash 加载视频源文件,可惜功能太少,而且支持的视频格式有限.下面给大家分享一款不错的视频播放器--ckplayer(超酷网页视频播放器). ...

  7. 播放视频android学习笔记---44_在线视频播放器,网络视频解析器,SurfaceView 控件使用方法...

    最近用使开辟的过程中涌现了一个小题问,顺便录记一下因原和法方--播放视频 44_在线视频播放器 ------------------------- 1.注意这里,在模拟器中,android2.2和an ...

  8. Javascript 控制 Flash FLV视频播放器 --国外开源

    制作一个简单的FLV播放器很简单 , 做功能强大的就心有余而力不足了 . 经过google ,找到了一款开源的视频播放器JW_FLV_Player, 也可以当MP3播放器 .  javascritp可 ...

  9. 实现在Android本地视频播放器开发

    在Android本地视频播放器开发中的搜索本地视频章节中,我们能够搜索本地视频并且显示每个视频的图片.标题.时间长度,当然如果需要添加其他的例如视频的长度和宽度可以使用Video类中的方法,既然我们获 ...

最新文章

  1. 毕马威:2018全球科技创新报告(附PDF下载)
  2. Gradle引人注目的特性集
  3. Codeforces Gym101257F:Islands II(求割点+思维)
  4. 不会三种编程语言的不算程序员 走近阿里云 MVP烁淼吐槽大佬
  5. 添加功能与测试点总结
  6. php 嵌套函数公式解析,Pyparsing,使用嵌套解析器解析php函数注释块的内容
  7. java捕获异常和抛出异常_Java捕获多个异常,重新抛出异常
  8. OpenGL蓝宝书第五章代码勘误以及惯性坐标系去解释模型变换:Pyramid.cpp
  9. IntelliJ IDEA导出jar包
  10. java jbutton设置位置_java-将JButton设置为另一个JButton的位置
  11. 数据库系统原理——实验一
  12. 微信调支付宝支付常见问题
  13. 解决Intellij IDEA 一直在indexing....,导致idea很卡,无法操作
  14. 9091端口及8998端口
  15. [机器学习] 信用评分卡中的应用 | 干货
  16. 子网掩码是什么?子网掩码及其CIDR斜杠表示法
  17. python 检测车速_Python+树莓派监测汽车车速
  18. 现在入手5G手机合适吗?
  19. 详解PHP设置定时任务的实现方法
  20. 软件测试配置管理的概念

热门文章

  1. selenium退出浏览器驱动方式
  2. 模糊pid和神经网络pid对比,神经网络pid控制率计算
  3. metasploit使用介绍
  4. ROS实验笔记之——自主搭建四旋翼无人机
  5. 模糊测试-radamsa学习笔记
  6. 来吧,一个IoT应用设计
  7. 【毕业设计】27-基于单片机的家庭监控及防盗报警_热释电报警_人体系统工程设计(原理图+源代码+仿真+实物照片+答辩论文)
  8. word学习/word如何显示空格/LaTeX格式转为Word格式/ latex中的公式格式如何转换成word中的公式格式/excel复制到word表格过大超出
  9. 用VBA摇滚Excel工作表
  10. 【bugku】 web_game1_来啊盖楼啊