开发一个完整的iOS直播app?看这里就够了(二)处理

本贴最后更新于 3164 天前,其中的信息可能已经时移世异

七牛云于 6 月底发布了一个针对视频直播的实时流网络 LiveNet 和完整的直播云解决方案,很多开发者对这个网络和解决方案的细节和使用场景非常感兴趣。

结合七牛实时流网络 LiveNet 和直播云解决方案的实践,我们将用七篇文章,更系统化地介绍当下大热的视频直播各环节的关键技术,帮助视频直播创业者们更全面、深入地了解视频直播技术,更好地技术选型。

本系列文章大纲如下:

(一)采集

(二)处理

(三)编码和封装

(四)推流和传输

(五)现代播放器原理

(六)延迟优化

(七)SDK 性能测试模型

在上期采集中,我们介绍了视频采集针对音频采集和图像采集以及它们分别对应两种完全不同的输入源和数据格式。 本篇是《解密视频直播技术》系列之三:处理。我们将讲解常见视频处理功能如美颜、视频水印、滤镜、连麦等。

视频或者音频完成采集之后得到原始数据,为了增强一些现场效果或者加上一些额外的效果,我们一般会在将其编码压缩前进行处理,比如打上时间戳或者公司 Logo 的水印,祛斑美颜和声音混淆等处理。在主播和观众连麦场景中,主播需要和某个或者多个观众进行对话,并将对话结果实时分享给其他所有观众,连麦的处理也有部分工作在推流端完成。

开放式设计

如上图所示,处理环节中分为音频和视频处理,音频处理中具体包含混音、降噪和声音特效等处理,视频处理中包含美颜、水印、以及各种自定义滤镜等处理。对于七牛这样的直播云服务来说,为了满足所有客户的需求,除了要提供这些「标准」处理功能之外,我们还需要将该模块设计成可自由接入自定义处理功能的方式。

iOS SDK 地址:https://github.com/pili-engineering/PLMediaStreamingKit

Android SDK 地址:https://github.com/pili-engineering/PLDroidMediaStreaming

常见视频处理功能

1.美颜

都说「80% 的主播没有美颜根本没法看」,美颜是直播产品中最常见的功能之一。最近准备在香港上市的美图公司的主打产品就是美颜相机和美拍,有媒体戏称其会冲击化妆品行业,其实就是美颜的效果的功劳,让美女主播们不化妆也可以自信的直播,而美颜相机的用户则可以拍出「更好的自己」。

美颜的主要原理是通过「磨皮 + 美白」来达到整体美颜的效果。磨皮的技术术语是「去噪」,也即对图像中的噪点进行去除或者模糊化处理,常见的去噪算法有均值模糊、高斯模糊和中值滤波等。当然, 由于脸部的每个部位不尽相同,脸上的雀斑可能呈现出眼睛黑点的样子,对整张图像进行「去噪」处理的时候不需要将眼睛也去掉,因此这个环节中也涉及到人脸和皮肤检测技术。

七牛直播云提供的 iOS 和 Android 推流 SDK 中内置了美颜功能,你可以根据自己的需要选择开关美颜功能,并且能够自由调节包括美颜,美白,红润等在内的参数。其中 iOS 端 SDK PLCameraStreamingKit 的参数设置如下:

1)按照默认参数开启或关闭美颜:

-(void)setBeautifyModeOn:(BOOL)beautifyModeOn;

2)设置美颜程度,范围为 0 ~ 1:

-(void)setBeautify:(CGFloat)beautify;

3)设置美白程度,范围为 0 ~ 1

-(void)setWhiten:(CGFloat)whiten;

4)设置红润程度,范围为 0 ~ 1

-(void)setRedden:(CGFloat)redden;

**2. 视频水印 **

水印是图片和视频内容中常见的功能之一,它可用于简单是版权保护,或者进行广告设置。处于监管的需求,国家相关部门也规定视频直播过程中必须打上水印,同时直播的视频必须录制存储下来保存一定的时间,并在录制的视频上打上水印。

视频水印包括播放器水印和视频内嵌水印两种方式可供选择,对于播放器水印来说,如果没有有效的防盗措施,对于没有播放鉴权的推流,客户端拿到直播流之后可以在任何一个不带水印的播放器里面播放,因此也就失去了视频保护的能力。综合考虑云端录制对于水印的需求,我们一般会选择「视频内嵌水印」的方式打水印。

七牛直播云提供的 iOS 和 Android 推流 SDK 中也内置了水印功能,你可以根据自己的需要添加水印或移除水印,并且能够自由设置水印的大小和位置。其中 iOS 端 SDK PLCameraStreamingKit 的参数设置如下:

1)添加水印

-(void)setWaterMarkWithImage:(UIImage *)wateMarkImage position:(CGPoint)position;

