AV Level:
(1)MediaPlayer.framework(framework) 最上层cocostouch层,简单类比一下。最上层。
(2)AVPlayer (calss)多媒体层 第二层
(3)AVAsset(class) 可以认为更底层一点。
AVPlayer
在进行视频播放的时候首先我们要想到,所需要展示的视频单帧图像都在什么平台上显示出来?这里我们采用的是UIView承载显示的图像。UIView是ios中图像显示的基本元素。另外除了UIView之外,还需要CALayer管理整个界面的显示。UIView是ios中绘图的一个非常重要的类。同时每一个UIView还有一个CALayer类层。从结构上来看UIView和CALayer都是的老祖都是继承NSObjet根类。其中UIView主要用于显示图像以及相应一些触发事件。而CALayer主要用于管理整个图像显示层。例如控制整个图像的属性等。UIView和CALayer共同构成了整个图像的显示结构。CALayer是整个图像显示的基础,UIView是图像显示的高层封装应用。两者是相互依赖相辅相成的。另外我们再来分析一下两者的继承结构。CALayer是直接继承NSObjet,而UIView则在继承底层UIResponder之后再来继承的NSObjet。因此这也是UIView为什么用于相应触发事件的原因。
制作视频播放器的方法很多,在本章中我们主要使用MediaPlayer.framework框架中的MediaPlayer以及AVFoundation.framework框架中的AVPlayer播放本地以及网络视频。MediaPlayer使用的是CALayer类制作播放器。而AVPlayer主要利用CALayer的子类播放视频文件。
在使用AVPlayer以及以后利用opengl等技术播放视频文件或者进行图像处理时,一般都需要重载layerClass方法。AVPlayer的使用,有三个步骤是必不可少的。
- 在默认情况下,UIView直接关联CALayer。而在使用AVPlayer的时候,我们需要关联的是CALayer的子类。因此这里要通过layerClass重载此方法。重载完成之后,函数会返回已经创建的核心动画层。同样如果你向使用OPENGl时,仅需修改return [CAEAGLLayer class];即可。
+ (Class)layerClass
{
return [AVPlayerLayer class];
}
- 我们知道在UIView中有个重要的属性:layer。所有从UIView继承来的对象都继承了这个属性。同样我们可以采用这个属性设置所需要显示图像的各种属性。
- (AVPlayerLayer *)playerLayer
{
return (AVPlayerLayer *)self.layer;
}
该函数会返回一个播放层,用于指示一个播放器的可视化输出。一般通过这三个方法即可以完成AVPlayer播放器的定制。
前面我们分析了UIView、CALayer、AVPlayer三者之间的关系,下面我们来看看利用AVFoundation.framework框架播放视频的具体步骤。
对于流媒体文件来说:
(1)通过AVURLAsset设置流媒体播放对象。
(2)创建playerItem对象
(3)判断视频播放状态,等待监听到播放状态发生改变,触发响应
(4)播放流媒体视频文件。
-(void)setPlayer:(AVPlayer*)player
{
[(AVPlayerLayer*)[self layer]setPlayer:player];
}
[player seekToTime:kCMTimeZero];
[player play];
[player pause];
Buffering view before play
As early as possible, create the AVPlayer with the remote asset.
- Observe the AVPlayerItem (playback buffers, etc.) to make sure it has buffered enough data to play smoothly at the beginning. (See: Preloading video to play without delay )
- Show your progress screen.
- When the player item is ready, remove the progress screen
Depending on the network connection, you may not experience smooth playback the whole way through, but monitoring the player item should let you show some UI if your player is buffering.