iOS视频播放之AVFoundation框架

上一章说了iOS中音频播放的一些方法,不过现在APP中音频和视频都是不可缺少的,他们都是AVFoundation框架中的类,这里就简单的说下视频的类AVPlayer。

首先要说一下,现在是iOS9的系统,苹果公司在推出iOS9之后弃用了之前使用的MPMoviePlayerViewController,改用了AVPlayerViewViewController(<AVKit/AVKit.h>)框架,这个框架是使用视频播放控制器的时候要使用的方法,简单的创建一个视频播放器不导入AVKit也可以的,只需导入AVFoundation框架即可。

首先介绍一下视频播放相关的类名

1.AVPlayer 用于播放音视频
2.AVPlayerItem 音频的对象
3.AVPlayerLayer 播放显示视频的图层界面
4.AVPlayerViewController 他会帮你去创建显示视频的图层 有调节控件

接下来我们说一下具体的步骤

在开始之前,我们需要明白,播放视频需要三部分完成,第一部分是AVPlayer,视频播放器,第二部分是AVPlayerItem,视频要播放的元素,AVPlayerLayer,视频显示的图层。

他们的具体流程是AVPlayer(视频播放器) ->去播放AVPlayerItem视频播放的元素 ->展示播放的视图AVPlayerLayer

要注意视频播放和音频播放雷同,也需要把视频播放器设置为全局变量

@interface ViewController ()
{
    AVPlayer *player;
}
@end

同样我们需要一个视频元素的URL,这里我直接使用本地工程内的一个文件。

//   1 创建要播放的元素

    NSURL *url = [[NSBundle mainBundle]URLForResource:@"视频文件名" withExtension:nil];
//    playerItemWithAsset:通过设备相册里面的内容 创建一个 要播放的对象    我们这里直接选择使用URL读取
    AVPlayerItem *item = [AVPlayerItem playerItemWithURL:url];

    //    duration   当前播放元素的总时长
//    status  加载的状态         AVPlayerItemStatusUnknown,  未知状态
//    AVPlayerItemStatusReadyToPlay,  准备播放的状态
//    AVPlayerItemStatusFailed   失败的状态

//    时间控制的类目
//    current
//    forwordPlaybackEndTime   跳到结束位置
//    reversePlaybackEndTime    跳到开始位置
//    seekToTime   跳到指定位置

//2  创建播放器
player = [AVPlayer playerWithPlayerItem:item];
//也可以直接WithURL来获得一个地址的视频文件
//    externalPlaybackVideoGravity    视频播放的样式
//AVLayerVideoGravityResizeAspect   普通的
//    AVLayerVideoGravityResizeAspectFill   充满的
//    currentItem  获得当前播放的视频元素

//    3  创建视频显示的图层
    AVPlayerLayer *layer = [AVPlayerLayer playerLayerWithPlayer:player];
    layer.frame = self.view.frame;
   // 显示播放视频的视图层要添加到self.view的视图层上面
    [self.view.layer addSublayer:layer];

//最后一步开始播放
[player play];

到这一步,就能实现简单的视频播放了,但是并不能像手机应用上面,既有快进,又有暂停,还可以看到进度条。那么我们来试着实现这几点。

视频一共有几个状态,没播放之前的状态,预播放状态,播放状态,当视频预播放的时候我们才能获得时长,但是我们怎么能知道什么时候视频预播放完毕,就是怎么样获得时长的办法了,我们可以通过KVO来实现这一要求。添加一个观察者去监听item的状态。

//    采取kvo的形式获取视频总时长
//    通过监视status判断是否准备好

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

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
//    NSLog(@"%@",change[@"new"]);
    switch ([change[@"new"]integerValue]) {
        case 0:{
            NSLog(@"未知状态");
            break;
        }
        case 1:{
            NSLog(@"获得视频总时长  %f",CMTimeGetSeconds(player.currentItem.duration));//CMTime在下面会介绍
            break;
        }
        case 2:{
            NSLog(@"加载失败");
            break;
        }
        default:
            break;
    }
}

