七牛直播云服務技術揭秘

以下根據七牛云首席布道師何李石現場演講內容整理。

直播模型及其實現

一個通用的直播模型一般包括三個模塊:主播方、服務器端和播放端

首先是主播方,它是產生視頻流的源頭,由一系列流程組成:

  • 第一,通過一定的設備來采集數據;
  • 第二,將采集的這些視頻進行一系列的處理,比如水印、美顏和特效濾鏡等處理;
  • 第三,將處理后的結果視頻編碼壓縮成可觀看可傳輸的視頻流;
  • 第四,分發推流,即將壓縮后的視頻流通過網絡通道傳輸出去。

其次是播放端,播放端功能有兩個層面,第一個層面是關鍵性的需求;另一層面是業務層面的。

先看第一個層面,它涉及到一些非常關鍵的指標,比如秒開,在很多場景當中都有這樣的要求,然后是對于一些重要內容的版權保護。為了達到更好的效果,我們還需要配合服務端做智能解析,這在某些場景下也是關鍵性需求。再來看第二個層面也即業務層面的功能,對于一個社交直播產品來說,在播放端,觀眾希望能夠實時的看到主播端推過來的視頻流,并且和主播以及其他觀眾產生一定的互動,因此它可能包含一些像點贊、聊天和彈幕這樣的功能,以及禮物這樣更高級的道具。

我們知道,內容產生方和消費方一般都不是一一對應的。對于一個直播產品來講,最直觀的體現就是一個主播可能會有很多粉絲。因此,我們不能直接讓主播端和所有播放端進行點對點通信,這在技術上是做不到或者很有難度。主播方播出的視頻到達播放端之前,需要經過一系列的中間環節,也就是我們這里講的直播服務器端。

直播服務器端提供的最核心功能是收集主播端的視頻推流,并將其放大后推送給所有觀眾端。除了這個核心功能,還有很多運營級別的訴求,比如鑒權認證,視頻連線和實時轉碼,自動鑒黃,多屏合一,以及云端錄制存儲等功能。另外,對于一個主播端推出的視頻流,中間需要經過一些環節才能到達播放端,因此對中間環節的質量進行監控,以及根據這些監控來進行智能調度,也是非常重要的訴求。?

實際上無論是主播端還是播放端,他們的訴求都不會僅僅是拍攝視頻和播放視頻這么簡單。在這個核心訴求被滿足之后,還有很多關鍵訴求需要被滿足。比如,對于一個消費級的直播產品來說,除了這三大模塊之外,還需要實現一個業務服務端來進行推流和播放控制,以及所有用戶狀態的維持。如此,就構成了一個消費級可用的直播產品。

但是正如剛才所說的直播通用模型一樣,實際上這里很多功能都可以抽象成一個通用功能,也就是說各家直播產品的需求和實現方式都類似。我們再來看,如果把這些抽象出來的需求交給七牛這樣的第三方去實現,會有多大的差異。

七牛直播云解決方案

首先,對于推流端的功能,我們可以用一個 SDK 去覆蓋所有功能點,包括采集、處理、編碼和推流等工作,若有一些功能無法通過官方提供的 SDK 來滿足,可以通過自定義擴展的形式來實現。

其次,對于播放端,我們可以將其功能分類,和視頻播放相關的功能可以通過一個播放器 SDK 去實現。而其它功能如實時聊天,可以直接使用其它第三方服務。?

在直播服務器端,幾乎所有的工作都集中于如何更好的處理、分發視頻流,比如出于審核的目的對視頻進行自動鑒黃,為了更好的適配客戶端的網絡需要對視頻進行實時轉碼。?

我們發現,對于這三個模塊,幾乎所有直播產品的訴求都是類似的。因此七牛提供了一個這樣覆蓋主播端到播放端的直播云解決方案,它包括推流端 SDK 和播放端 SDK,以及一個強大的直播網絡,它既能滿足推流端和播放端在拍攝和播放方面的體驗訴求,也能夠通過定制化的方式來滿足在產品運營方面的訴求,比如給播放器加上彈幕和點贊等功能。

七牛直播云平臺主要包含直播云 API、推流端 SDK 和播放端 SDK 等三大模塊。接下來重點介紹七牛在推流端和播放端 SDK 方面的功能特性,以及它們在性能方面的表現。

SDK 功能特性

1)SDK?處理流程

如果把一個完整的直播流程用一個流水線來表達,它應該是這樣子的,如下圖所示。

