文档章节

SGPlayer 原理详解 - 支持 VR、RTMP 的视频播放框架

libobjc
 libobjc
发布于 2017/04/27 10:40
字数 2195
阅读 785
收藏 26
点赞 0
评论 1

SGPlayer 原理详解

SGPlayer 是一款基于 AVPlayer、FFmpeg 的媒体资源播放器框架。支持全景视频,RTMP、RTSP 等直播流;同时支持 iOS、macOS、tvOS 三个平台。本文将采用图解+说明的方式把关键模块的实现原理介绍给大家。

发起原因

关于视频播放,苹果提供的 AVPlayer 在性能上有着十分出色的表现,在无特需求且资源可控的时,首选一定是它。但随着 VR 和直播的兴起,仅使用 AVPlayer 很多时候已经无法满足需求。出于性能考虑,又不能完全抛弃 AVPlayer,毕竟在点播时有着明显的优势。而在现有的开源项目中,普遍定位比较单一,并不能兼顾 AVPlayer、直播、VR。这样一来,需同时使用3款播放器才能满足需求,即点播使用 AVPlayer,直播使用一个独立的播放器,VR 使用一个独立的播放器。这样处理3套不同的接口和回调事件,着实很让人崩溃!SGPlayer 的出现大大简化了这一过程。

组成结构 和 播放流程

SGPlayer

上图展示了 SGPlayer 的播放流程和主要组件,下面简单介绍图中各组件的分工

SGPlayer

SGPlayer是一个抽象的播放器外壳,它本身并不具备播放功能。仅作为和外界交互的载体。真正的播放由内部的 SGAVPlayer 和 SGFFPlayer 完成。而画面绘制由内部的 SGDisplayView 完成。

SGPlayerDecoder

SGPlayerDecoder 是播放内核的选择器,根据资源类型动态选择使用 SGAVPlayer 或 SGFFPlayer 进行播放,可通过更改其配置参数,来自定义播放内核的选择策略。

SGAVPlayer

SGAVPlayer 是基于 AVPlayer 封装而成,视频画面输出至 SGDsiplayView,并根据视频类型(全景或平面)进行展示。音频由系统处理无需额外操作。

SGFFPlayer

SGFFPlayer 是基于 FFmpeg 封装而成,支持近所有的主流视频格式。视频画面同样输出至 SGDsiplayView。音频则输出至 SGAudioManager,再由 SGAudioManager 使用 Audio Unit 进行播放。

SGDisplayView

SGDisplayView 负责视频画面的绘制。它本身不会绘制视频画面,仅作为绘制层的父视图使用,真正的绘制由内部的 AVPlayerLayer 和 SGGLViewController 完成,选择规则如下表所示。

平面全景
SGAVPlayerAVPlayerLayerSGGLViewController
SGFFPlayerSGGLViewControllerSGGLViewController

SGAudioManager

SGAudioManager 负责声音的播放和音频事件的处理。内部使用 AUGraph 做了一层混音,通过混音可以设置声音的输出音量大小等操作。

小结

了解了各组件的功能,重新梳理一下完整的播放过程

  • SGPlayer 收到播放请求。
  • 由 SGPlayerDecoder 根据资源类型分发给 SGAVPlayer 或 SGFFPlayer 进行播放。
  • 如果使用 SGAVPlayer 播放,根据视频类型将画面输出给 SGDisplayView 中的 AVPlayerLayer 或 SGGLViewController。
  • 如果使用 SGFFPlayer 播放,将视频画面输出给 SGDisplayView,音频输出至 SGAudioManager。

通过抽象的 SGPlayer 将真正负责播放的 SGAVPlayer 和 SGFFPlayer 屏蔽起来,这样可以保证无论资源是何种类型,对外仅暴露一套统一的接口和回调,将播放内核间的差异内部消化,尽可能降低使用成本。

全景图像原理

