iOS SDK详解之视频播放(AVPlayer)附Demo

原创Blog,转载请注明出处
http://blog.csdn.net/hello_hwc?viewmode=list
我的stackoverflow
profile for Leo on Stack Exchange, a network of free, community-driven Q&A sites


前言
最近在研究视频播放,所以研究了下这个类,学习的过程中写了个简单的Demo,这里写出来分析给想要的人呢。实现了

  • 透明的导航栏
  • 屏幕垂直的时候小屏幕/水平大屏幕之前的切换,支持屏幕旋转触发,按键触发
  • 重播
  • 播放/暂停
  • 显示播放进度
  • 隐藏控制图标,导航栏

GIF

全屏->小屏幕

小屏幕到全屏

暂停,重播
iOS SDK详解之视频播放(AVPlayer)附Demo_第1张图片


Demo下载
http://download.csdn.net/detail/hello_hwc/9174989


几个关键的类

  • AVPlayer (负责视频操作,例如播放,暂停,声音大小,跳到指定时间)
  • AVPlayerLayer(负责视频的可视区域,视频的播放模式,注意是CALayer,不能接受触摸)
  • AVPlayerItem(表示AVPlayer播放的资源对象,可以监听其状态)

几个关键点

  • 如何实现全屏
    尝试过两种方式,一种是利用transform来让view旋转,但是这样有个缺陷是代码复杂,没办法响应设备旋转,另外调整音频大小的时候,系统出来的图标不对。本文采用另一种方式,利用AutoLayout,这样代码简洁而且动画流畅。

利用XCode的Size Class,对iphone的横屏竖屏分别设置不同的约束即可
iOS SDK详解之视频播放(AVPlayer)附Demo_第2张图片iOS SDK详解之视频播放(AVPlayer)附Demo_第3张图片


  • 如何实现AVPlayerLayer的AutoLayout
    按照View的方式处理Layer,我之前讲过的,感兴趣的可以参考下我这篇博客,
    新建一个UIView的子类,用这个类来处理视频播放

头文件

#import 
#import 

@interface PlayVideoView : UIView
@property(nonatomic)AVPlayer * player;
@property(nonatomic,readonly)AVPlayerLayer * playerLayer;
@end

.m文件

#import "PlayVideoView.h"
@implementation PlayVideoView

+(Class)layerClass{
    return [AVPlayerLayer class];
}
- (AVPlayer*)player {
    return [(AVPlayerLayer *)[self layer] player];
}
- (void)setPlayer:(AVPlayer *)player {
    [(AVPlayerLayer *)[self layer] setPlayer:player];
}
- (AVPlayerLayer *)playerLayer{
    return (AVPlayerLayer *)self.layer;
}
@end

  • 实现透明的导航栏
    [self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
    [self.navigationController.navigationBar setShadowImage:[UIImage new]];

  • 监听视频资源是否准备好

KVO

    [player addObserver:self forKeyPath:@"status" options:0 context:0];

然后监听,注意例子只有一个KVO,所以没有进行判断是哪一个KVO

 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if(self.playvideoView.player.status == AVPlayerStatusFailed){

    }else if(self.playvideoView.player.status == AVPlayerStatusReadyToPlay){
        self.playButton.hidden = false;
    }
}

  • 获取播放视频的进度
    [player addPeriodicTimeObserverForInterval:CMTimeMake(1, 2) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {
        CMTime currentTime = self.playvideoView.player.currentTime;
        CMTime totalTime = self.playvideoView.player.currentItem.duration;
        CGFloat progress = CMTimeGetSeconds(currentTime)/CMTimeGetSeconds(totalTime);
        NSLog(@"%.2f",progress);
        self.progressView.progress = progress;
        NSLog(@"%d",(int)(CMTimeGetSeconds(totalTime) - CMTimeGetSeconds(currentTime)));
    }];

你可能感兴趣的:(Foundation,iOS开发详解)