简易视频播放器

注:用xib拽的,可以去工程里找,这里只写代码部分

可以实现视频播放,可横竖屏切换,可快进快退,暂停
AppDelegate.m

#import "AppDelegate.h"
#import "PlayerViewController.h"
//#import "RootViewController.h"

@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.

    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];

    self.window.backgroundColor = [UIColor whiteColor];

    [self.window makeKeyAndVisible];

//    RootViewController *rootVC = [[RootViewController alloc] init];
//    
//    self.window.rootViewController = rootVC;

    PlayerViewController *playerVC = [[PlayerViewController alloc] init];

    UINavigationController *naVC = [[UINavigationController alloc] initWithRootViewController:playerVC];

    self.window.rootViewController = naVC;




    return YES;
}

PlayerViewController.m

#import "PlayerViewController.h"

#define SCREEN_WIDTH self.view.frame.size.width
#define SCREEN_HEIGHT self.view.frame.size.height
#import <AVFoundation/AVFoundation.h>

@interface PlayerViewController ()

/**
 *  播放view
 */
@property (weak, nonatomic) IBOutlet UIView *playerView;

/**
 *  控制底部的视图
 */
@property (weak, nonatomic) IBOutlet UIView *bottomView;

/**
 *   开始按钮
 */
- (IBAction)startBtn:(id)sender;

/**
 *   用来控制快进等功能的slider的触发方法
 */
- (IBAction)sliderAction:(id)sender;

/**
 *  修改进度内容的进度条
 */
@property (weak, nonatomic) IBOutlet UISlider *progressSlider;

/**
 *  显示时间的label
 */
@property (weak, nonatomic) IBOutlet UILabel *timeLabel;

@property (nonatomic, strong) AVPlayer *player;

@property (nonatomic, strong) AVPlayerItem *playerItem;

@property (nonatomic, strong) AVPlayerLayer *playerLayer;

@property (nonatomic, assign) BOOL isStart;

@property (nonatomic, assign) BOOL isTap;

/**
 *   用来记录视频的时长,快进快退的时候需要用到
 */
@property (nonatomic, assign) CGFloat duration;;


@end

@implementation PlayerViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.


    /**
     *    初始化播放器
     */
    [self createPlayer];

    // 播放
    [self.player play];

    // 给当前屏幕,添加一个监听横竖屏和视频结束的方法
    [self addNotificationCenters];

    // 创建一个轻点的手势
    [self createTap];


    // 对播放速度进行设置
    [self addProgress];

    self.timeLabel.text = @"00:00/00:00";


    self.isStart = YES;


}

#pragma mark -
#pragma mark 添加进度的设置
- (void)addProgress
{
    /**
     *   1.CMTime:是专门用来表示视频时间的

         2.CMTimeMake 是用来创建CMTime的

         用法就是CMTimeMake(time,timeScale)

         1.time指的是时间,但不是秒,如果想转成秒,需要通过第二个参数来完成

         2.timeScale指的是1秒需要多少帧构成,而真正的时间是 time/timeScale
     */


    // 设置成(1,1)每秒执行一次
    [self.player addPeriodicTimeObserverForInterval:CMTimeMake(1, 1) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {

        // 当前视频的总时间,将CMTime转换成CGFloat
        CGFloat durationTime = CMTimeGetSeconds(self.playerItem.duration);

        // 当前时间
        CGFloat current = CMTimeGetSeconds(self.player.currentTime);

        // 倒计时
        CGFloat rem = durationTime - current;

        // 把时间转换成NSString,在进行赋值
        NSString *totalLt = [NSString stringWithFormat:@"%02d:%02d",(int)rem/60,(int)rem%60];

        NSString *currentTime = [NSString stringWithFormat:@"%02d:%02d",(int)current/60,(int)current%60];

        NSString *resultTime = [NSString stringWithFormat:@"%@/%@",currentTime,totalLt];

        self.timeLabel.text = resultTime;


        // 让slider也向前移动
        self.progressSlider.value = current / durationTime;


        // 保存总时长,用于手动快进
        self.duration = durationTime;

    }];
}