全景图像与平面图像本质都是一张 2D 图片,区别在于展示时的载体。对于平面图而言,用于展示的模型是一个矩形,仅需将图像上的像素一一对应在矩形上即可;而全景图像展示的模型是一个球,需要将图像上的每一个像素都对应到球面相应位置上。在绘制流程上二者的差别并不大,仅在贴图规则和呈现方式上略有区别。

贴图规则

image

把平面图片贴到球面上的过程和地球仪很相似。以上图为例,左侧图片中的每一个像素,都可以在右侧球面上找到对应的位置。下面列举一个关键的对应关系。

  • 直线AB 上所有的点都与 点J 对应,同理 直线CD 上所有的点都与 点K 对应。
  • 直线MN 上的点与 赤道 上的点一一对应。
  • 直线AC/BD 上的点与绿 色经线前半面 上的点一一对应。
  • 直线EF 上的点与 绿色经线后半面 上的点一一对应。

呈现方式

ball

上图展示了全景图像的呈现方式,不同于平面,全景图像需将观景点放在球心,站在球心观看球面上的图像。最终将 曲面ABCD 在 平面ABCD 上的投影显示到屏幕上。

小结

这部分内容在实现上涉及到很多 OpenGL 的内容,需要具备一些 OpenGL 的基础。在双眼模式下还需要做 畸变校正 和 色散校正 来保证画面被真实的还原。具体实现可以查看 SGGLViewController。

SGFFPlayer 运作流程

SGFFPlayer

上图展示了 SGFFPlayer 的协作流程图,下面简单介绍图中各组件

线程模型

SGFFPlayer 中共有4个线程。与图中4个蓝色圆圈对应。

  • 数据读取 - Read Packet Loop
  • 视频解码 - Video Decode Loop
  • 视频绘制 - Video Display Loop
  • 音频播放 - Audio Playback Loop

图中隐藏掉了线程的控制条件。在4个线程的协作下完成整个播放过程。

SGVideoDecoder

SGVideoDecoder 是视频解码器,初始化时可配置同步、异步解码,以及是否开启硬解。上图中采用的是异步解码,默认的解码线程对应关系如下表所示。

平面全景
软件解码异步同步
硬件解码异步异步
  • 同步解码在收到视频包后立即解码,并存入视频帧队列。
  • 异步解码在收到视频包后仅存入音频包队列,当独立的解码线程取出音频包并完成解码后,再存入视频帧队列。

SGAudioDecoder

SGAudioDecoder 是音频解码器,采用同步解码,收到音频包后立即解码,并存入音频帧队列。

数据队列 SGFFPacketQueue、SGFFFrameQueue

  • SGFFPacketQueue 是包队列,用于管理解码前的数据包(AVPacket)。
  • SGFFFrameQueue 是帧队列,用于管理解码后的帧(SGFFVideoFrame 或 SGFFAudioFrame)。

它们都支持数据的同步获取和异步获取,同步获取是通过条件变量(NSCondition)实现。当队列中没有足够数据时,会阻塞当前线程,直到向队列中添加新元素时,线程才会被唤醒。

帧复用池 SGFFFramePool

该部分并没有在上图中体现,但能避免一些不必要的性能开销。由于音频帧和视频帧的数量很大,1分钟的视频就包含几千帧的数据。如果每一帧都新创建的话会造成不必要的资源浪费。通过 SGFFFramePool 创建的 SGFFFrame 在使用完成后不会立即释放,而是被复用池回收,以供下次使用,达到仅创建最小数量的帧对象的目的。

音视频同步

常用的同步当时有3种

  1. 音频时钟
  2. 视频时钟
  3. 自制时钟

在 SGFFPlayer 中,优先使用音频时钟,当视频中没有音轨时,会使用视频时钟进行同步。

小结

