為你揭秘小程式音視頻背後的故事......

来源:https://www.cnblogs.com/qcloud1001/archive/2018/08/24/9528628.html
-Advertisement-
Play Games

歡迎大家前往 "騰訊雲+社區" ,獲取更多騰訊海量技術實踐乾貨哦~ 本文由 "騰訊視頻雲終端團隊 " 發表於 "雲+社區專欄" 轉載,本文作者,rexchang(常青),騰訊視頻雲終端技術總監,2008 年畢業加入騰訊,一直從事客戶端研發相關工作,先後參與過 PC QQ、手機QQ、QQ物聯 等產品項 ...


歡迎大家前往騰訊雲+社區,獲取更多騰訊海量技術實踐乾貨哦~

本文由騰訊視頻雲終端團隊發表於雲+社區專欄

轉載,本文作者,rexchang(常青),騰訊視頻雲終端技術總監,2008 年畢業加入騰訊,一直從事客戶端研發相關工作,先後參與過 PC QQ、手機QQ、QQ物聯 等產品項目,目前在騰訊視頻雲團隊負責音視頻終端解決方案的優化和落地工作,幫助客戶在可控的研發成本投入之下,獲得業內一流的音視頻解決方案,目前我們的產品線包括:互動直播、點播、短視頻、實時視頻通話,圖像處理,AI 等等。

為方便大家消化,請參考本篇文章的思維導圖

img本篇文章的脈絡

音視頻小程式誕生在2017年4月一輛從深圳開往廣州的C7172列車上……

img常青帶著小程式音視頻的方案 乘坐動車前往微信事業群

一次偶然的合作

img騰訊雲與微信團隊合作達成

2016年微信開始啟動小程式內測之前,騰訊內部的各個團隊就已經開始接到消息。我們每個人都能預感到小程式將會對移動應用場景產生很大的改變。但在當時,我也是剛加入騰訊視頻雲團隊不久,對於這樣的信息更多的是關註,而並無太多細緻的思考。

2017年伊始,隨著大量客戶的咨詢,我以及我所在的騰訊視頻雲團隊都開始意識到這裡的需求特別的旺盛。但由於精力有限,以“小團隊大成績”著稱的微信工程師團隊很難有精力覆蓋所有的應用場景,在音視頻這裡,小程式僅提供了一些基礎的採集和播放能力,比如大家最為熟知的

而就在此時,騰訊視頻雲的 SDK 產品在經過了一年多的打磨優化之後,已經像是二戰初期的零式戰機,隨時準備“砍瓜切菜”。這裡和合作機會雖然不定,但我們團隊依然坐上了從深圳總部開往廣州 T.I.T 的班車。

經過多次的溝通,以及 jianx 的努力幫助下,這個合作雖然偶然且充滿了各種不確定,但最終達成。

技術的挑戰

img從0到1 困難重重

在音視頻應用場景下,兩個團隊能夠達成合作自然是個好事情。但是微信的市場地位也決定了這是一個不容兒戲的戰場,所以我們所面臨的挑戰也異常嚴峻:

(1)介面必須簡單易用,最好一兩個標簽就能解決問題

(2)滿足多種應用場景,既要支持直播又要能夠支持實時視頻通話

(3)功能必須可擴展,開發者可以根據自身的需要構建出各種個性化應用場景

(4)可維護性好,開發者能夠自助排查一些技術問題,而不需要本身是個音視頻專家

(5)安裝包體積增量足夠小,不然微信的安裝包體積控住不住

除了高標準的要求以外,時間也是一個非常不利的因素。整個項目留給我們可以證明自身能力的時間只有兩周,在短短兩周的時間里,我們需要在一個 G2C 項目落地且成功通過產品演示和方案驗收。

化繁為簡

面對這些挑戰,我想到了蘇聯卡拉什尼科夫所設計的名槍 AK-47 。

img

之所以這麼成功,源於其所貫徹的簡單實用的設計理念:迴轉式閉鎖確保了安全性,杜絕了隨機事故的可能性;結構簡單易拆卸,因此要生產它並不需要特別精密的加工技術,也不需要投資巨大的生產設備,甚至一個普通小作坊就能開工生產。

沒錯,化繁為簡,追求簡單可靠,這就是我們需要達成的目標。

攻剋技術難關

達成這些並不容易,我們團隊一步一步的攻剋技術難關

上行和下行