七牛?SDK 的開放性表現為兩點:

  1. 數據采集源的開放性。我們提供了一個開放式的采集接口來進行視頻內容的采集,目前主要的采集源有手機屏幕采集和攝像頭采集。
  2. 可插拔的數據處理模塊。對于視頻內容的處理,目前我們提供了美顏、水印和基本的濾鏡功能,但它其實也提供了一個開放式的處理接口。?

除了開放性,七牛也支持了 H.264 和 H.265?等多種編碼標準。H.265 是一種更為高效的編碼標準,能夠在同等畫質效果下將內容的體積壓縮得更小,傳輸時更快更省帶寬。?

視頻流編碼完成后,則進入另一個常規的流程,進行推流、分發和播放。這樣,我們就完成了一個完整的直播流程,它包含采集、處理、編碼、推流、分發和播放等子流程。其中每一個子流程都是可插拔可替換的,而所有流程的子模塊也都具有靈活開放的輸入輸出接口,子模塊可以被任意的擴展或者替換。

2)SDK?功能點對比

直播流程里面的模塊化處理方式中,每個子流程都包含一系列開放可擴展的子模塊,這些子模塊對應多組不同的功能,以滿足各階段的需求。我們匯總了一些當前主播、觀眾以及 App 實現者最關注的功能,大概有 36 種。從這張圖可以看出,目前七牛的推流端和直播端 SDK 中實現了多達 32 種功能。

3)SDK 包大小對比

但是,對于七牛直播服務來說,要做到這么開放,又具備這么多功能點,需要一個多大的 SDK 呢? 我們統計了一下,iOS 端的推流和播放 SDK 加起來,大概需要 5MB 左右,而業界的平均值則是 11MB。Android 端由于需要適配的硬件設備和軟件系統太多,SDK 的大小大概在 18MB 左右,業界的均值則在 42MB。

SDK 性能對比

我們提供了一個開放的 SDK 處理流程,在這個流程中每個環節都提供了非常豐富的關鍵功能,能夠滿足大部分場景下的需求,同時又保證了包含所有這些功能特性的 SDK 不會太大。那么,它在性能方面的表現如何呢??

1)資源占比?

除了程序 Bug 導致的主動崩潰之外,一個 App 的穩定性主要由兩方面影響:內存和 CPU,因此第三方 SDK 在這兩方面的表現將直接影響 App 的穩定性。而對于一個視頻推流和播放 App 來說,CPU 是其最重要的資源之一。

我們先來看一下七牛 SDK 在 CPU 占比方面的情況。上下兩張圖分別是推流和播放 SDK 在經過多次反復測試后得出的 CPU 占比均值曲線圖。從圖中可以看出,無論是推流端還是播放端,七牛 SDK 在 CPU 使用率方面都占比最少。

我們再來看一下內存占比,上下兩圖也分別給出了推流和播放 SDK 在多次反復測試后得出的內存占比均值曲線圖,從圖中可以看出,我們 SDK 在推流和播放的時候內存使用情況表現非常平穩,而內存的使用量也在業界均值之下,接近于最好的值。這個數據之所以沒有達到最好值,是因為我們經過反復測試發現頻繁的對內存進行回收(Android)會導致編碼的不穩定,實際上這個指標確實可以優化到最好,只不過可能會導致內存和 CPU 波動較大,進而影響整個過程的編碼效率。對于這樣的權衡,我們大多數客戶也非常認可,這也是他們選擇我們的 SDK 原因之一,這點從我們 Github 庫上的關注度就可以看出。

2)耗電量對比

最后,我們再來看下在保證較好的推流效果和 App 穩定性情況下,它需要消耗多少電量。這兩張圖是推流和播放 10 分鐘得到的平均電量消耗對比,從圖中可以看出,七牛 SDK 在推流和播放情況下所需電量都是最小的,推流和播放分別只需要占用 App 總電量的 1.7% 左右(三星 S6 手機)。

總結

前面分享了這么多功能和性能的對比,我們再來回顧一下所有這些對比到底說明了什么:?

首先,我們提供開放可插拔的模塊化組件,整個采集、處理和編碼過程都是非常開放的,每個模塊都可以非常方便的替換或者擴展。?

其次,SDK 是開放性的,能夠方便地整合所有推流設備。我們認為所有端都應該平等地享受七牛的直播云服務,因此幫助所有端接入也是我們的服務宗旨之一。?