了解了各组件的功能,以视频异步解码为例,重新梳理一下整个流程

  • 数据读取线程读取到数据包,根据数据包类型分发给音频解码器或视频解码器。
  • 如果为音频包,音频解码器收到音频包的同时进行解码,并将解码后的音频帧存入音频帧队列。
  • 如果为视频包,由于视频解码器是异步解码,仅将视频包放入视频包队列,等待视频解码线程来队列中取视频包。
  • 视频解码线程循环从视频包队列中取出视频包,同时解码,并将解码后的视频帧存入视频帧队列。
  • 音频播放线程循环在音频帧队列中取出音频帧并播放。
  • 视频展示线程循环在视频帧队列中取出视频帧并绘制。

到这里SGFFPlayer的运作流程已经很清晰了,只需在各个环节中加入对应的条件控制,就可以完成播放功能了。

总结

关于 SGPlayer 的原理就阐述到这里,由于本文以理论为主,所以并没有贴代码。感兴趣的同学可以在 OSChina 上找到全部的代码实现。希望对大家能有所帮助。

© 著作权归作者所有

共有 人打赏支持
libobjc
粉丝 2
博文 1
码字总数 2195
作品 1
高级程序员
加载中

评论(1)

kubei
kubei
目测vr技术 将在物联网上有广阔市场
Single/SGPlayer

原理详解 | 视频下载 SGPlayer SGPlayer 是一款基于 AVPlayer、FFmpeg 的媒体资源播放器框架。支持360°全景视频,VR视频,RTMP、RTSP 等直播流;同时支持 iOS、macOS、tvOS 三个平台。 功能...

Single
2017/04/24
0
0
跨平台媒体播放器框架--SGPlayer

SGPlayer SGPlayer 是一款基于 AVPlayer、FFmpeg 的媒体资源播放器框架。支持360°全景视频,VR视频,RTMP、RTSP 等直播流;同时支持 iOS、macOS、tvOS 三个平台。 功能特点 支持播放360°全...

libobjc
2017/04/21
1K
1
【掘金日报】第四期 使用Sublime?怎么能不知道这些 Sublime 插件合集!

掘金日报主打分享优质深度技术内容,技术内容分:前端、后端、Android、iOS、产品设计、工具资源和一些有趣的东西。 前端 深度剖析:如何实现一个 Virtual DOM 算法 本文会在教你怎么用 300~...

膜法小编
2017/04/28
0
0
iOS直播类APP开发流程解析(内附源码详解)

前言 个人认为要想把直播从零开始做出来,绝对是牛逼中的牛逼,大牛中的大牛,因为直播中运用到的技术难点非常之多,视频/音频处理,图形处理,视频/音频压缩,CDN分发,即时通讯等技术,每一...

_小迷糊
05/09
0
0
阿里独门绝技:如何运用H.265降低30%的视频传输成本

互联网时代,每一次技术革新都会带来商业价值、推动社会进步。然而旺盛的市场需求也会倒推技术的成熟。 从视频行业来看,内容的丰富度在增强,曾经H.264让1080p风暴席卷了全球,但伴随着4K、...

音染
2017/06/19
151
0
跨平台的视频采集、直播SDK--SmarterStreaming

专注、极致、智慧,国内外为数不多不依赖开源框架、跨平台(windows/android/iOS)、公网推送(支持rtmp)-播放(支持rtmp/rtsp)业界真正靠谱的超低延迟。 适用于秀场直播、媒体移动直播、应急指挥...

大牛直播
2016/03/28
13.5K
9
RTMP、WebRTC、UDP 三种互动直播方案的优劣比较文章

据《 2017 年中国直播行业研究报告》显示,直播行业用户人数达到了 4.2 亿,同比增速超过 50%,整体直播市场的总营收达到 304.5 亿元,比去年同期增长近 39%。 直播作为一种新兴社交方式,已...

开源中国
04/16
0
0
VR直播的技术难点

2016年,互联网上有两样很火,一是VR、二是直播,随着“直播+”模式的普及,“VR+直播”VR直播也开始兴起。VR技术多用于游戏、电影、甚至色情产业(国外),全球顶级科技企业如谷歌、HTC、三...

