zoukankan      html  css  js  c++  java
  • 视频 AVPlayer

    /**

     *   iOS中视频播放  可以使用AVPlayer

     AVPlayer:不仅可以播放音频,还可播放视频;支持播放网络音频.

     AVAudioPlayer:支持本地音频播放

     */

    - (void)viewDidLoad {

        [super viewDidLoad];

        // Do any additional setup after loading the view.

        //获取播放网址

        NSURL *url = [NSURL URLWithString:@"http://video.weibo.com/show?fid=1034:c2b460554bd8334dcefa9ad4e03a8c79"];

       /*AVPlayerItem 可以获取视频的信息,如播放当前时长,总时长等等

        状态  status属性:

        AVPlayerItemStatusUnknown, 播放器未知问题

        AVPlayerItemStatusReadyToPlay, 代表可以播放 可以调用play

        AVPlayerItemStatusFailed 代表视频无法播放

           loadedTimeRanges: 已缓存的进度

        监测该属性  展示更新UI上的缓存进度.

        */

        //根据网址创建AVPlayerItem

        AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:url];

        playerItem.status;

        playerItem.loadedTimeRanges;

        //监听item的status属性 KVO

        [playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];

        //创建播放器对象

        _player = [AVPlayer playerWithPlayerItem:playerItem];

        /**

         *   单独使用AVPlayer时无法显示视频的(该类并非真正的视图)

         需要将视图层添加到AVPlayerLayer中

         最后将layer添加到父视图的layer上.

         */

        //1.创建 AVPlayerLayer对象

        AVPlayerLayer *layer = [AVPlayerLayer playerLayerWithPlayer:_player];

       //2.设置对应属性

       //设置视图层的frame

        layer.frame = CGRectMake(30, 200, self.view.bounds.size.width - 60, 300);

        //设置背景色

        layer.backgroundColor = [UIColor blackColor].CGColor;

        //设置图层的填充方式:

        /** AVLayerVideoGravityResize  视频会被拉伸填充播放界面的边界

         *  AVLayerVideoGravityResizeAspect (默认)保持视频的宽高比,且自动适应播放界面的边界.

        *   AVLayerVideoGravityResizeAspectFill  保持视频的宽高比,填充图层的边界.

         */

        layer.videoGravity = AVLayerVideoGravityResizeAspect;

        //添加到播放界面的layer层

        [self.view.layer addSublayer:layer];

    }

    - (IBAction)handlePlay:(id)sender {

        [self.player play];

    }

    - (IBAction)handlePause:(id)sender {

        [self.player pause];

    }

    #pragma KVO 回调方法

    //监听对象的status属性发生变化时的回调方法

    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{

        NSLog(@"%@ %@",object,change);

        //获取播放的资源对象

        AVPlayerItem *item = object;

        //代表可以播放了

        if (item.status == AVPlayerStatusReadyToPlay) {

            //获取总时长 duration  (CMTime类型)

            /*CMTime  

             value:一共多少帧

             timescale:每秒多少帧

             */

            float total = item.duration.value / item.duration.timescale;

            NSLog(@"%f",total);

        }

    }

  • 相关阅读:
    WPF 实现窗体拖动
    CAP带你轻松玩转ASP.NETCore消息队列
    ASP.NET Core开发-获取所有注入(DI)服务
    k8s实战为aspnetcore.webapi微服务注入配置信息
    详解docker实战之搭建私有镜像仓库
    自己动手破解Z.EntityFramework.Extensions 4.0.11.0的方法
    可以获取随机图片的API收集 必应 等
    一键发布部署vs插件[AntDeploy],让net开发者更幸福
    比ngx_http_substitutions_filter_module 更强大的替换模块sregex的replace-filter-nginx-module
    编译nginx的源码安装subs_filter模块
  • 原文地址:https://www.cnblogs.com/wukun168/p/6010795.html
Copyright © 2011-2022 走看看