该方法将为直播流添加一个水印,水印的大小由 wateMarkImage 的大小决定,位置由 position 决定,需要注意的是这些值都是以采集数据的像素点为单位的。例如我们使用 AVCaptureSessionPreset1280x720 进行采集,同时 wateMarkImage.size 为 (100, 100) 对应的 origin 为 (200, 300),那么水印的位置将在大小为 1280x720 的采集画幅中位于 (200, 300) 的位置,大小为 (100, 100)。

2)移除水印

-(void)clearWaterMark;

3.滤镜

除了上面提到的美颜和水印之外,视频中还有很多其它的处理效果也在这个环节完成。七牛直播云提供的 SDK 在开放性设计基础之上,通过数据源回调接口,可以支持各种自定义滤镜的接入。

为了实现丰富的滤镜效果,在 iOS 端可以考虑使用 GPUImage 这个库,这是一个开源的基于 GPU 的图片或视频的处理框架,内置了多达 120 多种常见的滤镜效果。有了它,添加实时的滤镜只需要简单地添加几行代码,还可以基于这个库自己写算法实现更丰富端效果。GPUImage 地址:https://github.com/BradLarson/GPUImage

除了 iOS 端之外,Android 也有 GPUImage 这个库的移植:https://github.com/CyberAgent/android-gpuimage

同时,Google 官方也开源了一个伟大的库,覆盖了 Android 上面很多多媒体和图形图像相关的处理:https://github.com/google/grafika

4. 连麦

连麦是互动直播中常见的需求,其流程如上图所示。主播和部分观众之间可以进行实时互动,然后将互动结果实时播放给其他观众观看。

基于以上业务需求,我们很容易想到基于单向直播原理,在主播端和连麦观众端进行双向推流和双向播流的方式互动,然后在服务端将两路推流合成一路推送给其他观众。但 RTMP 带来的延迟决定了这种方式无法做到用户可接受的互动直播。

实际上,互动直播的主要技术难点在于:

1)低延迟互动:保证主播和互动观众之间能够实时互动,两者之间就像电话沟通,因此必须保证两者能在秒级以内听到对方的声音,看到对方的视频;

2)音画同步:互动直播中对音画同步的需求和单向直播中类似,只不过互动直播中的延迟要求更高,必须保证在音视频秒级传输情况下的秒级同步。

3)音视频实时合成:其他观众需要实时观看到对话结果,因此需要在客户端或者服务端将画面和声音实时合成,然后以低成本高品质的方式传输观众端。

在视频和电话会议领域,目前比较成熟的方案是使用思科或者 WebEx 的方案,但这些商用的方案一不开源,二比较封闭,三成本比较高。对于互动人数比较少的互动直播,目前市场上比较成熟的方案是使用基于 WebRTC 的实时通讯方案。

上图是一个基于 WebRTC 协议实现多方实时通讯的示意图,本地用户(主播)和远程用户(连麦观众)之间的连接通过 RTCPeerConnection API 管理,这个 API 包装了底层流管理和信令控制相关的细节。基于该方案可以轻松实现多人(14 人以下)的多方实时通信,如下图所示:

当然,在通信人数少的情况下,其复杂度相对简单,如 2 人情况下。但人数增多至 4 人之后,其可选的网络结构就增多了,如上图所示,可以每个点之间形成自组织网络的方式通信,也可以以 1 人为中心形成星型通信网络,还可以让大家都通过一个集中式的服务端进行通信。


作为一个高性能、可伸缩的直播基础服务提供商,七牛直播云经过评估选择了以主播为中心形成星形通信网络,支持主播和多个观众之间的互动质量。同时,为了保证合成后的音视频实时传输到其他观众端,这里采用经过改造的 UDP 协议传输:

1. 通过 UDP 降低传输延迟。

2. 在 UDP 之上进行传输控制,保证用户互动体验 QoS。

在下一篇连载中,我们将详细介绍编码和封装,敬请期待!

###【没看过瘾?直接来上免费公开课】

点击阅读原文学习《2 小时搞定移动直播 App 开发》

  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    588 引用 • 3538 回帖
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    411 引用 • 3588 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • relyn

    不错不错~~MARK 一下

推荐标签 标签

  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 667 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 316 关注
  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖 • 4 关注
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 342 关注
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    495 引用 • 930 回帖
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    730 引用 • 1280 回帖 • 4 关注
  • SVN

    SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。

    29 引用 • 98 回帖 • 691 关注
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 1 关注
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    31 引用 • 94 回帖
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    76 引用 • 1742 回帖 • 1 关注
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    948 引用 • 1460 回帖
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    32 引用 • 108 回帖
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    108 引用 • 295 回帖
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 56 关注
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    6 引用 • 26 回帖 • 544 关注
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    17 引用 • 53 回帖 • 144 关注
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    693 引用 • 537 回帖
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 399 关注
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 548 关注
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 726 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖 • 2 关注
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    498 引用 • 1395 回帖 • 249 关注
  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    133 引用 • 1124 回帖 • 114 关注
  • 创业

    你比 99% 的人都优秀么?

    82 引用 • 1395 回帖
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    117 引用 • 99 回帖 • 205 关注
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 734 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    84 引用 • 324 回帖 • 1 关注