iOS_AVFoundation视频播放探究_白亚辉

iOS_AVFoundation视频播放探究_白亚辉

ID:83271626

大小:1.78 MB

页数:6页

时间:2023-09-26

上传者:用户名
iOS_AVFoundation视频播放探究_白亚辉_第1页
iOS_AVFoundation视频播放探究_白亚辉_第2页
iOS_AVFoundation视频播放探究_白亚辉_第3页
iOS_AVFoundation视频播放探究_白亚辉_第4页
iOS_AVFoundation视频播放探究_白亚辉_第5页
iOS_AVFoundation视频播放探究_白亚辉_第6页
资源描述:

《iOS_AVFoundation视频播放探究_白亚辉》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

电子技术与软件工程软件开发与应用ElectronicTechnology&SoftwareEngineeringSoftwareDevelopment&ApplicationiOSAVFoundation视频播放探究白亚辉(中国人民武装警察部队河北省总队河北省石家庄市050000)摘 要:本文主要介绍iOS平台下视频播放的几种方式及其常见问题。结合代码与框架深入探究视频播放的整个过程及其原理。关键词:视频播放;iOS;AVFoundation;AVKit;WKWebView我们开发中很多地方会用到视频播放功能,对于iOS平台视频播放大致分为两大类:使用苹果的官方API实现视频播放功能。(AVKit,AVFoundation)和使用集成ffmpeg框需要我们做的只是简单的在我们的视图中添加架的第三方库。(ijkplayer,kxmovie等)。本文现只针对第UIWebView(WKWebView)然后调用加载方法去加载html文一种方式做简单的探究。件即可。代码如下:播放一段本地的视频我们貌似可以通过以下几种方webView=WKWebView(frame:self.view.frame);法实现。一是通过在APP中嵌套WebView(UIWebView,letpath=Bundle.main.path(forResource:"movieHtml",WKWebView)加载Html5标签Video来实现视频播放的ofType:"html");功能。二是通过AVKit框架实现视频播放。三是通过底层letrequest=URLRequest.init(url:URL(fileURLWithPath:AVFoundation框架实现视频播放。实际上,无论哪种方式归path!))webView?.load(request);根结底仍然离不开底层AVFoundation的身影。self.view.addSubview(webView!);该例当中加载了一个本地html文件播放本地视频文件,1Html5video标签播放视频实际当中也可以加载自己服务器端的html文件播放服务端特殊说明:基于mediaPlayer类库的MPMediaPlayer视频文件。Controller(iOS9后遭到废弃,被AVPlayerViewController1.2原理分析所替代)iOS8之后苹果推荐使用WKWebView替代UIWebView,其主要的优点有:首先我们要了解一个概念WebKit,WebKit是一个开(1)WKWebView更多的支持HTML5的特性;源的浏览器引擎,我们在浏览器中能够看到各种各样的网(2)WKWebView更快,占用内存可能只有UIWebView页就是因为WebKit帮助我们解析html代码呈现给我们。的1/3~1/4;很多浏览器包括safar,Chrome就是一款基于WebKit的浏(3)WKWebView高达60fps的滚动刷新率和丰富的内览器,在我们的app中无论原有的UIWebView还是现有的置手势;WKWebView其内核也是基于WebKit的。有一点我们应当(4)WKWebView具有Safari相同的JavaScript引擎;知道,由于各个平台软硬件的不同,不同平台下WebKit也(5)WKWebView增加了加载进度属性将;有不同的WebKitport。下面是不同WebKitpor的异同:(6)UIWebViewDelegate和UIWebView重构成了14WebKitport共同之处:个类与3个协议。(1)DOM、winow、document;(2)CSS对象模型;1.1使用方式(3)CSS解析,键盘事件处理;通过webView嵌套html的video标签实现视频播放,(4)HTML解析和DOM构建;如下:(5)所有的布局和定位;!DOCTYPEHTML>(6)Chrome开发工具和WebKit检查器的UI与检查器;(7)contenteditable、pushState、文件API、大多数SVG、CSSTransformmath、WebAudioAPI、localStorage等功能;(8)很多其他功能与特性。Yourbrowserdoesnotsupportthevideotag.WebKitport不同之处:53

