简易视频播放器
2016-01-14 22:02
323 查看
注:用xib拽的,可以去工程里找,这里只写代码部分
可以实现视频播放,可横竖屏切换,可快进快退,暂停AppDelegate.m
#import "AppDelegate.h" #import "PlayerViewController.h" //#import "RootViewController.h" @interface AppDelegate () @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; // RootViewController *rootVC = [[RootViewController alloc] init]; // // self.window.rootViewController = rootVC; PlayerViewController *playerVC = [[PlayerViewController alloc] init]; UINavigationController *naVC = [[UINavigationController alloc] initWithRootViewController:playerVC]; self.window.rootViewController = naVC; return YES; }
PlayerViewController.m
#import "PlayerViewController.h" #define SCREEN_WIDTH self.view.frame.size.width #define SCREEN_HEIGHT self.view.frame.size.height #import <AVFoundation/AVFoundation.h> @interface PlayerViewController () /** * 播放view */ @property (weak, nonatomic) IBOutlet UIView *playerView; /** * 控制底部的视图 */ @property (weak, nonatomic) IBOutlet UIView *bottomView; /** * 开始按钮 */ - (IBAction)startBtn:(id)sender; /** * 用来控制快进等功能的slider的触发方法 */ - (IBAction)sliderAction:(id)sender; /** * 修改进度内容的进度条 */ @property (weak, nonatomic) IBOutlet UISlider *progressSlider; /** * 显示时间的label */ @property (weak, nonatomic) IBOutlet UILabel *timeLabel; @property (nonatomic, strong) AVPlayer *player; @property (nonatomic, strong) AVPlayerItem *playerItem; @property (nonatomic, strong) AVPlayerLayer *playerLayer; @property (nonatomic, assign) BOOL isStart; @property (nonatomic, assign) BOOL isTap; /** * 用来记录视频的时长,快进快退的时候需要用到 */ @property (nonatomic, assign) CGFloat duration;; @end @implementation PlayerViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view from its nib. /** * 初始化播放器 */ [self createPlayer]; // 播放 [self.player play]; // 给当前屏幕,添加一个监听横竖屏和视频结束的方法 [self addNotificationCenters]; // 创建一个轻点的手势 [self createTap]; // 对播放速度进行设置 [self addProgress]; self.timeLabel.text = @"00:00/00:00"; self.isStart = YES; } #pragma mark - #pragma mark 添加进度的设置 - (void)addProgress { /** * 1.CMTime:是专门用来表示视频时间的 2.CMTimeMake 是用来创建CMTime的 用法就是CMTimeMake(time,timeScale) 1.time指的是时间,但不是秒,如果想转成秒,需要通过第二个参数来完成 2.timeScale指的是1秒需要多少帧构成,而真正的时间是 time/timeScale */ // 设置成(1,1)每秒执行一次 [self.player addPeriodicTimeObserverForInterval:CMTimeMake(1, 1) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) { // 当前视频的总时间,将CMTime转换成CGFloat CGFloat durationTime = CMTimeGetSeconds(self.playerItem.duration); // 当前时间 CGFloat current = CMTimeGetSeconds(self.player.currentTime); // 倒计时 CGFloat rem = durationTime - current; // 把时间转换成NSString,在进行赋值 NSString *totalLt = [NSString stringWithFormat:@"%02d:%02d",(int)rem/60,(int)rem%60]; NSString *currentTime = [NSString stringWithFormat:@"%02d:%02d",(int)current/60,(int)current%60]; NSString *resultTime = [NSString stringWithFormat:@"%@/%@",currentTime,totalLt]; self.timeLabel.text = resultTime; // 让slider也向前移动 self.progressSlider.value = current / durationTime; // 保存总时长,用于手动快进 self.duration = durationTime; }]; } #pragma mark - #pragma mark 创建轻点手势 - (void)createTap { UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)]; [self.view addGestureRecognizer:tap]; self.isTap = NO; } #pragma mark - #pragma mark 轻点实现视图的出现和隐藏 - (void)tapAction:(UITapGestureRecognizer *)tap { if (self.isTap == NO) { [UIView animateWithDuration:0.5 animations:^{ self.bottomView.alpha = 0; }]; }else{ [UIView animateWithDuration:0.5 animations:^{ self.bottomView.alpha = 1; }]; } self.isTap = !self.isTap; } #pragma mark - #pragma mark 添加监听方法 - (void)addNotificationCenters { /** * 监听当前的视频的播放情况,只要播放结束,就触发指定的方法 */ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(movieEnd:) name:AVPlayerItemDidPlay 4000 ToEndTimeNotification object:nil]; /** * 监听当前屏幕的旋转 */ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(screenChange:) name: UIApplicationDidChangeStatusBarOrientationNotification object:nil]; } #pragma mark - #pragma mark 监听屏幕旋转 - (void)screenChange:(NSNotification *)notification { UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; NSLog(@"%ld",orientation); // 根据横竖屏,分别设置播放器的frame if (orientation == UIInterfaceOrientationLandscapeLeft) { NSLog(@"向左横屏"); [self setPlayerLayerFrame]; }else if (orientation == UIInterfaceOrientationLandscapeRight ) { NSLog(@"向右横屏"); [self setPlayerLayerFrame]; }else if (orientation == UIDeviceOrientationPortrait){ NSLog(@"竖屏"); [self setPortraitFrame]; } } #pragma mark - #pragma mark 设置横屏时候的尺寸 - (void)setPlayerLayerFrame { self.playerLayer.frame = CGRectMake(5, 5, SCREEN_WIDTH-10, 290); } #pragma mark - #pragma mark 设置竖屏时候的尺寸 - (void)setPortraitFrame { self.playerLayer.frame = CGRectMake(5, 5, SCREEN_WIDTH-10, 290); } #pragma mark - #pragma mark 播放结束 - (void)movieEnd:(NSNotification *)notification { NSLog(@"播放结束了"); } #pragma mark - #pragma mark 初始化播放器 - (void)createPlayer { NSString *urlStr = [NSString stringWithFormat:@"http://flv2.bn.netease.com/videolib3/1505/24/HYUCE6348/SD/HYUCE6348-mobile.mp4"]; /** * 对网址进行编码 */ urlStr = [urlStr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; NSURL *url = [NSURL URLWithString:urlStr]; /** * 根据网址,创建视频项目对象 */ self.playerItem = [[AVPlayerItem alloc] initWithURL:url]; /** * 创建视频播放器对象 */ self.player = [AVPlayer playerWithPlayerItem:self.playerItem]; /** * 创建一个播放器承载对象,把播放器放到上面 */ self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player]; /** * 设置一下承载对象的尺寸 */ self.playerLayer.frame = CGRectMake(5, 5, SCREEN_WIDTH-10, 290); /** * 设置视频的填充方式 */ self.playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; /** * 把播放器加到layer层上 */ [self.playerView.layer insertSublayer:self.playerLayer atIndex:0]; self.playerView.backgroundColor = [UIColor orangeColor]; } - (IBAction)startBtn:(id)sender { if (self.isStart == YES) { [self.player pause]; }else{ [self.player play]; } self.isStart = !self.isStart; } - (IBAction)sliderAction:(id)sender { /** * 获取当前的时间 */ double currentTime = self.duration*self.progressSlider.value; // 设置要进行跳转的时间 CMTime drage = CMTimeMake(currentTime, 1); // 对player进行设置 [self.player seekToTime:drage completionHandler:^(BOOL finished) { [self.player play]; }]; }
相关文章推荐
- [bzoj3669][NOI2014]魔法森林
- teradata PI -- Join的影响
- 5分钟制作H5发光字表白并分享给她
- jfreechart绘制折线图(平面和3D)
- 给kill给一个小脚本
- Sublime Text 3 + OmniMarkupPreviewer体验略记
- leetcode笔记:Find Median from Data Stream
- Jquery中的(function($){...})(jQuery)
- MYSQL SHOW VARIABLES简介
- 解决当网络连接方式选择“桥接网卡”时,VirtualBox提示“未指定要bridged的网络界面”
- 利用pandas进行数据分组及可视化
- 银行家算法
- LeetCode 之 Best Time to Buy and Sell Stock II
- BZOJ 2324: [ZJOI2011]营救皮卡丘( floyd + 费用流 )
- 新工作 Day8
- python-列表与元组
- 示例演示“距离矢量路由算法”工作原理
- 运行时关联对象
- 初学java——java编程发展方向,JDK和Java源文件与Java字节码文件的关系
- 用keytool将eclipse下的apk签名文件转.p12文件步骤