1.首先得创建AVPlayer,一个播放对象。
2.但是AVPlayer不能直接添加到self.view上,所以我们得创建一个 AVPlayerLayer的对象,是播放器所在的图层,设置视频填充的模式,然后将AVPlayer添加到此图层上,再将这个图层添加到self.view或者子视图的layer图层上。
3.设置播放的对象,就是AVPlayer播放的资源
下面是代码的展示:
一:首先我们需要引进能够支持AVPlayer视频播放的框架。同时这个框架还是音频播放的框架
#import <AVFoundation/AVFoundation.h>
将self.view的尺寸设置成全局
#define WIDTH self.view.bounds.size.width
#define HEIGHT self.view.bounds.size.height
@interface ViewController ()
在Main.storyboard将这些布局设置好。
@property ( weak , nonatomic ) IBOutlet UIView *buttomVIew; /**< 底部控制区 */
@property ( weak , nonatomic ) IBOutlet UIButton *buttomBtn;
@property ( weak , nonatomic ) IBOutlet UISlider *progress; /**< 进度条 */
@property ( weak , nonatomic ) IBOutlet UILabel *timeLabel; /**< 时间显示 */
@property ( weak , nonatomic ) IBOutlet UIView *playerView; /**< 播放视图 */
进行基本属性的设置
@property ( nonatomic , strong ) AVPlayer *player; /**< 播放器对象 */
@property ( nonatomic , strong ) AVPlayerLayer *playerLayer; /**< 播放图层 */
@property ( nonatomic , strong ) AVPlayerItem *playerItem; /**< 播放对象 */
@property ( nonatomic , assign ) BOOL isPlay; /**< 是否播放 */
@property ( nonatomic , assign ) BOOL isDismiss; /**< 是否隐藏 */
@property ( nonatomic , assign ) CGFloat totalDuration; /**< 总时长 */
@end
二:在viewDidLoad中需要实现的方法或者设置的总体步骤
- ( void )viewDidLoad {
    [ super viewDidLoad ];
    // Do any additional setup after loading the view, typically from a nib.
    // 初始化播放器
    [ self createAVPlayer ];
    // 播放
    [ _player play ];
    // 开始播放
    _isPlay = YES ;
    // 初始化时间显示
    _timeLabel . text = @"00:00/00:00" ;
    // 初始化进度条
    _progress.value = 0;
    // 添加手势 隐藏边栏<下边栏>
    [ self addTapToDismissBar ];
    // 通过通知中心监听 播放器 / 视频 / 页面 状态信息
    [ self addNotificationCenter ];
    // 进度条监听
    [self progressObserving];
三:初始化这个播放器
#pragma mark - 初始化播放器
- ( void )createAVPlayer
{
    // 视频网址
    NSString *str = @"http://flv2.bn.netease.com/videolib3/1505/24/HYUCE6348/SD/HYUCE6348-mobile.mp4" ;
    NSURL *url = [ NSURL URLWithString :str];
    // 创建播放对象 (playerItem),就是需要播放的资源
    self . playerItem = [ AVPlayerItem playerItemWithURL :url];
    // 创建播放器 (player)
    self . player = [ AVPlayer playerWithPlayerItem : _playerItem ];
    // 创建显示 layer(playerLayer) 只有放在这个layer上才可以显示。
    self . playerLayer = [ AVPlayerLayer playerLayerWithPlayer : _player ];
    // layer 需要设置大小
    _playerLayer . frame = CGRectMake ( 5 , 5 , self . view . bounds . size . width - 10 , _playerView . frame . size . height - 10 );
    // 视频填充模式 
    _playerLayer . videoGravity = AVLayerVideoGravityResizeAspectFill ;
    // 将显示的图层 放在页面里显示
    [ _playerView . layer insertSublayer : _playerLayer atIndex : 0 ];
}
四:添加手势
#pragma mark - 添加手势
- ( void )addTapToDismissBar
{
    UITapGestureRecognizer *tap = [[ UITapGestureRecognizer alloc ] initWithTarget : self action : @selector (tapAction:)];
    [ _playerView addGestureRecognizer :tap];
}
#pragma mark - 隐藏边栏
- ( void )tapAction:( UITapGestureRecognizer *)tap
{
    // 初始播放 还未隐藏 isDismiss = NO
    // 隐藏
    if (! _isDismiss ) {
        // 隐藏边栏
        [ UIView animateWithDuration : 0.5 animations :^{
            _buttomVIew . alpha = 0 ;
        }];
    } else {
        // 显示边栏
        [ UIView animateWithDuration : 0.5 animations :^{
            _buttomVIew . alpha = 0.8 ;
        }];
    }
    _isDismiss = ! _isDismiss ;
}
五:#pragma mark - 通知中心
- ( void )addNotificationCenter
{
    // 是否播放完成
    [[ NSNotificationCenter defaultCenter ] addObserver : self selector : @selector (moviePlayDidEnd:) name : AVPlayerItemDidPlayToEndTimeNotification object : nil ];
    // 监听屏幕旋转
    [[ NSNotificationCenter defaultCenter ] addObserver : self selector : @selector (statusBarPositionChange:) name : UIApplicationDidChangeStatusBarOrientationNotification object : nil ];
}
#pragma mark -视频播放结束时进行的操作,可以在这里设置,进行下一个视频的播放。
- ( void )moviePlayDidEnd:( NSNotification *)noti
{
    NSLog ( @" 视频播放已经结束 " );
}
#pragma mark -监听屏幕是否旋转
- ( void )statusBarPositionChange:( NSNotification *)noti
{
    // 使用代码监听横竖屏
    // 获取状态栏方向
    UIInterfaceOrientation orientation = [[ UIApplication sharedApplication ] statusBarOrientation ];
    // 判断
    if (orientation == UIInterfaceOrientationLandscapeLeft ) {
        NSLog ( @" 向左横屏 " );
        [ self landscape ];
    } else if (orientation == UIInterfaceOrientationLandscapeRight ) {
        NSLog ( @" 向右横屏 " );
        [ self landscape ];
    } else if (orientation == UIInterfaceOrientationPortrait ) {
        NSLog ( @" 竖屏 " );
        [ self portrait ];
    }
}
#pragma mark - 横屏设置
- ( void )landscape
{
    _playerView . frame = self . view . bounds ;
    _playerView . backgroundColor = [ UIColor redColor ];
    _playerLayer . frame = CGRectMake ( 5 , 5 , WIDTH - 10 , HEIGHT - 10 );
    NSLog ( @"%@ %@" , NSStringFromCGRect ( _playerView . frame ), NSStringFromCGRect ( self . view . frame ));
}
#pragma mark - 竖屏设置
- ( void )portrait
{
    _playerView . backgroundColor = [ UIColor cyanColor ];
    _playerLayer . frame = CGRectMake ( 5 , 5 , WIDTH - 10 , 230 );
}
六:进度条监听 
/*
 CMTimeMake 是用來建立 CMTime 用的 ,
 CMTime 可是专门用来表示视频时间的 ,
  用法 : CMTimeMake(time, timeScale)
 
 time 指的就是时间 ( 不是秒 ),
  而时间要换成秒就要看第二个参数 timeScale 了 .
 timeScale 指的是 1 秒需要由多少帧率构成 ,
  真正表示时间秒是 time / timeScale .
 
 CMTime curFrame = CMTimeMake( 第几帧, 帧率)
 
 */
#pragma mark - 进度条监听
- ( void )progressObserving
{
    // 设置 (1, 1) 每秒刷新一次
    // 参数 1: 时间监听器刷新时间
    // 参数 2: 队列
    // 参数 3: 刷新时执行的 block
    __weak ViewController *vc = self ;
    [ _player addPeriodicTimeObserverForInterval : CMTimeMake ( 1 , 1 ) queue : dispatch_get_main_queue () usingBlock :^( CMTime time) {
        // 获取总时长
        CGFloat duration = CMTimeGetSeconds (vc. playerItem . duration );
        // 获取当前时长
        CGFloat current = CMTimeGetSeconds (vc. player . currentTime );
        // 获取倒计时
        CGFloat rem = duration - current;
       
        // 剩余时间
        NSString *totalT = [ NSString stringWithFormat : @"%02d:%02d" , ( int )rem / 60 , ( int )rem % 60 ];
        // 当前时间
        NSString *currentT = [ NSString stringWithFormat : @"%02d:%02d" , ( int )current / 60 , ( int )current % 60 ];
        // 拼接时间
        NSString *timeStr = [ NSString stringWithFormat : @"%@/%@" , currentT, totalT];
        vc. timeLabel . text = timeStr;
        // 保存总时长 用于 slider 手动控制进度
        vc. totalDuration = duration;
        // 控制 slider 的当前进度
        vc. progress . value = current / duration;
    }];
}

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

  1. linux p2p视频播放器,avplayer: 一个基于FFmpeg、libtorrent的P2P播放器实现.

    一直以来, 在多媒体播放器这块, 即使目前有许多开源的播放器项目, 但要写一个播放器仍然是件非常困难的事, 如果在windows上你有可能需要熟悉DShow, 另外的话, 你需要学习一堆开源项目(比如 ...

  2. 视频播放器AVPlayer

    1.采用AVPlayer进行封装 2.通过单例视频管理类全局控制视屏的播放暂停和移除视频view 3.播放视图和工具条独立封装,完全解耦 4.封装独立的弹框视图,可加网络判断来是否继续播放 githu ...

  3. 视频播放器 AVPlayer

    {// 设置音频播放AVAudioSession *audioSession = [AVAudioSession sharedInstance];[audioSession setCategory:A ...

  4. AVPlayer自定制视频播放器(1)——视频播放器基本实现

    在iOS多媒体开发的过程中,经常会用到视频播放器,简单是视频播放器,直接使用苹果封装好的MPMoviePlayerController和MPMoviePlayerViewController就可以实现 ...

  5. 自定义视频播放器与慢放滚轮

    受同学之邀,帮忙自定义一控件.需求是:开发慢放滚轮,用手指拨动实现帧级的慢速播放,滚轮可双向拨动,其滚动具有惯性,滚动速度决定视频播放的速度.需求很明朗,可我却是一头雾水.说实话,在此之前我还没有自定 ...

  6. iOS AVPlayer视频播放器

    代码地址如下: http://www.demodashi.com/demo/11168.html 一.运行效果 二.实现过程 ①.创建播放器avPlayer //创建播放器url = [url str ...

  7. WMPlayer视频播放器,AVPlayer的封装

    WMPlayer视频播放器,AVPlayer的封装,继承UIView,想怎么玩就怎么玩.支持播放mp4.m3u8.3gp.mov,网络和本地视频同时支持.全屏和小屏播放同时支持.自动感应旋转屏幕.ht ...

  8. iOS 教你使用MP、AVPlayer、AVPlayerVC构建一个完整的视频播放器

    1.前言 标题必须要浮夸!要感觉像是一个大新闻.长者如是说. 其实是前几天去面试的时候,被要求说必须做过视频播放相关项目.有点闹心之余,就花了点时间在家写了一个简单播放器,基本实现了主流播放器的大致功 ...

  9. AVPlayer自定制视频播放器(2)——耳机线控、中断以及AVAudioSession的使用

    在上一篇博客中说到了使用AVPlayer进行自定义视频播放器.这里讲继续讲述视频播放器的自定制.下面是上一篇博客的链接,本篇博客将承接上一篇博客进行讲解,如果有AVPlayer自定制视频播放器基础的同 ...

  10. html ios视频播放器,良心推荐!iOS端的视频播放应用

    不知道大家还记不记得之前小编我推荐的最好用的iOS音乐播放器,如果没看过,可以点击这里.既然之前介绍了一款iOS端的音乐播放器给大家,那么今天就介绍一款iOS端十分好用的万能解码的视频播放器. 使用i ...

最新文章

  1. UILabel设置行间距之后的自适应高度
  2. Android onclicklistener中使用外部类变量时为什么需要final修饰【转】
  3. 下列代码的执行结果是 php,执行下列代码后的结果是: $x=15; echo $x++; $y=20; echo ++y;...
  4. 科大星云诗社动态20210402
  5. 上传文件时路径总是C:\fakepath\的问题
  6. C/C++中的声明与定义
  7. 论文浅尝 | 一种基于递归超图的知识图谱问答方法
  8. java中修饰符的说明
  9. CSS 元素的绝对定位 position: absolute 和 position: fixed
  10. 【转载】Mysql注入点在limit关键字后面的利用方法
  11. ctfshow-网络迷踪-山外有山
  12. 居家隔离的第5天,我们整了个六边形战士
  13. 使用WIN32汇编语言实现一个基本windows窗口的过程分析
  14. php学生成绩管理系统完整源代码,PHP学生成绩管理系统
  15. 基于MUI制作手机社交app通讯录列表页面源码
  16. Java第十九天:mysql(二)
  17. qq对计算机程序的更改,解决电脑总弹出“是否允许程序对计算机进行更改”
  18. 淘宝客商品推广图片合成(包含二维码、图片、价格)
  19. 美容美发美甲行业门店痛点和解决方案
  20. Spark之spark VS MR

热门文章

  1. 2013 ACM-ICPC南京赛区全国邀请赛
  2. Objective-C 【对象-多文件开发简介】
  3. Ext文件下载(转载)
  4. 与MySQL相识的第二天
  5. 程序开发必备利器—英特尔Core i5开发机
  6. 怎样做好路演PPT/keynote
  7. 比林志玲cute的katee
  8. markdown如何在表格内换行?
  9. ios 证书生成流程
  10. 如何正确获得Android内外SD卡路径