sendoffice
2016/09/27
0
0
openGL+GLSurfaceView和MediaPlayer+GLSurfaceView与视频

Android MediaPlayer+SurfaceView播放视频(附Demo)- http://blog.csdn.net/junzia/article/details/52704129 在播放网络上的视频流时,Android原生的MediaPlayer支持两种协议,HTTP和RTSP,...

shareus
2017/09/23
0
0
RTMP、WebRTC、UDP 三种互动直播方案的优劣比较

据《 2017 年中国直播行业研究报告》显示,直播行业用户人数达到了 4.2 亿,同比增速超过 50%,整体直播市场的总营收达到 304.5 亿元,比去年同期增长近 39%。 直播作为一种新兴社交方式,已...

OSC源创君
04/16
0
7

没有更多内容

加载失败,请刷新页面

加载更多

下一页

shell中的函数、shell中的数组、告警系统需求分析

shell中的函数 格式: 格式: function f_name() { command } 函数必须要放在最前面 示例1(用来打印参数) 示例2(用于定义加法) 示例3(用于显示IP) shell中的数组 shell中的数组1 定义数...

Zhouliang6
43分钟前
1
0
用 Scikit-Learn 和 Pandas 学习线性回归

      对于想深入了解线性回归的童鞋,这里给出一个完整的例子,详细学完这个例子,对用scikit-learn来运行线性回归,评估模型不会有什么问题了。 1. 获取数据,定义问题     没有...

wangxuwei
今天
1
0
MAC安装MAVEN

一:下载maven压缩包(Zip或tar可选),解压压缩包 二:打开终端输入:vim ~/.bash_profile(如果找不到该文件新建一个:touch ./bash_profile) 三:输入i 四:输入maven环境变量配置 MAVEN_HO...

WALK_MAN
今天
0
0
33.iptables备份与恢复 firewalld的9个zone以及操作 service的操作

10.19 iptables规则备份和恢复 10.20 firewalld的9个zone 10.21 firewalld关于zone的操作 10.22 firewalld关于service的操作 10.19 iptables规则备份和恢复: ~1. 保存和备份iptables规则 ~2...

王鑫linux
今天
1
0
大数据教程(2.11):keeperalived+nginx高可用集群搭建教程

上一章节博主为大家介绍了目前大型互联网项目的系统架构体系,相信大家应该注意到其中很重要的一块知识nginx技术,在本节博主将为大家分享nginx的相关技术以及配置过程。 一、nginx相关概念 ...

em_aaron
今天
0
0
Apache Directory Studio连接Weblogic内置LDAP

OBIEE默认使用Weblogic内置LDAP管理用户及组。 要整理已存在的用户及组,此前办法是导出安全数据,文本编辑器打开认证文件,使用正则表达式获取用户及组的信息。 后来想到直接用Apache Dire...

wffger
今天
2
0
HFS

FS,它是一种上传文件的软件。 专为个人用户所设计的 HTTP 档案系统 - Http File Server,如果您觉得架设 FTP Server 太麻烦,那么这个软件可以提供您更方便的档案传输系统,下载后无须安装,...

garkey
今天
1
0
Java IO类库之BufferedInputStream

一、BufferedInputStream介绍 /** * A <code>BufferedInputStream</code> adds * functionality to another input stream-namely, * the ability to buffer the input and to * sup......

老韭菜
今天
0
0
STM 32 窗口看门狗

http://bbs.elecfans.com/jishu_805708_1_1.html https://blog.csdn.net/a1985831055/article/details/77404131...

whoisliang
昨天
0
0
Dubbo解析(六)-服务调用

当dubbo消费方和提供方都发布和引用完成后,第四步就是消费方调用提供方。 还是以dubbo的DemoService举例 -- 提供方<dubbo:application name="demo-provider"/><dubbo:registry address="z...

青离
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部