首先,我們要對騰訊視頻雲現有的音視頻體系進行拆解和抽象,也就是把整個體系打散成一個個積木,其中最重要的兩塊就是:音視頻上行(push)和音視頻下行(play)。

-音視頻上行(PUSH)

就是把自己手機上的聲音和畫面實時的上傳到雲端。我們將這部分能力用視頻雲 SDK 進行實現,並封裝成一個叫做

img音視頻上行

SDK 內部實現機制如上圖所示:首先,我們要對攝像頭的畫面進行捕獲,對麥克風的聲音進行採集。但是,原生採集和捕獲的畫面和聲音是需要進行預處理的,直接採集的畫面可能有很多噪點,所以我們要進行圖像降噪;比如, 原生採集的人像里,皮膚可能並不符合人們的預期,所以我們需要進行磨皮和美顏;直接採集的聲音可能也有很多的環境噪音,所以我們需要進行前景和後景音的分離然後進行底噪抑制。

經過預處理之後的畫面和聲音相比於原始採集的一般會有較大改善,因為所有的預處理都是以“討好”人類的視聽體驗為目的,所以這一看似不起眼的部分會吸引很多公司在其上做不少的技術投入。舉個身邊的例子,以 LCD 平板電視為例,SONY 的 LCD 產品線都沒有自家的液晶面板(以臺灣和大陸液晶面板為主),卻能在總體效果上一直領先其它公司,其背後的秘密就是在圖像處理(基於圖像資料庫做超解析度顯示)和背光技術(所有動物的眼睛都是對亮度最為敏感)上的不間斷的積累和投入。

畫面和聲音都經過“粉飾”之後,就可以送給編碼器進行編碼壓縮了。編碼器的工作是將一張張的畫面和一段段的聲音壓縮成 0101001... 的二進位數據,而壓縮後的體積要遠小於壓縮前。最後要做的工作就是將編碼後的數據通過網路模塊發送出去。在線上直播場景中,一般採用的網路協議都是基於TCP的,而在實時通話場景中,所採用的網路協議則是 UDP 為主。

-音視頻下行(PLAY)

也叫播放,就是從雲端把編碼後的音視頻數據實時下載下來並實時的播放,這樣一來,您就能看到遠程的畫面,聽到遠程的聲音。同樣的,我們將這部分能力用視頻雲 SDK 進行實現,並封裝成一個叫做

img音視頻下行

SDK 內部實現機制如上圖所示:來自雲端的數據會直接送給網路模塊,但網路不是完美的,總會有時快時慢的波動,甚至會有可能發生阻塞和閃斷。如果伺服器來一段數據, SDK 就播一段數據,那麼網路稍微一波動,畫面和聲音就會表現出卡頓。我們採用抖動緩衝(VideoJitterBuffer)技術解決這個問題,就像是為網路過來的數據準備一個小的蓄水池,音視頻數據先在這裡暫存一小會兒再送去播放,這樣就可以在網路不穩定時有一定的“應急”數據可以使用。

數據經過緩衝以後,就可以送給解碼器進行解碼,解碼就是把壓縮後的音視頻數據還原成圖像和聲音,然後進行渲染和播放。我們採用了 openGL 進行畫面的渲染,使用 iOS 和 Android 的系統介面來播放聲音。

信號放大器

有了這兩個簡單的標簽,我們就可以進行初步的組合,構建出第一個最簡單的應用場景:線上直播。

img信號放大器

線上直播是一個非常經典的單向音視頻場景,您只需要簡單的將兩個標簽組合在一起即可,

如果是簡單的一路上行 + 一路下行,那麼我們隨便搭建一個中轉伺服器就可以解決問題了,但這樣只能在很小的範圍內實現高質量的直播服務,真正要做到高併發和流暢無卡頓,就需要一個強大的視頻雲。

視頻雲在這裡的作用就像一個信號放大器,它負責將來自

但線上直播方案只能應用於解決單向音視頻問題,因為它有個明顯的問題,就是延時一般都是在 2秒 - 5秒左右,這是使用

把延遲降低

在安防監控的場景里,家用 IP 攝像頭一般都帶有雲台旋轉的功能,也就是攝像頭的指向會跟隨遠程的遙控進行轉動,如果畫面延時比較大,那麼觀看端按下操控按鈕到看到畫面運動所需要等待的時間就會比較長,這樣用戶體驗就會特別不好。

img延遲做到最低