1软件开发与应用电子技术与软件工程SoftwareDevelopment&ApplicationElectronicTechnology&SoftwareEngineering图1:AVKit框架(10)JavaScript引擎;(11)JavaScriptCore在WebKitrepo中。V8和JavaScriptCore被绑定在WebKit中;(12)表单控制器的渲染;(13)

2电子技术与软件工程软件开发与应用ElectronicTechnology&SoftwareEngineeringSoftwareDevelopment&Applicationservicesformediaplayback,completewithusercontrols,chapternavigation,andsupportforsubtitlesandclosedcaptioning.TheAVKitframeworkprovidesahigh-levelinterfaceforplayingvideocontent.”大致意思为:为媒体播放创建视图层级的服务,包括用户控制,章节导航,并且支持副标题,隐藏字幕。AVKitframework为播放视频能容提供了一个高级的接口。AVKit框架是Apple为我们提供的一个视频播放高级框架,iOS8以后可以使用,基于AVFoundation实现。AVKit高度封装,可以简化我们的播放视频的过程,当然也会带来一些的弊端,一些高度定制化的功能通过AVKit无法实现,图3:View层次图例如视频编辑等。计的app主题不符,影响用户体验。所以通常情况下我们那么AVKit为我们提供了哪些类,这些类能帮助我们做会对播放界面做相应的修改。修改之前我们先了解下下什么呢?通过查看其引用关系我们应该能大致了解其功能。AVPlayerViewController的几个重要属性。如iOS中的AVKit框架引用关系如图2(iOS10.3其中带小(1)player:用户播放视频的主要控件。需要初始化后旗子的部分为@class引入方式)。丢入到AVPlayerViewController。可以看到AVKit框架下涉及到的类并不多。主要的只有(2)showsPlaybackControls:用于控制是否显示系统默两个AVPictureInPictureController和AVPlayerViewController,认的控制条。其中AVPictureInPictureController用于画中画的相关实(3)videoGravity:定义了视频应该怎样在AVPlayer现。AVPlayerViewController用于视频播放,AVPlayerViewLayer中显示的字符串,包括AVLayerVideoGravityResizeController为我们提供了一个带简单操作条的视频界面。Aspect(默认)、AVLayerVideoGravityResizeAspectFill、2.1使用方法AVLayerVideoGravityResize三种。(4)contentOverlayView:一个处于控制视图和视频视通过播放一段本地视频的方法如下:图中间的view,用来添加额外定义的视图。letpath=Bundle.main.path(forResource:"movie",ofType:(5)allowsPictureInPicturePlayback:是否允许画中画"mp4");模式。letplayer=AVPlayer.init(url:URL.init(fileURLWithPath:我们可能会有一个思路是通过隐藏系统的控制条,path!));然后在contentOverlayView添加自己的视图来自定义控letplayerVC=BAVPlayerViewController();制条。事实上这样可能并不能很好的解决我们的问题。playerVC.player=player;contentOverlayView可以显示我们需要添加的控件,但是它self.present(playerVC,animated:true){};并不能响应事件。通常这种情况会有下面几种可能:其中BAVPlayerViewController继承自AVPlayerView(1)view本身设置isUserInteractionEnabled=false;Controller之所以这样做是因为后面我们会在这个类中做一(2)view父控件设置isUserInteractionEnabled=false;些视频控制界面的改变(这些改变必须在视图加载后,比如(3)view前方有其他控件遮挡。contentOverlayView要在viewDidLoad之后才能获取到)。所以我们设置self.contentOverlayView?.isUserInteraction如果不想做任何修改直接用AVPlayerViewController即可。Enabled=true;self.contentOverlayView?.superview?.isUser在iphone与iPad上运行会有些许不同,ipad上比iPhoneInteractionEnabled=true;验证后仍然无妨响应事件。为了验上右下角会多处一个画中画的操作按钮。点击后可进入画证遮盖问题我们有必要了解下播放视频时的view层次图,中画模式。画中画模式是iOS9添加的一个功能,可以通过如图3(基于iOS10.3)。AVPlayerViewController的allowsPictureInPicturePlayback属从图3中可以看到我们使用的contentOverlayView前面性进行控制,默认为true。确实会存在两个view,一个AVTouchIgnoringView从字面意2.2修改视频界面思理解不处理触摸事件的view(透明的UIView),也就是可以看到AVPlayerViewController为我们提供的播放这个view会将事件传递的其后面的view(根据进度条view界面并不是那么美观。在实际应用也很可能会与我们设可以响应事件也可以推断AVTouchIgnoringView并不会拦截55

3软件开发与应用电子技术与软件工程SoftwareDevelopment&ApplicationElectronicTechnology&SoftwareEngineering做到。通过前面的了解,我们知道AVKit框架播放视频其事只是做了两件事:一提供了画中画相关功能。二提供一个viewController,自带并不是很美观的视频播放界面。(修改界面可以做到,但实现方式却比较low)。真正做到视频播放的其实是AVPlayer,而AVPlayer是AVFoundation框架的主要角色之一,所以AVKit视频播放其实也是AVFoundation视频播放过程。3AVFoundation框架播放视频首先看一下苹果官方网站AVFoundation的定义如下:图4:AVFoundation在iOS中所处的位置AVFoundationisoneofseveralframeworksthatyoucanuse我们的事件)。另一个用于显示系统进度条的UIView,这个toplayandcreatetime-basedaudiovisualmedia.Itprovidesanview可以响应用户事件,我们contentOverlayView无法响应Objective-Cinterfaceyouusetoworkonadetailedlevelwith事件应该是这个view响应了用户事件,导致响应链无法向time-basedaudiovisualdata.Forexample,youcanuseitto下传递,也就无法传递到后面的contentOverlayView。那么examine,create,edit,orreencodemediafiles.Youcanalsoget我们是不是可以在这个view上做一些自定义控件呢,很遗inputstreamsfromdevicesandmanipulatevideoduringrealtime憾我们并不能get到这个view。使用playerViewController.captureandplayback.大致意思为:AVFoundation是几款你可view.subviews[0].subviews[0].subviews[1]这种方式获取某个以用来播放和创建基于时间视听媒体的框架之一。它提供了view并不是很好的方式,因为随着sdk的更新这个层次机构一个用来处理视听媒体数据Objective-C接口。比如你可以并不能保证会一成不变。用它来检查、创建、编辑或着重编码媒体文件,你也可以用我们虽然无法使用contentOverlayView达到我们想要它从设备获得输入流,在实时拍摄、播放录像时操作视频。的效果,但是contentOverlayView并不是一个毫无用处的AVFoundation在iOS中所处的位置如图4所示。view。实际中我们仍然能用它呈现一些无需与用户交互的界可以看出AVFoundation框架处于一个比较低级(相面。比如直播过程的字幕,送礼礼物动画等(暂且不论其好对UIKit)位置。建立在CoreAudio、CoreMedia、Core坏),我们再回头品味Apple对contentOverlayView解读:Animation之上。“Usethecontentoverlayviewtoaddadditionalcustomviewsbetweenthevideocontentandthecontrols.”其中betweenthe3.1使用方法videocontentandthecontrols,或许苹果也不并希望我们将控最简单的方式只需要制放到contentOverlayView当中。(1)生成AVplayer;修改界面的另一个思路:在我们AVPlayerViewController(2)生成AVplayerLayer;初始化的过程中,系统会为我们创建了一个AVPlayerView,(3)将AVplayerLayer添加到view的layer上;然后将这个view添加到self.view当中。如果我们无(4)AVplayer调用play方法。法在AVPlayerView当中去修改界面,那么我们只能在就像下面这样就像下面这样AVPlayerView上面在添加一个控制层了。当然这样这个控letvc=UIViewController();制层就遮盖了原来的控制层view,其上的双击放大,单击//player的初始化可以通过playerItem生成隐藏进度条功能就会消失。这一部分得靠自己去实现了。letpath=Bundle.main.path(forResource:"movie",ofType:事实上AVPlayerView是苹果为我们封装的一个播放界"mp4");面,我们完全可以不用AVPlayerView,去实现自定义界面,letplayer=AVPlayer(url:URL.init(string:path!)!);这就更接近底层了,我们会在AVFoundation播放视频时介letlayer=AVPlayerLayer.init(layer:player);绍。vc.view.layer.addSublayer(layer);在我们自定义界面的时候不免会设计到对视频的控制,self.present(vc,animated:true){player.play();}比如暂停、开始、跳转。或是一些视频数据的现实问题,这些一般通过AVPlayerViewController为我们提供player可以3.2自定义界面可能遇到的问题56