最后,可量化的指標才有改善的空間,我們將幾乎所有指標都量化成指導 SDK 性能優化的數據,準確跟蹤服務客戶的質量,長期堅持不懈的改進 SDK 易用性、性能以及后端支撐網絡的效率。也即,優化到極致的推流播放性能和編解碼控制。

原文發布時間為:2016-07-11

本文來自云棲社區合作伙伴“Linux中國”

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282212.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282212.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282212.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

golang 標準庫間依賴的可視化展示

簡介 國慶看完 << Go 語言圣經 >>,總想做點什么,來加深下印象.以可視化的方式展示 golang 標準庫之間的依賴,可能是一個比較好的切入點.做之前,簡單搜了下相關的內容,網上也要討論,但是沒有發現直接能拿過來用的.標準庫之間,是必然存在依賴關系的,不同庫被依賴的程…

Amazon Alexa 新里程碑: 50000 個功能、 20000 種設備、 3500 個品牌

幾個月過去&#xff0c;Alexa的設備連接量、活躍度等各項數據又攀升了。昨日&#xff0c;亞馬遜智慧家庭副總裁DanielRausch在IFA大會上公布了Alexa的各項數據&#xff1a;全球范圍內&#xff0c;Alexa已經擁有50000個功能&#xff0c;與20000種設備相容&#xff0c;并與超過35…

C# 計算耗時的三種方法

概述計算一段程序的耗時是我們在編程中很常見的用法&#xff0c;那這節內容就通過實例的方式來演示幾種常用的統計耗時的方法.方法一&#xff1a;stopwatchstatic void Main(string[] args){Stopwatch sw new Stopwatch();sw.Start();Thread.Sleep(999);sw.Stop();Console.Wri…

《HTML5 2D游戲編程核心技術》——第1章,第1.3節特別功能

本節書摘來自華章出版社《HTML5 2D游戲編程核心技術》一書中的第1章&#xff0c;第1.3節特別功能&#xff0c;作者&#xff3b;美&#xff3d; 戴維吉爾里&#xff0c;更多章節內容可以訪問云棲社區“華章計算機”公眾號查看。 1.3 特別功能 Snail Bait游戲有3個特別的功能&a…

XunSearch的安裝和加入服務器開機腳本以及將目錄寫入系統變量

一、安裝xunserach 1、cd ~ 2、wget http://www.xunsearch.com/download/xunsearch-full-latest.tar.bz2 #下載最新xunsearch包 3、tar -xjf xunsearch-full-latest.tar.bz2 #解壓xunsearch包 4、cd xunsearch-full-1.4.11/ #進入xunsearch包目錄 5、sh setup.sh #執…

dubbo源碼解析-zookeeper創建節點

前言 在之前dubbo源碼解析-本地暴露中的前言部分提到了兩道高頻的面試題,其中一道dubbo中zookeeper做注冊中心,如果注冊中心集群都掛掉,那發布者和訂閱者還能通信嗎?在上周的dubbo源碼解析-zookeeper連接中已經講到,這周解析的是另一道,即服務提供者能實現失效踢出是根據什么原…

配置mysql為主主復制步驟

mysql版本&#xff1a;mysql-5.6.24-solaris10-sparc-64bit.tar 操作系統&#xff1a;solaris 11g u10 操作用戶&#xff1a;使用非root進行操作安裝&#xff0c;a路服務器ip地址為192.168.1.1 b路ip地址為192.168.1.2&#xff08;應改為實際ip地址&#xff09; 1&#xff0c;安…

XunSearch的使用

一、項目的配置文件 1、要想使用xunsearch&#xff0c;首先需要進行配置文件的配置。 默認目錄在app下&#xff0c;如下面的結構&#xff0c;每一個搜索項目都需要有一個ini文件進行相應的配置。 舉例&#xff1a; project.name novel project.default_charset utf-8 serv…

《VMware vSphere設計(原書第2版)》——1.1 什么是設計

本節書摘來自華章出版社《VMware vSphere設計&#xff08;原書第2版&#xff09;》一 書中的第1章&#xff0c;第1.1節&#xff0c;作者&#xff1a;[美] 福布斯格思里&#xff08;Forbes Guthrie&#xff09;斯科特羅威&#xff08;Scott Lowe&#xff09;肯德里克科爾曼&…

SqlKata - 方便好用的 Sql query builder

