AVFoundation视频播放(非音视频流处理)

来源:互联网 发布:积分兑换源码 编辑:程序博客网 时间:2024/04/30 00:00

        前面我们已经提到了利用AVFoundation实现音视频播放,那么为什么这里又来讲一次呢?原因在于他们之间在IOS中的层次结构不一样。

如果我们吧视频播放排个顺序的话:

(1)MediaPlayer.framework(framework) 最上层cocos touch层,简单类比一下。最上层。

(2)AVPlayer (calss)多媒体层 第二层

(3)AVAsset(class) 可以认为更底层一点。

        后面两个都属于AVFoundation框架,第一个部分比较简单这里就不做详细介绍了,第三部分在上一篇对播放、录制已经介绍的比较详细了,也不赘述,这节主要看看第二部分怎么实现,并且了解一下流媒体的一些基本概念。

    在进行视频播放的时候首先我们要想到,所需要展示的视频单帧图像都在什么平台上显示出来?这里我们采用的是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的使用,有三个步骤是必不可少的。

(1)第一步:调用

+ (Class)layerClass

{

      return [AVPlayerLayerclass];

}

在默认情况下,UIView直接关联CALayer。而在使用AVPlayer的时候,我们需要关联的是CALayer的子类。因此这里要通过layerClass重载此方法。重载完成之后,函数会返回已经创建的核心动画层。同样如果你向使用OPENGl时,仅需修改return [CAEAGLLayer class];即可。

(2)第二步:调用

- (AVPlayerLayer *)playerLayer

{

    return (AVPlayerLayer *)self.layer;

}

我们知道在UIView中有个重要的属性:layer。所有从UIView继承来的对象都继承了这个属性。同样我们可以采用这个属性设置所需要显示图像的各种属性。

(3)第三步:调用

-(void)setPlayer:(AVPlayer*)player

{

      [(AVPlayerLayer*)[self layer]setPlayer:player];

}

该函数会返回一个播放层,用于指示一个播放器的可视化输出。一般通过这三个方法即可以完成AVPlayer播放器的定制。

前面我们分析了UIView、CALayer、AVPlayer三者之间的关系,下面我们来看看利用AVFoundation.framework框架播放视频的具体步骤。

对于流媒体文件来说:

(1)通过AVURLAsset设置流媒体播放对象。

(2)创建playerItem对象

(3)判断视频播放状态,等待监听到播放状态发生改变,触发响应

(4)播放流媒体视频文件。

使用起来API很简单:

[playerseekToTime:kCMTimeZero];

[player play];

[player pause];

回调方法可以控制播放进度,使用起来比较简单,自己做个demo试试呵呵。不过说了。



0 0
原创粉丝点击