再比如 2017 非常流行的線上夾娃娃場景,如果遠程玩家視頻畫面的延時非常高,那麼遠程操控娃娃機就變得不太可能,沒有誰能真正抓到娃娃。

既然要達到這麼低的要求,普通的線上直播技術就不再適用了,我們需要新引入兩個新的科技點:延時控制UDP加速

- 延時控制

網路不是完美的,網路是波動的。在有波動的網路下,伺服器上的音視頻數據並不是穩穩的來到您的手機上,而是忽快忽慢。慢的時候您可能會看到卡頓,快的時候就會產生堆積,而堆積的後果就是延時的增加。所以,我們需要採用延遲控制技術,它的原理很簡單,當網路慢的時候就播的慢一點,當網路快的時候就播得快一點,這樣就起到一定的緩衝作用。當然,真正實現時就會發現,聲音是個很不聽話的“孩子”,要處理好聲音的效果是一個非常高難度的技術活。

- UDP加速

既然網路不那麼完美,總是時快時慢,那我們是不是可以改善一下呢?在經典的單向音視頻方案中,一般採用的都是 TCP 協議,因為它簡單可靠且相容性極好。然而 TCP 的擁塞控制特別註重公平,天然就有時快時慢的壞毛病,所以我們需要用 UDP 協議替代之,相比於設計目標定位於可靠傳輸的 TCP 協議,UDP 可以做得更穩且更快。

我們將 延時控制和 UDP 加速技術加入到

單向變雙向

有了單向低延時技術,那麼雙向視頻通話自然也就比較簡單了,只需要通話的雙方 A 和 B 各自拉通一路低延時鏈路就可以了。

比如在車險定損的場景里,遇險的車主通過小程式呼叫保險公司,這個時候保險公司內部的定損客服只要通過一路低延時的鏈路就可以看到車子的出險情況。但是僅僅這樣還不夠,視頻內容跟圖片一樣,都容易被實現偽造和作假。所以定損員就需要有一路視頻同樣到達車主那裡,這樣兩路音視頻同時連通,就構成了一個典型的視頻通話場景。由於車主和定損員可以通過視頻進行交流,因此造假騙保的風險就被極大地降低了。

img單向變雙向

雖然這樣說是沒錯,但實現上可不是那麼簡單的。恰恰相反,它非常困難,因為我們還需要引入額外的很多科技點:

- 雜訊消除

雜訊抑制的目的是將用戶所處環境里的背景噪音去除掉,好的雜訊抑制是迴音消除的前提,否則聲學模塊無法從採集的聲音辨別出哪些是回聲,哪些是應該被保留的聲音。

- 迴音抑制

在雙向視頻通話中,用戶自己手機的麥克風會把喇叭里播放的聲音再次記錄下來,如果不將其抹除掉,這些聲音會被反送給對端的用戶,從而形成回聲。

- Qos流控

網路不可能一直都很完美,尤其是中國大陸地區的上行網速一直都有政策限制。Qos流控的作用就是預測用戶當前的上行網速,並估算出一個適當的數值反饋給編碼器,這樣一來,編碼器要送出的音視頻數據就不會超過當前網路的傳輸能力,從而減少卡頓的發生。

- 丟包恢復

再好的網路也難免會有丟包的情況,尤其是 WiFi 和 4G 等無線網路,由於傳輸介質本身就不是可以獨享的,所以一旦受到干擾,或者高速運動都會產生大量的丟包,這時就需要引入一些丟包恢復技術,將失去的數據儘量補救回來。

以上四個科技點,我們也加入到了

你看,要保持功能到位,又不能跳出標簽這種簡單易用的設計風格,這不容易吧。實際上這裡的四個科技點實在是太難了,需要很多年的技術積累和沉澱,以至於我們也不是現用現做的。正所謂站在巨人的肩膀上才能看得更遠,這裡的技術能力是由騰訊音視頻實驗室的“天籟”引擎所實現的。

雙向變多人

既然雙人視頻通話已經搞定了,是不是多人也就照葫蘆畫瓢就可以了?您看,我們只需要將 A 和 B 之間的 url 置換,變成 A、B、C 甚至更多人之間的 url 置換,不就可以了嗎?

思路依然正確,但是真正要將功能做到好用且成熟,僅依靠簡單的 url 交換是非常粗糙的,我們需要繼續引入額外的兩個科技點:

img雙向變多人

