视频 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);

    }

}

posted @ 2016-10-29 14:11  Comder  阅读(1594)  评论(0编辑  收藏  举报