4电子技术与软件工程软件开发与应用ElectronicTechnology&SoftwareEngineeringSoftwareDevelopment&Application图5:AVPlayer对应初始化过程图6:VideoToolBox框架的相关内容上述这样就能实现视频的播放了,但是没有控制条。get{这就需要我们自己去实现了。具体细节不再详细赘述,实returnvideoPreviewLayer.player;现过程中可能会遇到的问题:问题一:屏幕旋转后视频界}面不能自适应问题。问题二:视频进度视频总时间显示问set{题。因为layer不支持autolayout所以针对问题一比较简单videoPreviewLayer.player=newValue;的方法是:自定义一个view改变这个view的classLayer}为AVPlayerLayer,让我们的player的layer为该view的}layer。然后我们对这个view进行autolayout这样就能自动///改变viewlayer用于播放视频默认CALayer适应屏幕了。overrideclassvarlayerClass:AnyClass{代码如下:returnAVPlayerLayer.self;importUIKitimportAVFoundation}classBVideoPlayLayerView:UIView{}varvideoPreviewLayer:AVPlayerLayer{}guardletlayer=layeras?AVPlayerLayerelse{关于屏幕旋转的问题在iOS6以后屏幕旋转做了调整,fatalError("Expected`AVPlayerLayer`typefor尤其是在项目中用到navgationcontrler,tabbarcontroller时问layer.CheckPreviewView.layerClassimplementation.")题会变得比较繁琐。这里我们不在详细展开。如果我们的项}目中只有一个或者很少界面横屏显示视频,建议采用modalreturnlayer形式显示viewcontroller。}3.3深入理解播放过程varplayer:AVPlayer?{通过前面关于html5方式以及AVKit方式的介绍我们57