那么这样我们通过添加一个监听来达到可以获得他视频元素状态的改变,来得到一个视频时长。

还有一点要说的是,我们得到视频时长的时候,获得的值是一个CMTime类型的值,他表示视频播放的进度,它里面有两个属性,一个是value(进度)一个是timescale(帧率)

//    CMTime 视频播放进度  value(进度)    timescale(帧率)
//    CMTimeMake(<#int64_t value#>, <#int32_t timescale#>)
//    kCMTimeZero  表示初始进度
//    seekToTime:跳转到某一个进度
//    currentTime获得当前时间,CMTime类型
//    CMTimeGetSeconds(<#CMTime time#>)通过一个CMTime来获得当前播放时间的秒数

了解了这个属性之后快进功能我们也可以来实现了
快进的功能就是得知当前视频的时间,然后在这个时间的基础上加上一段时间,就达到了快进的功能。
那么我们可以获得当前的时间

 Float64 cur = CMTimeGetSeconds(player.currentTime);

首先获得当前的时间,然后令他自加5秒。
每次点击,都获得当前的时间,然后令他自加5秒。
然后使用视频播放时来跳转到这个时间。

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

帧率在这里我们可以先不用去管它,如果想了解的话也可以去度娘一下,在视频动画制作的时候会接触这个知识。

然后说一个视频播放的系统方法

- (void)itemDidPlayToEndTime:(NSNotificationCenter *)not
{
    NSLog(@"播放结束");
    //使视频在播放结束的时候跳转到初始画面。
    [player seekToTime:kCMTimeZero];
}

基本属性在上面都有介绍,这是制作一个简单的视频播放器的方法,那怎么样能快速简洁的制作一个播放器呢,其实iOS里面有一个专属的类,交视频播放控制器AVPlayerViewController。
使用这个方法可以直接跳转到一个带有视频播放器的一个控制器controller。同时里面带有工具栏。需要注意的是在你使用AVPlayerViewController的时候,需要先导入AVKit框架。在开头已经告诉了大家这个框架。

1 准备一个播放器

AVPlayer *player = [AVPlayer playerWithURL:[[NSBundle mainBundle]URLForResource:@"视频文件名" withExtension:nil]];

2.创建一个AVPlayerViewController,同时把其上面的播放器设置为你初始化的播放器。

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

playerVC.view.frame = CGRectMake(50, 50, 300, 250);
    [self.view addSubview:playerVC.view];
    player.externalPlaybackVideoGravity = AVLayerVideoGravityResizeAspectFill;//这个属性和图片填充试图的属性类似,也可以设置为自适应试图大小。

3 开始播放

[player play];

只有简单的几部就可以完成一个视频播放器。这个视频播放控制器也可以通过跳转来进入

showsPlaybackControls这个属性可以控制播放器是否显示工具栏,默认是YES
它里面也有一些代理方法来方便对其进行操作
- (void)playerViewControllerWillStartPictureInPicture:(AVPlayerViewController *)playerViewController;
{
// 在视频将要开始播放的时候调用
}

- (void)playerViewControllerDidStartPictureInPicture:(AVPlayerViewController *)playerViewController;
{
    //视频已经开始的时候调用
}

- (void)playerViewController:(AVPlayerViewController *)playerViewController failedToStartPictureInPictureWithError:(NSError *)error//播放失败的时候

- (void)playerViewControllerWillStopPictureInPicture:(AVPlayerViewController *)playerViewController;//将要停止的时候

- (void)playerViewControllerDidStopPictureInPicture:(AVPlayerViewController *)playerViewController;//已经停止的时候

经常使用的就是这些属性,这次简单介绍了视频播放的一些知识,下次在介绍一些视频录制的一些相关知识。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容