实例:
常识:就是这定义了针对不同的系统,如果是不是ios的头文件,也就是切换不到对应的头文件里面;
AVPlayer :NSObject
1)管理播放和管理多媒体时间的分配;
2)提供去控制播放器的传输(变化)行为eg:播放、停止、改变播放装置的速率、在媒体时间线寻找不同的时间点;
3)可以播放本地或者远程多媒体文件、例如:QuickTime movies 、 MP3 音频文件, 试听媒体服务的http直播流;
注意:
1)AVPlayer 在一个时间只能够播放一个媒体资源, replaceCurrentItemWithPlayerItem: 这个方法可以重用来播放多个视频;但是一个时间只能够播放一个;(触发一次播放只能够播放一个视频)
2) AVQueuePlayer(AVPlayer子类)用来创建、管理一系列的媒体资源能够继续地被播放;(这个触发一次可以连续播放准备好的多个视频)
AVAsset 类 —————— AVPlayerItem
1、存储多媒体的模型(多媒体的静态方面的属性:eg:创建时间、延时),
2、它本身不适用与AVPlayer(也就是被AVPlayer直接调用);
3、要播放AVAsset资源,需要创建一个动态的对应物在AVPlayerItem中,该对象模仿(模型化出)时间分配和AVPlayer对象被播放显示的状态;【也就是AVPlayer通过AVPlayerItem来使用AVAsset】
获取AVPlayer中的属性内容的方式:静态属性、动态属性(时间)
AVPlayer 是一个动态变化的对象,有两种方式去监听播放器的状态;
1)General State Observations:
(1)KVO 的方式监听player的动态属性,e.g.:**currentItem 或者 playback rate **
(2)必须注册或者注销kvo的改变的通知在 主线程 ;如果在另外的线程上进行更改,可能没有收到通知的部分;
observeValueForKeyPath:ofObject:change:context: 使用这个方法在主线程上;
2)Timed State Observations:
(1)kvo不能够很好的观察改变的状态,eg:播放时间
(2)2种方法:
addPeriodicTimeObserverForInterval:queue:usingBlock: 监听周期性的时间变化
addBoundaryTimeObserverForTimes:queue:usingBlock: 监听边界的时间变化
一旦状态发生改变,就会执行block里面的内容;就可以在block做一些处理,eg:更新用户播放页面的状态
AVPlayer 、 AVPlayerItem 不是可见对象,也就是不能够直接显示在屏幕上,还需要其他的东东;
2中方法显示:
1)AVKit : 使用AVPlayerViewController (ios、tvos) 、 AVPlayerView(macOs)
将会显示视频的内容包括播放装置、播放控件、和其他的媒体特色 是全屏显示;
2)AVPlayerLayer :
(1)自定义播放界面,** 使用 Core Animation CALayer 的子类为CAPlayerLayer 在AVFoundation上; **
(2)player layer 可以设置为view的(支持)Layer 或者能够直接被添加到layer上;不像AVPlayerView、AVPlayerViewController ,一个Player layer 不能够显示播放装置控件,它们只是简单的显示可见的内容在屏幕上。
3)也就是这些播放装置的空间需要人为的创建去播放、暂停、查找;
同步数据(内容)
除了显示可见的内容通过AVKit或者AVPlayerLayer ,你也能;够同步的显示动画内容通过使用palyer时间皮配置使用AVSynchromnizedLayer。它是CALayer的子类,用于授权到当前Player 时间配置到他的layer 子树;
可以使用AVSynchronizedLayer 创建自定义效果的动画;e.g.:动画或视频过渡的下段,并在与玩家当前的avplayeritem定时同步播放。
外部设备的播放数据处理:
外部播放模型
外部播放模式是当视频数据被松台外面的设备例如apple TV通过Airplay 和mini-connector-based HDMI/VGA 适配器满屏精确播放;
传送到外部设备山的视频数据会被重新压缩才会送到外部设备上;外部设备解压这些数据并且显示视频;
外部播放性能影响AirPlay视频播放是废弃的AirPlay支持属性替换。
注意:
外部播放属性不适用于基于视频输出电缆和适配器的30针连接器。
***基本的属性的分类****
基本上就是一下几个分类:
Creating a Player (创建)
Managing Playback (管理播放)
Managing Automatic Waiting Behavior (管理自动等待的行为)
Managing Time (管理实践)
Observing Time (监听事件)
Media Selection Criteria Settings (媒体选项标准设置)
Managing Closed Caption Display (管理关闭字幕显示)
Managing External Playback (管理外部播放)
Synchronizing Playback to an External Source (同步播放到外部资源上)
Managing Audio Output (管理音频输出)
Player Properties (播放属性)
Managing AirPlay (管理AirPlay)
Constants (常量)
Instance Properties (实例属性)
实例链接:
https://github.com/helinyu/test_AVPlayer
AVQueuePlayer 的内容:
两种方法创建和初始化:
- (instancetype)queuePlayerWithItems:(NSArray<AVPlayerItem *> *)items;
- (AVQueuePlayer *)initWithItems:(NSArray<AVPlayerItem *> *)items;
- (NSArray<AVPlayerItem *> *)items; //所有的item
- (void)advanceToNextItem; // 下一个
- (BOOL)canInsertItem:(AVPlayerItem *)item afterItem:(nullable AVPlayerItem *)afterItem; //能否插入
- (void)insertItem:(AVPlayerItem *)item afterItem:(nullable AVPlayerItem *)afterItem; 插入,一定是插在队列的尾部
- (void)removeItem:(AVPlayerItem *)item; // 删除player指定的item
- (void)removeAllItems; //删除所有的item
可参考链接:
http://blog.csdn.net/sharpyl/article/details/51915856
&&&(时间上的精确)
CMTime 时间,表示通过分数来进行表示:
numerator (int64_t value) 分子 denominator (int32_t timescale) 分母
stored (+infinity, -infinity, indefinite, invalid). 允许存储非数字的值;
是否完全精确
timelines : 可以是被增加通过loop,,去区分不同的loop,loop 0 和loop1 相同的名字的不同;
能够和CFDictionry之间进行转化,通过CMTimeCopyAsDictionary 和CMTimeMakeFromDictionary 这个对象(方法);
Quetion: 存在一个问题,就是视频播放的同步还是出现了一点问题:
*** 有时间需要查看一下旋转的内容
&&& 这个文档
AVSynchronizedLayer:CALayer
有关的同步的layer,
类似:CATransformLayer 这个
AVSynchronizedlayer 在指定的AVPlayerItem记时同步;
它本省并不会显示,它只是授权了layer子树的状态,
AVPlayerItem *playerItem = <#Get a player item#>;
CALayer *superLayer = <#Get a layer#>;
// Set up a synchronized layer to sync the layer timing of its subtree
// with the playback of the playerItem
AVSynchronizedLayer *syncLayer = [AVSynchronizedLayer synchronizedLayerWithPlayerItem:playerItem];
[syncLayer addSublayer:<#Another layer#>]; // These sublayers will be synchronized.
[superLayer addSublayer:syncLayer];
- synchronizedLayerWithPlayerItem:
初始化
playerItem layer的记时同步;
AV库的截图方法(这里涉及到CMTime类)