上一次学习了《AVFoundation开发秘籍》的第一至三章,现在继续学习AVFoundation.
视频播放
视频播放是AVFoundation的其中一项功能,视频播放的主要类如下所示:
视频播放综述
AVPlayer
AVFoundation的播放功能都围绕AVPlayer展开,AVPlayer是一个用来播放基于时间的视听媒体的控制器对象,支持本地,分步下载或HTTP Live Streaming协议得到的流媒体。是一个不可视组件。AVPlayer只管理一个单独资源的播放,若要管理一个资源队列,可使用AVQueuePlayer子类。
AVPlayerLayer
AVPlayerLayer是一个可视化组件,创建实例需要一个指向AVPlayer实例的指针。它是一个相当简单的类,开发者需要自定义的属性只有videoGravity,分为AVLayerVideoGravityResizeAspect(缩放保持原始宽高比),AVLayerVideoGravityResizeAspectFill(保持宽高比并填充范围)和AVLayerVideoGravityResize(拉伸视频以匹配范围)。
AVPlayerItem
视频播放的最终是使用AVPlayer来播放AVAsset指向的资源,但AVAsset只包含媒体资源的静态信息,当我们需要对一个资源及相关曲目进行播放时,首先需要通过AVPlayerItem和AVPlayerItemTrack类构建相应的动态内容。
播放基础
播放视频
播放的通用基础代码如下所示:
状态监控
AVPlayerItem具有一个名为status的AVPlayerItemStatus类型的属性,在对象创建之初,状态由AVPlayerItemStatusUnknown,当status变为AVPlayerItemStatusReadyToPlay时,具体内容才可以播放。开发者可通过KVO机制来监视status的变化。
时间处理
AVFoundation是基于Core Media的高层封装,时间处理使用的是CMTime数据结构,定义如下:
typedef struct {
CMTimeValue value;
CMTimeScale timescale;
CMTimeFlags flags;
CMTimeEpoch epoch;
}CMTime;
CMTime关键的两个值是value和timescale,其中value是一个64位整数值,timescale是一个32位整数值。在时间呈现样式中分别作为分子和分母。可使用CMTimeMake建立时间。其中kCMTimeZero表示0。
AVPlayer时间监听
AVPlayer提供了两种基于时间的监听方法,让应用程序可以对时间变化进行精准的监听。
定期监听
通常情况下,我们希望以一定时间间隔获得通知,若需要随着时间的变化移动播放头位置或更新时间显示,可使用AVPlayer的addPeriodicTimeObserverForInterval:queue:usingBlock:方法,参数如下:
- interv: 一个用于指定通知周期间隔的CMTime值
- queue: 通知发送的顺序调度队列,若没有明确指定默认为主队列
- block: 一个在指定的时间间隔中将会在队列上调用block。传递一个CMTime值用于指示播放器的当前时间
边界时间监听
AVPlayer还提供了一种更有针对性的方法来监听时间,应用程序可以得到播放器时间轴中多个边界点的遍历结果。这一方法主要用于同步用户界面变更或随着视频播放记录一些非可视化数据,以此判断用户播放数据,需用addBoundaryTimeObserverForTimes:queue:usingBlock:方法,参数如下:
- times: CMTime值组成一个NSArray数组定义了需要通知的边界点。
- queue: 用来发送通知的顺序调度队列,指定NULL默认主队列。
- block: 每当正常播放中跨越一个边界