SqlKata查詢生成器是一個用C# 編寫的功能強大的Sql查詢生成器。它是安全的&#xff0c;與框架無關。靈感來源于可用的頂級查詢生成器&#xff0c;如Laravel Query Builder和 Knex&#xff1a;https://knexjs.org/。SqlKata有一個富有表現力的API。它遵循一個干凈的命名約定&…

編寫高質量代碼:改善Java的151個建議四(基本類型)21-30

該書籍PDF下載地址&#xff1a;http://download.csdn.net/download/muyeju/10001473 基本類型有8個&#xff1a;byte&#xff0c;short&#xff0c;int&#xff0c;char&#xff0c;long&#xff0c;double&#xff0c;float&#xff0c;boolean 21.用偶判斷&#xff0c;不用奇…

ABP vNext微服務架構詳細教程(補充篇)——單層模板(下)

業務代碼2聚合服務聚合服務層和基礎服務層相同的道理&#xff0c;在Demo.Core.Contracts增加Services文件夾&#xff0c;并添加Notifications子文件夾&#xff0c;在其中添加Dtos文件夾并添加兩個DTO與基礎服務對應&#xff1a;using Volo.Abp.Application.Dtos;namespace Demo…

PHP 電子商城基本數據表

1、品牌表 tp_brand CREATE TABLE tp_brand (id smallint(5) unsigned NOT NULL AUTO_INCREMENT COMMENT 品牌表,name varchar(60) NOT NULL DEFAULT COMMENT 品牌名稱,logo varchar(80) NOT NULL DEFAULT COMMENT 品牌logo,desc text NOT NULL COMMENT 品牌描述,url varcha…

摘要,日志

1.hashlib 模塊: 由于數據的不安全性,為了保證用戶的信息絕對安全,所有所有人的賬號密碼不能以明文的形式存儲, 而是經過適當的處理以密文的形式存儲. hashlib對同一個字符串在不同的語言,不同的環境(操作系統,版本,時間)中加密得到的是同一個密文串,不同的字符串得到的密文是不…

《網站情感化設計與內容策略》一第1章 情感化設計1.1 革命:有失亦有得

本節書摘來自異步社區《網站情感化設計與內容策略》一書中的第1章&#xff0c;第1.1節&#xff0c;作者 【美】Aarron Walter , Erin Kissane&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號查看 第1章 情感化設計 網站情感化設計與內容策略 1.1 革命&#xff1…

php自動加載機制的實現

一、什么是自動加載 自動加載就是當我們在當前文件中實例化一個不存在的類時&#xff0c;調用自動加載機制引入相應的類文件。 注&#xff1a;自動加載有兩種方式&#xff08;都是php內置的&#xff09;&#xff0c;一種是通過__autoload(),另一種是通過spl_autoload_registe…

MySQL之 從復制延遲問題排查

一、從庫復制延遲問題 1、可能的原因如下&#xff08;1&#xff09;主從服務器處于不同的網絡之中&#xff0c;由于網絡延遲導致&#xff1b;&#xff08;2&#xff09;主從服務器的硬件配置不同&#xff0c;從服務器的硬件配置&#xff08;包括內存&#xff0c;CPU&#xff0c…

《樹莓派滲透測試實戰》——2.12 用例子總結以上步驟

本節書摘來異步社區《樹莓派滲透測試實戰》一書中的第2章&#xff0c;第2.12節&#xff0c;作者【美】Joseph Muniz&#xff08;約瑟夫 穆尼斯&#xff09; , Aamir Lakhani&#xff08;阿米爾 拉克哈尼&#xff09;&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號…

申請成為qq互聯個人開發者步驟(注意事項)2018

一、官方網址 官方地址&#xff1a;https://connect.qq.com/manage.html#/ 二、申請時注意事項&#xff1a; 1、申請時的名稱欄必須填寫身份證上的姓名&#xff0c;否則是不給通過的 2、上傳照片時&#xff0c;需要本人手持身份證&#xff0c;重點是照片中身份證上頭像的位置要…

《Swift開發實戰》——第1章,第1.4節啟動iOS 8模擬器

本節書摘來自異步社區《Swift開發實戰》一書中的第1章&#xff0c;第1.4節啟動iOS 8模擬器&#xff0c;作者 李寧&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號查看 1.4 啟動iOS 8模擬器Xcode是一款功能全面的應用程序&#xff0c;通過此工具可以輕松輸入、編譯…