AVPlayerDemo(视频播放器)

AVPlayerDemo(视频播放器)

2023年7月11日发(作者:)

AVPlayerDemo(视频播放器)这是Xib的图,不知道怎么直接传⼯程,知道的朋友可以说⼀下,我就直接发⼯程了,仅供参考#import "PlayerViewController.h"#import @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]; = @"视频播放器"; //初始化视频数组(在线播放) arr1 = @[@"123.134.67.201:80/play/4", @"221.204.189.54:80/play/4", @"123.134.67.198:80/play/4", @"123.134.67.197:80/play/4", @"58.244.255.12/play/82846AEB3B80981E4A674374C05B3F771144D3AF/1074654_4"]; i = 0;

//初始化容器 = CGRectMake(0, 64, , ); falg = YES; falg1 = YES; [Pause setImage:[UIImage imageNamed:@"pui_pausebtn_b_disable@2x"] forState:UIControlStateNormal]; //创建播放器层 [self setupUI]; //播放 [ play];

//将底部进度条等视图提前,不然会被播放内容覆盖掉 [ner bringSubviewToFront:_playOrPause]; [ner bringSubviewToFront:_nextButton]; [ner bringSubviewToFront:_leftLabel]; [ner bringSubviewToFront:_slider]; [ner bringSubviewToFront:_rightLabel]; [ner bringSubviewToFront:_fullButton];

}-(void)dealloc{ [self removeObserverFromPlayerItem:tItem]; [self removeNotification];}#pragma mark - 私有⽅法-(void)setupUI{ //创建播放器层 playerLayer = [AVPlayerLayer playerLayerWithPlayer:]; = ; ravity = AVLayerVideoGravityResize;//视频填充模式 [ 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:@"123.134.67.201:80/play/4"]; 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:tItem];}//移除本地通知-(void)removeNotification{ [[NSNotificationCenter defaultCenter] removeObserver:self];}/** * 播放完成通知 * * @param notification 通知对象 */-(void)playbackFinished:(NSNotification *)notification{ NSLog(@"视频播放完成.");}#pragma mark - 监控/** * 给播放器添加进度更新 */-(void)addProgressObserver{ AVPlayerItem *playerItem = tItem; UISlider *slider = ; [slider addTarget:self action:@selector(changeValue:) forControlEvents:UIControlEventValueChanged]; __weak PlayerViewController *blockSelf = self; //这⾥设置每秒执⾏⼀次 [ 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 = tItem; //从当前位置播放 [ seekToTime:CMTimeMakeWithSeconds( * CMTimeGetSeconds([playerItem duration]), 1)]; //机智的暂停,防⽌造成拖动时进度条卡顿的尴尬(因为AVPlayer这个拖动后会暂停,不会⾃动播放) [ pause]; [Pause 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(on)]]; NSLog(@"视频总时长%@", [blockSelf convertTime:CMTimeGetSeconds(on)]); } }else if([keyPath isEqualToString:@"loadedTimeRanges"]){ NSArray *array=TimeRanges; CMTimeRange timeRange = [bject CMTimeRangeValue];//本次缓冲时间范围 float startSeconds = CMTimeGetSeconds(); float durationSeconds = CMTimeGetSeconds(on); NSTimeInterval totalBuffer = startSeconds + durationSeconds;//缓冲总长度 NSLog(@"视频共缓冲时长%@", [blockSelf convertTime:totalBuffer]); }}- (void)leftLabel:(NSString *)leftLabelText{ _ = leftLabelText;}- (void)rightLabel:(NSString *)rightLabelText{ _ = rightLabelText;}#pragma mark - UI事件/** * 点击播放/暂停按钮 * * @param sender 播放/暂停按钮 */- (IBAction)playClick:(UIButton *)sender { if(==0){ //说明时暂停 [sender setImage:[UIImage imageNamed:@"pui_pausebtn_b_disable@2x"] forState:UIControlStateNormal]; [ play]; }else if(==1){//正在播放 [ 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;

= CGRectMake(0, 0, , ); = ; [ bringSubviewToFront:ner];// ravity = AVLayerVideoGravityResize;//视频填充模式 //旋转屏幕,但是只旋转当前的View [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight]; orm = CGAffineTransformMakeRotation(M_PI/2); CGRect frame = [UIScreen mainScreen].applicationFrame; = CGRectMake(0, 64, , ); //隐藏导航栏 [[self navigationController] setNavigationBarHidden:YES animated:YES]; } else { [sender setImage:[UIImage imageNamed:@"pui_zoominbtn@2x"] forState:UIControlStateNormal]; falg = !falg; = CGRectMake(0, 0, , ); = ; [ bringSubviewToFront:ner]; //旋转屏幕,但是只旋转当前的View [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft]; orm = CGAffineTransformMakeRotation(M_PI*2); CGRect frame = [UIScreen mainScreen].applicationFrame; = CGRectMake(0, 0, , ); //显⽰导航栏 [[self navigationController] setNavigationBarHidden:NO animated:YES]; }}//下⼀个视频Button- (IBAction)nextButton:(UIButton *)sender { i++; [self removeNotification]; if (i == ) { i = 0; } urlStr=[NSString stringWithFormat:arr1[i]]; url=[NSURL URLWithString:urlStr]; AVPlayerItem *playerItem=[AVPlayerItem playerItemWithURL:url]; [ replaceCurrentItemWithPlayerItem:playerItem]; [self addNotification];}//点击隐藏或者出现播放进度控制栏- (IBAction)tapPlayer:(id)sender { if (falg1) { falg1 = !falg1; _ = YES; _ = YES; _ = YES; _ = YES; _ = YES; _ = YES;

} else { falg1 = !falg1; _ = NO; _ = NO; _ = NO; _ = NO; _ = NO; _ = NO; }

}下⾯上传图⽚,只是解压别的软件⾥⾯的图⽚,也不知道上传了能不能下载下来,png的传不上去,就转成jpg的了。github主页:/ShaoWenLe  

发布者:admin,转转请注明出处:http://www.yc00.com/news/1689067696a202492.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信