#pragma mark -
#pragma mark 创建轻点手势
- (void)createTap
{
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)];

    [self.view addGestureRecognizer:tap];

    self.isTap = NO;
}

#pragma mark -
#pragma mark 轻点实现视图的出现和隐藏
- (void)tapAction:(UITapGestureRecognizer *)tap
{
    if (self.isTap == NO) {

        [UIView animateWithDuration:0.5 animations:^{

            self.bottomView.alpha = 0;
        }];

    }else{

        [UIView animateWithDuration:0.5 animations:^{

            self.bottomView.alpha = 1;
        }];
    }

    self.isTap = !self.isTap;
}

#pragma mark -
#pragma mark 添加监听方法
- (void)addNotificationCenters
{
    /**
     *   监听当前的视频的播放情况,只要播放结束,就触发指定的方法
     */
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(movieEnd:) name:AVPlayerItemDidPlayToEndTimeNotification object:nil];

    /**
     *   监听当前屏幕的旋转
     */
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(screenChange:) name: UIApplicationDidChangeStatusBarOrientationNotification object:nil];

}

#pragma mark -
#pragma mark 监听屏幕旋转
- (void)screenChange:(NSNotification *)notification
{
   UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];

    NSLog(@"%ld",orientation);

    // 根据横竖屏,分别设置播放器的frame
    if (orientation == UIInterfaceOrientationLandscapeLeft) {

        NSLog(@"向左横屏");

        [self setPlayerLayerFrame];
    }else if (orientation == UIInterfaceOrientationLandscapeRight ) {
        NSLog(@"向右横屏");
        [self setPlayerLayerFrame];
    }else if (orientation == UIDeviceOrientationPortrait){

        NSLog(@"竖屏");
        [self setPortraitFrame];
    }


}

#pragma mark -
#pragma mark 设置横屏时候的尺寸
- (void)setPlayerLayerFrame
{
    self.playerLayer.frame = CGRectMake(5, 5, SCREEN_WIDTH-10, 290);
}

#pragma mark -
#pragma mark 设置竖屏时候的尺寸
- (void)setPortraitFrame
{
    self.playerLayer.frame = CGRectMake(5, 5, SCREEN_WIDTH-10, 290);
}

#pragma mark -
#pragma mark 播放结束
- (void)movieEnd:(NSNotification *)notification
{
    NSLog(@"播放结束了");
}

#pragma mark -
#pragma mark 初始化播放器
- (void)createPlayer
{
    NSString *urlStr = [NSString stringWithFormat:@"http://flv2.bn.netease.com/videolib3/1505/24/HYUCE6348/SD/HYUCE6348-mobile.mp4"];

    /**
     *   对网址进行编码
     */
    urlStr = [urlStr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];

    NSURL *url = [NSURL URLWithString:urlStr];

    /**
     *   根据网址,创建视频项目对象
     */
    self.playerItem = [[AVPlayerItem alloc] initWithURL:url];

    /**
     *   创建视频播放器对象
     */
    self.player = [AVPlayer playerWithPlayerItem:self.playerItem];

    /**
     *   创建一个播放器承载对象,把播放器放到上面
     */
    self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];

    /**
     *   设置一下承载对象的尺寸
     */
    self.playerLayer.frame = CGRectMake(5, 5, SCREEN_WIDTH-10, 290);

    /**
     *   设置视频的填充方式
     */
    self.playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;

    /**
     *   把播放器加到layer层上
     */
    [self.playerView.layer insertSublayer:self.playerLayer atIndex:0];

    self.playerView.backgroundColor = [UIColor orangeColor];


}


- (IBAction)startBtn:(id)sender
{
    if (self.isStart == YES) {

        [self.player pause];
    }else{
        [self.player play];
    }

    self.isStart = !self.isStart;

}

- (IBAction)sliderAction:(id)sender
{
    /**
     *   获取当前的时间
     */
    double currentTime = self.duration*self.progressSlider.value;

    // 设置要进行跳转的时间
    CMTime drage = CMTimeMake(currentTime, 1);

    // 对player进行设置
    [self.player seekToTime:drage completionHandler:^(BOOL finished) {


        [self.player play];
    }];

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值