5软件开发与应用电子技术与软件工程SoftwareDevelopment&ApplicationElectronicTechnology&SoftwareEngineering已经知道播放过程最终都会给到AVFoundation层。那么的一个环节。通过解码,压缩编码的视频数据输出成为非压AVFoundation是怎么样播放的呢?缩的颜色数据,例如YUV420P,RGB等等;压缩编码的音AVFoundation视频播放功能集中到下面几个类:频数据输出成为非压缩的音频抽样数据,例如PCM数据。AVAsset:用于获取多媒体的相关信息,包括获取多媒体的视频解码方式分为硬解和软解。硬解:用硬件来进行解画面、声音等信息。AVPlayerItem:媒体资源管理对象,管码,通过显卡的视频加速功能对高清视频进行解码,依靠显理视频的一些基本信息和状态。AVPlayer:用于控制视频的卡GPU的。优点是低功耗、发热少、效率高,缺点是视频播放暂停快进等。AVPlayerLayer:视频呈现的图层,用于兼容性差、支持度低;软解:用软件进行解码,但是实际最将AVPlayer播放的视频显示出来。终还是要硬件来支持的,这个硬件就是CPU。优点是兼容强、初始化过程比较简单,如果按照下面方式初始化全解码、效果好,缺点是对CPU要求高、效率低、发热大。AVPlayer。注意:AVFoundation框架也使用硬件对视频进行硬编码和解playerItem=AVPlayerItem(url:URL.init(fileURLWithPath:码,编码后直接写入文件,解码后直接显示。苹果在iOS8.0videoPath!))系统之前,没有开放系统的硬件编码解码功能,不过Macplayer=AVPlayer.init(playerItem:playerItem);OS系统一直有。在iOS8.0后,苹果将该框架引入iOS系统。对应初始化过程如图5。用户可以直接使用VideoToolBox的框架来处理硬件的编码AVPlayer会通过AVPlayerItem去初始化,AVPlayerItem和解码。通过AVAsset初始化,AVAsset通过URL初始化视音频同步:根据解封装模块处理过程中获取到的参数(AVFoundation为我们封装了一些方法可以直接通过URL信息,同步解码出来的视频和音频数据。同步完毕后并将视初始化AVPlayerItem或者AVPlayer)。AVPlayer初始化完频音频数据送至系统的显卡和声卡播放出来。毕后,初始化用于显示视频的AVPlayerLayer,AVPlayer会有了对上述步骤的理解,我们总结iOS中视频播放的流作为参数传递进去。这样视频就能播放了。程,首先对AVPlayer初始化,完毕后开始播放视频,如果视频播放过程会比较复杂,要想了解视频是怎样播放出我们播放的是网络上的视频AVPlayer首先会有一个解协议来的我们首先要熟悉下视频播放流程。一般而言视频播放需的过程,将网络上的流媒体数据解协议成视频封装数据。如要经过几个步骤:解协议,解封装,解码视音频,视音频同果播放本地的视频文件则直接将文件解封装成音视频文件,步,解协议是播放网络流媒体时的步骤,如果播放本地视频随后分别对音视频文件进行解码,最后进行音视频同步呈现之需要后面三个步骤即可。出来。解协议:将流媒体协议的数据,解析为标准的相应的封对于视频播放模块框架AVFoundation怎样实现,通过装格式数据。视频数据在网络上传递时会根据不同的流媒体什么代码实现以上几个步骤,苹果没有开放这其过程,所协议标准传播数据,这些协议在传输视音频数据的同时,也以对其探究也很难深入进去,不过我们仍然可以通过调用会传输一些信令数据。这些信令数据包括对播放的控制(播函数调用栈大致窥见一二,如图6所示,当开始播放视频放,暂停,停止),或者对网络状态的描述等。解协议的的时候启动线程调用了VideoToolBox框架的相关内容,过程中会去除掉信令数据而只保留视音频数据。例如,采用当然不只是VideoToolBox,我们在其他线程中还能看到RTMP协议传输的数据,经过解协议操作后,输出FLV格MedioToolBox框架。再往底层还有绘图相关的框架。式的数据。解封装:将输入的封装格式的数据,分离成为音频流压参考文献缩编码数据和视频流压缩编码数据。封装格式种类很多,例[1]AppleInc.AVFoundationProgrammingGuide.2015.如MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用[2]PaulIrish.WebKitforDevelopers.Feb28th2013.就是将已经压缩编码的视频数据和音频数据按照一定的格式[3]BobMcCune.AVFoundation开发秘籍,2015.放到一起。例如,FLV格式的数据,经过解封装操作后,输出H.264编码的视频码流和AAC编码的音频码流。作者简介解码:将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。音频的压缩编码标准包含AAC,白亚辉,安徽建筑大学计算机科学与技术专业,大学本科MP3,AC-3等等,视频的压缩编码标准则包含H.264,学历,现任助理工程师岗位。从事软件开发行业7年。对MPEG2,VC-1等等。解码是整个系统中最重要也是最复杂iOS、Android平台的手机应用开发有着丰富经验。58

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