- 房間管理

以上圖所示的 A B C 之間的多人視頻場景為例,要讓每一個人都很清楚其它人的狀態(比如播放url,以及當前是否有上行等等),這個事情可是非常困難的,搞不好就容易出現各方信息不對齊。對於更複雜一點的情況,比如當有第四個人 D 進來的時候,或者第五個人 E 進來又出去的時候,這種信息同步幾乎就是一場噩夢。

最好的辦法就是把參會人的狀態和信息都收攏在伺服器端,構造一個 房間 的概念,這樣就可以確保參會人都能從服務端獲得同樣的信息,而不需要各自去維護。

- 通知系統

當有新的參與者進入房間,或者有人離開時,就需要對房間里的人進行信息廣播,這就需要一個不錯的 IM 系統負責收發消息。比如當 D 進入時,就可以向房間內的其它成員廣播這個 “I'm coming” 的事件,這樣 A B C 就可以在自己的 UI 上展示 D 的視頻畫面了。

加入房間管理和 通知系統以後,我們就可以將

一路走來

一路走來,大家可以看到我們在小程式音視頻的技術體繫上所做的種種努力可以用如下的技術圖譜勾勒出來:

img小程式音視頻的技術體系圖

  • 首先是化繁為簡,將所有的音視頻解決方案拆解成兩個基礎行為:上行和下行,並通過兩個標簽
  • 之後是通過加速線路和延時控制,將一路音視頻的時延縮短到 500ms 以內;
  • 再之後,我們通過引入雜訊抑制和回聲消除等聲學處理模塊,讓一路變兩路成為了可能,這也就構成一個最簡單的視頻通話能力。
  • 最後,我們又通過加入房間服務和狀態同步通知,將雙路音視頻變成了多路音視頻,從而將應用範圍進一步擴大。

問答
怎樣部署小程式?
相關閱讀
教你1天搭建自己的“微視”
教你從0到1搭建小程式音視頻
教你快速搭建一場發佈會直播方案
雲學院 · 課程推薦 | 知乎KOL,與你分享機器學習中如何做選擇

此文已由作者授權騰訊雲+社區發佈,完整原文請點擊

搜索關註公眾號「雲加社區」,第一時間獲取技術乾貨,關註後回覆1024 送你一份技術課程大禮包!

海量技術實踐經驗,盡在雲加社區


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 深度優先遍歷:對每一個可能的分支路徑深入到不能再深入為止,而且每個結點只能訪問一次。要特別註意的是,二叉樹的深度優先遍歷比較特殊,可以細分為先序遍歷、中序遍歷、後序遍歷。 二叉樹最大深度: 如果二叉樹為空,則深度為0 如果不為空,分別求左子樹的深度和右子樹的深度,取最大的再加1。 ...
  • 為什麼監控 用(上)戶(帝)說,這個頁面怎麼這麼慢,還有沒有人管了?! 簡單而言,有三點原因: 關註性能是工程師的本性 + 本分; 頁面性能對用戶體驗而言十分關鍵。每次重構對頁面性能的提升,僅靠工程師開發設備的測試數據是沒有說服力的,需要有大量的真實數據用於驗證; 資源掛了、載入出現異常,不能總靠用 ...
  • 表格展示神器之一:layui表格 前言:在寫後臺管理系統中使用最多的就是表格數據展示了,使用表格組件能提高大量的開發效率,目前主流的數據表格組件有bootstrap table、layui table、easyUI table等.... 博主個人比較傾向於layui,layui極簡,卻又不失飽滿的內 ...
  • 添加padding-right:1em; ...
  • jQuery.parents("選擇器") ...
  • <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>JS2</title> <style type="text/css"> #d1{ height: 100px; width: 100px; background-color: red; ...
  • 1.簡單工廠模式:代替new產生對象,產品的類型比較少時。 我們要獲得三種不同的資料庫對象,如Mysql,SQLserver,Oracle,它們擁有共同的特征,即可以進行抽象,簡單工廠目的是將獲得具體資料庫實體的任務交給工廠類。 介面DataBase: 類Mysql: 類Oracle: 類SQLse ...
  • 很多企業目前更新系統都是需要運維同事手動更新,不管是測試環境,沙箱環境,還是生產環境。導致效率低下,出錯率高。同時環境更新後還需要告知相關同事,這增加了運維同事的工作量。本文介紹的內控平臺完全解決了上述問題。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...