• IOS开发之视频播放


    介绍两种播放视频的方法  第一种稍微复杂一点。

    第一种方式播放视频:

    一、视频播放基础知识

    1.介绍

     ios9.0的改变 弃用了MPMoviePlayerViewController  导入MediaPlayer框架

     现使用AVPlayerViewController  导入AVFoundation框架

     

     (1)AVPlayer 播放音视频  视频操作相关

         《1》play

         《2》pause

         《3》seekToTime:跳转进度 

         《4》currentItem 当前播放的视频元素

         《5》volume 调节音量

         《6》externalPlaybackVideoGravity 视频显示的播放样式

               AVLayerVideoGravityResizeAspect 普通的

               AVLayerVideoGravityResizeAspectFill 充满的

         《7》currentTime 获得当前播放时间 -> CMTime

              CMTimeGetSeconds(<#CMTime time#>) 通过CMTime获得当前播放时间(秒)

     (2)AVPlayerItem 音视频对象  视频内容相关

         《1》duration 总时长

         《2》status 加载的状态

             ①AVPlayerItemStatusUnknown 未知的状态

             ②AVPlayerItemStatusReadyToPlay 准备播放状态

             ③AVPlayerItemStatusFailed  失败状态

         《3》时间控制的一个类目

             ① currentTime 获得当前播放时间

             ② forwardPlaybackEndTime跳到结束位置

             ③ reversePlaybackEndTime 调到开始位置

             ④ seekToTime: 调到指定位置

     (3)AVPlayerLayer播放显示视频的图层界面

     (4)AVPlayerViewController  视图控制器 #import <AVKit/AVKit.h> 可以显示视频 并且有调节控件

     2.使用

     (1)AVPlayer直接播放

       《1》创建AVPlayerItem

           <1>创建方式  

              ①playerItemWithURL:类方法通过URl地址创建要播放的对象 可以是本地内容也可以是在线内容

              ②initWithURL:构造方法

              ③ playerItemWithAsset:通过设备相册里面的内容 创建一个 要播放的对象

              ④playerItemWithAsset:automaticallyLoadedAssetKeys自动根据要求的Key去加载相册里面的内容

              ⑤initWithAsset:automaticallyLoadedAssetKeys:

       《2》创建AVPlayer

           <1>创建方式

            ①playerWithURL:根据URL去创建播放器 不需使用item

            ②initWithURL:

            ③playerWithPlayerItem:需要传入一个视频播放内容

            ④initWithPlayerItem:

            ⑤获得播放结束的状态

            ⑥ seekToTime:跳转到某一个进度

            ⑦CMTime:结构体 value(进度)timeScale(帧率)

       《3》创建AVPlayerLayer 添加到父视图

          <1>根据播放器去创建一个可以显示视频的图层playerLayerWithPlayer:->类方法

          <2>设置位置frame

          <3>把视频图层添加到父图层

       《4》播放******  [播放器 play];

    实例代码:

    导入框架:#import <AVFoundation/AVFoundation.h>
    声明全局变量:
    @interface ViewController ()
    {
        AVPlayer *player;
    }
    @end
    
    在ViewDidLoad中
    - (void)viewDidLoad {
        [super viewDidLoad];
        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
        button.frame = CGRectMake(100, 100, 100, 100);
        [button setTitle:@"TICK" forState:UIControlStateNormal];
        button.backgroundColor = [UIColor brownColor];
        [button addTarget:self action:@selector(doit:) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview:button];
        
    }
    
    按钮的触发方法:
    - (void)doit:(UIButton *)sender{
        
        /*
         视频播放需要 AVPlayer AVPlayerItem AVPlayerLayer
         
         AVPlayer(视频播放器)去播放->AVPlayerItem(视频播放的元素)->AVPlayerLayer展示播放的视图
         
         */
        
    //    1.创建要播放的元素
        
        NSURL *url = [[NSBundle mainBundle]URLForResource:@"IMG_9638.m4v" withExtension:nil];
        AVPlayerItem *item = [AVPlayerItem playerItemWithURL:url];
        
    //    2.创建播放器
        player = [AVPlayer playerWithPlayerItem:item];
        
        
    //    3.创建视频显示的图层
        AVPlayerLayer *showVodioLayer = [AVPlayerLayer playerLayerWithPlayer:player];
        showVodioLayer.frame = self.view.frame;
        [self.view.layer addSublayer:showVodioLayer];
        
    //    4.播放视频
        [player play];
        
        
    //    获得播放结束的状态 -> 通过发送通知的形式 获得 -> AVPlayerItemDidPlayToEndTimeNotification
        
        [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(itemDidPlayToEndTime:) name:AVPlayerItemDidPlayToEndTimeNotification object:nil];
        
        
    //    CMTime  结构体  表示视频播放的进度的 value(进度) timescale(帧率)
    //    CMTimeMake(<#int64_t value#>, <#int32_t timescale#>)
        
    //    kCMTimeZero  表示初始进度
    //     seekToTime:<#(CMTime)#>  跳转到某一个进度
        
        
    //   player.currentItem.status  只要可以得到当前视频元素准备好的状态  就可以得到总时长了
    //    采取KVO的形式获得 视频总时长  通过监视status 来判断是否准备好的状态
        [item addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
        
        
    //    快进
    //    跳到某一个进度的方法  -> seekToTime:
    //    得到当前的时间 + 快进的时间
        
        
        
    }
    
    滑动屏幕让视频快进
    
    - (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    //    获得到当前播放的时间(秒)
      Float64 cur = CMTimeGetSeconds(player.currentTime);
        cur += 2;
        [player seekToTime:CMTimeMake(cur, 1)];
    }
    
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
        
        NSLog(@"%@",change[@"new"]);
        AVPlayerItemStatus status = [change[@"new"] integerValue];
        switch (status) {
            case 0:{
                NSLog(@"未知");
                break;
            }
            case 1:{
                NSLog(@"总时长:%f",CMTimeGetSeconds(player.currentItem.duration));
                break;
            }
            case 2:{
                NSLog(@"失败");
                break;
            }
            default:
                break;
        }
    }
    
    
    - (void)itemDidPlayToEndTime:(NSNotification *)not{
        NSLog(@"播放结束");
        
        [player seekToTime:kCMTimeZero]
    }

    第二种方式比较简单:

    使用

    AVPlayerViewController  视图控制器可以显示视频 并且有调节控件

    注意导入框架:

    #import <AVFoundation/AVFoundation.h>

    #import <AVKit/AVKit.h>

    - (void)viewDidLoad {
        [super viewDidLoad];
        self.view.backgroundColor = [UIColor orangeColor];
        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
        button.frame = CGRectMake(100, 100, 100, 100);
        [button setTitle:@"TICK" forState:UIControlStateNormal];
        button.backgroundColor = [UIColor brownColor];
        [button addTarget:self action:@selector(playMovie) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview:button];
    }
    按钮的触发事件:
    - (void)playMovie{
        //    1.AVPlayer
        AVPlayer *player = [AVPlayer playerWithURL:[[NSBundle mainBundle] URLForResource:@"IMG_9638.m4v" withExtension:nil]];
        //    2.创建视频播放视图的控制器
        
        AVPlayerViewController *playerVC = [[AVPlayerViewController alloc]init];
        playerVC.player = player;
        
    //    隐藏 控制控件
    //    playerVC.showsPlaybackControls = NO;
    
    //    [self presentViewController:playerVC animated:YES completion:nil];
        
        
    //    自定义位置
        playerVC.view.frame = CGRectMake(200, 300, 300, 300);
        [self.view addSubview:playerVC.view];
        [self addChildViewController:playerVC];
    }

  • 相关阅读:
    用它,只需“拖拉拽”即可轻松创建APP和短信推送规则
    如何通过机智云接口生成设备对应的二维码
    新唐方案分享:基于NUC472开发板的物联网开发,接入机智云
    公告|苹果iOS13升级在即,机智云APP适配指南
    物联网中的数据透传
    多维数组
    pymysql库的学习
    selenium库的学习
    xpath语法和lxml库的学习
    MATLAB 机场价格数据预处理和分析
  • 原文地址:https://www.cnblogs.com/ios-wanglong/p/5284128.html
Copyright © 2020-2023  润新知