IOS开发之音视频播放


/*
以前一直在纠结,为什么博客园不能够上传代码,把赤裸裸的代码以字符串的形式显示在鄙人的页面上实在是可不舒服 ,好了 ,现在可以一试了 */

      关于视屏播放,可以说只要是个初学者,一直在好奇的事情,就是因为那些爱奇艺,搜狐,腾讯的视频播放器不但要下下来,还要收费,所以我一直觉得关于视频播放是不是有版权或者是他们的播放器做的很高大上,但是在我们IOS之中,学完这个视频播放,也许你会认为很简单;

 

   首先是先讲讲关于视频播放在IOS9之后有了很大的改变

   弃用MPMoviePlayerViewController(mediaPlayer)————》AVKit框架里面的AVPlayerViewController

   其中包括:

    1、AVPlayer播放音视频

    2、AVPlayerItem音视频的对象

    3、AVPlayerLayer  播放显示视频的图层界面

    4、AVPlayerController 视图控制器  可以显示视频并且有调节控件

   

 现在我们有两种方式来创建音频播放

      第一种:使用AVPlayer来创建    需要导入AVFoundation框架

      第二种:使用  AVPlayerController  来创建 ,需要导入AVkit框架

     然后我们先来使用第一种方法来说说使用:

      《1》创建AVPlayerItem  视频内容相关

         <1>创建方式

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

           2、initWithURL:构造方法

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

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

           5、initWithAsset:automaticallyLoadedAssetKeys:

           6、seektoTime 跳转进度(M)

           7、CMTime -)视频播放进度 value   Timescale(每秒播放多少帧)

 

         <2>重要的属性

             《1》duration 总时长

             《2》status 加载状态

                 <1>AVPlayerItemStatusUnknown 未知

                 <2>AVPlayerItemStatusReadyToPlay 准备播放

                 <3>AVPlayerItemStatusFailed 失败

             《3》时间控制的类目

                 <1>currentTime 获得当前播放时间

                 <2>forwardPlaybackEndTime 跳到结束位置

                 <3>reversePlaybackEndTime 调到开始位置

                 <4>seekToTime: 调到指定位置

     

   《2》创建AVpalyer

 

          (1)AVPlayer 播放音视频

               《1》play

               《2》pause

               《3》seekToTime:跳转进度

               《4》currentItem 当前播放的视频元素

               《5》volume 调节音量

               《6》externalPlaybackVideoGravity 视频显示的播放样式

                   <1>AVLayerVideoGravityResizeAspect 普通的

                   <2>AVLayerVideoGravityResizeAspectFill 充满

               《7》currentTime 获得当前播放时间->CMTime

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

   

     《3》创建AVPlayerLayer 添加到父视图

         <1>根据播放器去创建一个可以显示视频的图层playerLayerWithPlayer:->类方法

         <2>设置位置frame

         <3>把视频图层 添加到父图层

      ****注意 :这里也是第一种方法和第二种方法的区别之处,需要创建 AVPlayerLayer 来进行播放

 

    具体代码如下

#import <AVFoundation/AVFoundation.h>

@interface ViewController (){

    AVPlayer *player;

    AVPlayerItem *playerItem;

}

 

@end

 

- (void)viewDidLoad {

    [super viewDidLoad];

    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];

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

    button.backgroundColor = [UIColor orangeColor];

    [button addTarget:self action:@selector(llllll:) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:button];

}

-(void)llllll:(UIButton *)sender{

    /*

     *视频播放需要AVPlayer AVPlayerItem AVPlayerLayer

     

     AVPlayer(视频播放器)去播放——》AVPlayerItem(视频播放的元素)——》AVPlayerLayer(视频播放的视图)

     */

    

    NSURL *url = [[NSBundle mainBundle]URLForResource:@"IMG_9638.m4v" withExtension:nil];

    

    

//    创建要播放的元素

    playerItem = [AVPlayerItem playerItemWithURL:url];

    

//    创建播放器

    player = [AVPlayer playerWithPlayerItem:playerItem];

    

//    创建视频显示的图层

    AVPlayerLayer *layer = [AVPlayerLayer playerLayerWithPlayer:player];

    layer.frame = CGRectMake(200, 200, 100,200);

    [self.view.layer addSublayer:layer];

    

//    视频播放

    [player play];

    

//    获得播发结束的状态 -》通知发送通知的形式

//    AVPlayerItemDidPlayToEndTimeNotification

    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(itemDidPlay) name:AVPlayerItemDidPlayToEndTimeNotification object:nil];

    

//    CMTime -)视频播放进度 value   Timescale(每秒播放多少帧)

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

//    kCMTimeZero  表示初始进度

//    player seekToTime:<#(CMTime)#>   可以跳转到某一个进度

 

}

-(void)itemDidPlay{

    

    NSLog(@"播放结束");

    [player seekToTime:kCMTimeZero];

     [player play];

    NSLog(@"%f",CMTimeGetSeconds(player.currentItem.duration));

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

 

//    采取KVO  获得视频的总时长

//    通过status判断是否准备好

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

    

    

//    快进

//    得到当前的时间+快进的时间  SeekToTime

    

    

}

//当我们点击屏幕的时候获得到点击的位置  让视频调到点击那个位置的进度  最好使用slider来试验效果最棒

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

//   获得到当前播放的时间 (秒)

    Float64 s = CMTimeGetSeconds(player.currentTime);

    s+=2;

    [player seekToTime:CMTimeMake(s, 1)];

 

 

}

 //通过添加观察者来监视视屏播放的状态   获得到视频播放的总时长

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

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

        case 0:

            NSLog(@"未知状态");

            break;

            

        case 1:

            NSLog(@"总时长%f",CMTimeGetSeconds(player.currentItem.duration));

            break;

        case 2:

            NSLog(@"加载失败");

            break;

            

        default:

            break;

    }

 

}

 

 

 

 

 

 


第二种方法创建视频播放器:

 

    在这里我们主要使用的是AVPlayerController,是一个视图控制器,我们利用当前页面直接跳转到视图控制器,来实现视频播放的目的,

   在这里我们不需要AVPlayerLayer,因为视图控制器中直接有这个东西来支持视频播放

 

代码如下

#import <AVKit/AVKit.h>  //首先我们要导入框架 与第一种不一样哦-。-****

 

-(void)playMovie{

 

    //    1.avplayer

    AVPlayer *player = [AVPlayer playerWithURL:[[NSBundle mainBundle]URLForResource:@"IMG_9638.m4v" withExtension:nil]];

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

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

    playerVC.player = player;

    

//    隐藏控制控件

    playerVC.showsPlaybackControls = NO;

    

//    videoGravity  设置视频显示的样式

    

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

    [playerVC.player play];

 

}

 // 这样我们现在就能播放了,相比较第一种方法而言是不是很好用,只是功能相对第一种而言少了很多的多元化,因为这是苹果封装的一个视频播放器,一般不是太复杂的视频播放的需求,都可以使用第二种方法来实现。

 

 

posted @ 2016-03-22 09:48  Biaoac  阅读(886)  评论(0编辑  收藏  举报