视频播放

来源:互联网 发布:公司内部流程优化 编辑:程序博客网 时间:2024/04/29 18:11

     视频播放,不用多说大家都能知道是什么怎样操作,现在手机软件中有很多视频播放的软件,今天我们来学习一下用代码怎样实现视频播放。

 一、介绍一下iOS9.0之后的改变 

        iOS9.0之后弃用MPMoviePlayerViewController这个类以及需要导入框架MediaPlayer

   iOS9.0使用的AVPlayerViewController,需要导入的框架是AVFoundation


二、介绍使用到的类

 AVPlayer:播放音视频

 AVPlayerItem:音视频的对象

 AVPLayerLayer:播放显示视频的图层界面

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


三、具体的使用

 使用

 1AVPlayer:直接播放

 1)创建AVPlayerItem视频内容相关

 2)创建AVPlayer

 3)创建AVPlayerLayer添加到父视图视频操作相关

 4)播放

 

 创建AVPlayerItem的方法

 1playerItemWithURL:类方法通过URL地址创建要播放的对象(可以是本地也可是在线)

 2initWithURL:构造方法

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

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

 5initWithAsset:automaticallyLoadedAssetKeys:


创建AVPlayer的方法

1、playerWithURL:URL

2、initWithURL:URL

3、playerWithPlayerItem:item

4、initWithPlayerItem:item


创建AVPlayerLayer的方法

 1)根据播放器去创建一个可以显示的图层playerLayerWithPlayer:类方法

  2)设置位置frame

  3)将显示的图层添加到父图层

  4)播放器*****play开始播放

 

  5)获得播放状态

    AVPlayerItem:音视频播放的对象

    duration:总时长

    status:记载状态

    AVPlayerItemStatusUnknown,未知状态

    AVPlayerItemStatusReadyToPlay,准备播放

    AVPlayerItemStatusFailed失败


其他属性

seekToTime跳转到某一个进度

 CMTime:结构体两个参数 value timeScale(帧率)

 

 AVPlayer播放音视频

 play:播放

 pause:暂停

 seekToTime:跳转进度

 currentItem:当前播放的视频元素

 volum:调节音量

 externaPlaybackVideoGravity

 视频显示的样式:

 AVLayerVideoGravityResizeAspect:普通的

 AVLayerVideoGravityResizeAspectFill:充满的

 currentTime:获得当前播放的时间 CMTime类型

 通过CMTime获得当前时间秒CMTimeGetSeconds(

 CMTime time)


具体代码

#import "ViewController.h"

#import <AVFoundation/AVFoundation.h>

@interfaceViewController ()

{

    AVPlayer *player;

}

@end


@implementation ViewController


- (void)viewDidLoad {

    [superviewDidLoad];

    UIButton *button = [UIButtonbuttonWithType:UIButtonTypeCustom];

    button.frame =CGRectMake(100,100,100,100);

    [button setTitle:@"TICK"forState:UIControlStateNormal];

    button.backgroundColor = [UIColorblueColor];

    [button addTarget:selfaction:@selector(doit)forControlEvents:UIControlEventTouchUpInside];

    

    [self.viewaddSubview:button];

}


- (void)doit{

    /*

     视频播放需要三个东西:AVPlayerAVPlayerItemAVPlayerLayer

     AVPlayer:是一个视频播放器,去播放视频

     AVPlayerItem:视频播放的元素

     AVPlayerLayer:展示播放的视图

     */

    

    //   1创建播放的元素

    NSURL *URL = [[NSBundlemainBundle]URLForResource:@"IMG_9638.m4v"withExtension:nil];

    

    AVPlayerItem *item = [AVPlayerItemplayerItemWithURL:URL];

    

    //  2、创建播放器

    player = [AVPlayerplayerWithPlayerItem:item];

    

    //    3、创建视频播放的图层

    AVPlayerLayer *layer = [AVPlayerLayerplayerLayerWithPlayer:player];

    

    layer.frame =self.view.frame;

    

    //    4、添加到父视图上

    [self.view.layeraddSublayer:layer];

    

    //    5、开始播放

    [playerplay];

    

    //   获得播放结束的状态,通过发送通知的形式获得播放结束的状态->AVPlayerItemDidPlayToEndTimeNotification

    

    [[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(itemDidPlayToEndTime:)name:AVPlayerItemDidPlayToEndTimeNotificationobject:nil];

    

//        NSLog(@"获得视频总时长%f",CMTimeGetSeconds(player.currentItem.duration));

    

    //    player.currentItem.status =只要可以获得到当前视频元素准备好的状态,就可以得到总时长

    //   采取KVO的形式获得总时长

    //   通过监视status判断是否准备好 -->获得

    [item addObserver:selfforKeyPath:@"status"options:NSKeyValueObservingOptionNewcontext:nil];

    

}

- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    //   获得当前播放的时间

    Float64 cur =CMTimeGetSeconds(player.currentTime);

    cur += 1;

    [playerseekToTime:CMTimeMake(cur,1)];

    

}



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

    

    //    NSLog(@"status:%@",change[@"new"]);

    switch ([change[@"new"]integerValue]) {

        case0:

        {

            NSLog(@"未知状态");

        }

            break;

        case1:

        {

            NSLog(@"获得视频的总时长%f",CMTimeGetSeconds(player.currentItem.duration));

        }

            break;

        case2:

        {

            NSLog(@"加载失败");

        }

            break;

            

        default:

            break;

    }

}


- (void)itemDidPlayToEndTime:(NSNotification *)not{

    NSLog(@"播放结束");

    //    CMTime表示视频播放的进度

    //    value(具体的进度) timescale(帧率)

    //    CMTimeMake(<#int64_t value#>, <#int32_t timescale#>)

    

    //    kCMTimeZero:表示初始进度

    //    seekToTime:跳转到某一个进度

    [playerseekToTime:kCMTimeZero];

    

}




快速创建视频播放器的方法,自带播放按钮

#import "ViewController.h"

#import <AVFoundation/AVFoundation.h>

#import <AVKit/AVKit.h>

@interfaceViewController ()


@end


@implementation ViewController


- (void)viewDidLoad {

    [superviewDidLoad];

    UIButton *button = [UIButtonbuttonWithType:UIButtonTypeCustom];

    button.frame =CGRectMake(100,100,100,100);

    [button setTitle:@"TICK"forState:UIControlStateNormal];

    button.backgroundColor = [UIColorbrownColor];

    [button addTarget:selfaction:@selector(playMovie)forControlEvents:UIControlEventTouchUpInside];

    [self.viewaddSubview:button];

    

}

- (void)playMovie{

    

    //   1AVPLayer

    AVPlayer *player = [AVPlayerplayerWithURL:[[NSBundlemainBundle]URLForResource:@"IMG_9638.m4v"withExtension:nil]];

   //   创建视频播放视图的控制器

    AVPlayerViewController *playerVC = [[AVPlayerViewControlleralloc]init];

    playerVC.player = player;

    

    playerVC.showsPlaybackControls =NO;

    

    playerVC.view.frame =CGRectMake(100,100,100,100);

    [self.viewaddSubview:playerVC.view];

//    [self presentViewController:playerVC animated:YES completion:nil];

    

    [playerVC.playerplay];

}




0 0
原创粉丝点击