分享
iOS_AVFoundation视频播放探究_白亚辉.pdf
下载文档

ID:304731

大小:1.78MB

页数:6页

格式:PDF

时间:2023-03-20

收藏 分享赚钱
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,汇文网负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
网站客服:3074922707
iOS_AVFoundation 视频 播放 探究 白亚辉
53软件开发与应用Software Development&Application电子技术与软件工程Electronic Technology&Software Engineering我们开发中很多地方会用到视频播放功能,对于 iOS 平台视频播放大致分为两大类:使用苹果的官方 API 实现视频播放功能。(AVKit,AVFoundation)和使用集成 ffmpeg 框架的第三方库。(ijkplayer,kxmovie 等)。本文现只针对第一种方式做简单的探究。播放一段本地的视频我们貌似可以通过以下几种方法实现。一是通过在 APP 中嵌套 WebView(UIWebView,WKWebView)加载 Html5 标签 Video 来实现视频播放的功能。二是通过 AVKit 框架实现视频播放。三是通过底层AVFoundation 框架实现视频播放。实际上,无论哪种方式归根结底仍然离不开底层 AVFoundation 的身影。1 Html5 video标签播放视频特 殊 说 明:基 于 mediaPlayer 类 库 的 MPMediaPlayer Controller(iOS9 后 遭 到 废 弃,被 AVPlayerViewController所 替 代)iOS8 之 后 苹 果 推 荐 使 用 WKWebView 替 代UIWebView,其主要的优点有:(1)WKWebView 更多的支持 HTML5 的特性;(2)WKWebView 更快,占用内存可能只有 UIWebView的 1/3 1/4;(3)WKWebView 高达 60fps 的滚动刷新率和丰富的内置手势;(4)WKWebView 具有 Safari 相同的 JavaScript 引擎;(5)WKWebView 增加了加载进度属性将;(6)UIWebViewDelegate 和 UIWebView 重 构 成 了 14个类与 3 个协议。1.1 使用方式通过 webView 嵌套 html 的 video 标签实现视频播放,如下:!DOCTYPE HTML Your browser does not support the video tag.需 要 我 们 做 的 只 是 简 单 的 在 我 们 的 视 图 中 添 加UIWebView(WKWebView)然后调用加载方法去加载 html 文件即可。代码如下:webView=WKWebView(frame:self.view.frame);let path=Bundle.main.path(forResource:movieHtml,ofType:html);let request=URLRequest.init(url:URL(fileURLWithPath:path!)webView?.load(request);self.view.addSubview(webView!);该例当中加载了一个本地html文件播放本地视频文件,实际当中也可以加载自己服务器端的 html 文件播放服务端视频文件。1.2 原理分析首先我们要了解一个概念 WebKit,WebKit 是一个开源的浏览器引擎,我们在浏览器中能够看到各种各样的网页就是因为 WebKit 帮助我们解析 html 代码呈现给我们。很多浏览器包括 safar,Chrome 就是一款基于 WebKit 的浏览器,在我们的 app 中无论原有的 UIWebView 还是现有的WKWebView 其内核也是基于 WebKit 的。有一点我们应当知道,由于各个平台软硬件的不同,不同平台下 WebKit 也有不同的 WebKit port。下面是不同 WebKit por 的异同:WebKit port 共同之处:(1)DOM、winow、document;(2)CSS 对象模型;(3)CSS 解析,键盘事件处理;(4)HTML 解析和 DOM 构建;(5)所有的布局和定位;(6)Chrome开发工具和WebKit检查器的UI与检查器;(7)contenteditable、pushState、文 件 API、大 多 数SVG、CSS Transform math、Web Audio API、localStorage 等功能;(8)很多其他功能与特性。WebKit port 不同之处:iOS AVFoundation 视频播放探究白亚辉(中国人民武装警察部队河北省总队 河北省石家庄市 050000)摘要:本文主要介绍 iOS 平台下视频播放的几种方式及其常见问题。结合代码与框架深入探究视频播放的整个过程及其原理。关键词:视频播放;iOS;AVFoundation;AVKit;WKWebView54软件开发与应用Software Development&Application电子技术与软件工程Electronic Technology&Software Engineering(1)GPU 相关技术;(2)3D 转换;(3)WebGL;(4)视频解码;(5)将 2D 图像绘制到屏幕;(6)解析方式;(7)SVG 和 CSS 渐变绘制;(8)文字绘制和断字;(9)网络层(SPDY、预渲染、WebSocket 传输);(10)JavaScript 引擎;(11)JavaScriptCore 在 WebKit repo 中。V8 和 JavaScript Core 被绑定在 WebKit 中;(12)表单控制器的渲染;(13)和 的元素表现和解码实现;(14)图像解码;(15)页面导航 前进/后退;(16)pushState()的导航部分;(17)SSL 功能,比如 Strict Transport Security 和 Public Key Pins。从上面可以得知 WebKit 在不同平台下其 和 的元素表现和解码实现并不相同,这也是为什么同样是 标签在 safari 当中和在 Chrome 当中呈现却不同的原因。WebKit 的视频播放流程实际上也是 WebKit 对html5 标签 video 的解析过程。如果我们的 WebView html 标签中用到 video 标签,首先 WebKit 帮我们解析出 video 标签呈现出来,然后我们点击播放按钮,WebKit将事件分发下去,交给设给底层视频模块处理,最后视频开始播放。通过 instrument 可以大致了解其调用堆栈情况,如图 1,可以看到其实质上最后还是调用了 AVKit 框架下的 AVplayerViewController 来实现视频的播放。综上,这种用html 方式播放视频其实本质上是通过 webview 内核 WebKit实现的视频标签video解析然后传递到底层去进行视频播放,这种播放过程交给 AVKit 框架来实现。2 AVKit播放视频关 于 AVKit 苹 果 官 方 给 的 解 释 是“Create view-level 图 1:AVKit 框架图 2:AVKit 框架引用关系55软件开发与应用Software Development&Application电子技术与软件工程Electronic Technology&Software Engineeringservices for media playback,complete with user controls,chapter navigation,and support for subtitles and closed captioning.The AVKit framework provides a high-level interface for playing video content.”大致意思为:为媒体播放创建视图层级的服务,包括用户控制,章节导航,并且支持副标题,隐藏字幕。AVKit framework 为播放视频能容提供了一个高级的接口。AVKit 框架是 Apple 为我们提供的一个视频播放高级框架,iOS8 以后可以使用,基于 AVFoundation 实现。AVKit高度封装,可以简化我们的播放视频的过程,当然也会带来一些的弊端,一些高度定制化的功能通过 AVKit 无法实现,例如视频编辑等。那么 AVKit 为我们提供了哪些类,这些类能帮助我们做什么呢?通过查看其引用关系我们应该能大致了解其功能。如 iOS 中的 AVKit 框架引用关系如图 2(iOS 10.3 其中带小旗子的部分为 class 引入方式)。可以看到 AVKit 框架下涉及到的类并不多。主要的只有两个AVPictureInPictureController 和AVPlayerViewController,其 中 AVPictureInPictureController 用 于 画 中 画 的 相 关 实现。AVPlayerViewController 用于视频播放,AVPlayerView Controller 为我们提供了一个带简单操作条的视频界面。2.1 使用方法通过播放一段本地视频的方法如下:let path=Bundle.main.path(forResource:movie,ofType:mp4);let player=AVPlayer.init(url:URL.init(fileURLWithPath:path!);let playerVC=BAVPlayerViewController();playerVC.player=player;self.present(playerVC,animated:true);其 中 BAVPlayerViewController 继 承 自 AVPlayerView Controller 之所以这样做是因为后面我们会在这个类中做一些视频控制界面的改变(这些改变必须在视图加载后,比如contentOverlayView 要在 viewDidLoad 之后才能获取到)。如果不想做任何修改直接用 AVPlayerViewController 即可。在 iphone 与 iPad 上运行会有些许不同,ipad 上比 iPhone上右下角会多处一个画中画的操作按钮。点击后可进入画中画模式。画中画模式是 iOS9 添加的一个功能,可以通过AVPlayerViewController 的 allowsPictureInPicturePlayback 属性进行控制,默认为 true。2.2 修改视频界面可以看到 AVPlayerViewController 为我们提供的播放界面并不是那么美观。在实际应用也很可能会与我们设计的 app 主题不符,影响用户体验。所以通常情况下我们会对播放界面做相应的修改。修改之前我们先了解下下AVPlayerViewController 的几个重要属性。(1)player:用户播放视频的主要控件。需要初始化后丢入到 AVPlayerViewController。(2)showsPlaybackControls:用于控制是否显示系统默认的控制条。(3)videoGravity:定义了视频应该怎样在 AVPlayer Layer 中显示的字符串,包括 AVLayerVideoGravityResize Aspect(默 认)、AVLayerVideoGravityResizeAspectFill、AVLayerVideoGravityResize 三种。(4)contentOverlayView:一个处于控制视图和视频视图中间的 view,用来添加额外定义的视图。(5)allowsPictureInPicturePlayback:是否允许画中画模式。我们可能会有一个思路是通过隐藏系统的控制条,然后在 contentOverlayView 添加自己的视图来自定义控制条。事实上这样可能并不能很好的解决我们的问题。contentOverlayView 可以显示我们需要添加的控件,但是它并不能响应事件。通常这种情况会有下面几种可能:(1)view 本身设置 isUserIn

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

下载文档
你可能关注的文档
收起
展开