網絡語音視頻技術淺議(附多個demo源碼下載)


      我們在開發實踐中常常會涉及到網絡語音視頻技術。諸如即時通訊、視頻會議、遠程醫療、遠程教育、網絡監控等等,這些網絡多媒體應用系統都離不開網絡語音視頻技術。本人才疏學淺,對於網絡語音視頻技術也僅僅是略知皮毛,這里只想將自己了解到的一些最基礎的知識分享給大家,管中窺豹,略見一斑,更重要的是拋磚引玉,希望更多的朋友們一起來探討,同時,有講得不正確的地方也希望大家批評指正。

 

一.基本流程

    無論是即時通訊、視頻會議,還是遠程醫療、遠程教育、網絡監控等等系統,都需要獲取到遠程的語音、視頻信息,在我們的直觀印象中好像我們就是直接的訪問到了對方的攝像頭,麥克風、顯示器、聲卡等等設備,但是事實上這些語音視頻信息要經過如下的基本流程才能呈現在我們的面前。 

    就拿我最近正在研究的 OMCS 語音視頻框架來說,其提供了攝像頭連接器、麥克風連接器、桌面連接器、電子白板連接器等API,能讓我們就像訪問本地設備一樣訪問遠程設備,但是它其實是把艱難困苦留給了自己,簡單清晰的API才能讓我們帶走。其實說白了,OMCS 所做的主要工作就是實現了多媒體設備【麥克風、攝像頭、桌面、電子白板】的采集、編碼、網絡傳送、解碼、播放(或顯示)等相關的一整套流程。附:語音視頻示例Demo下載  詳細說明

  雖然 OMCS 使用起來如此方便,但是我們仍然有必要了解其背后的相關原理,尤其是這些最基本的原理。 

  

二.基本環節

  1.采集

    采集是第一個環節。所謂“巧婦難為無米之炊”,首先我們要從多媒體設備上拿到第一手材料。對於音頻而言,就是要從麥克風、聲卡等設備獲取到音頻信號;對於視頻而言,就是要從顯示器、攝像頭等設備獲取到圖像信息。如何獲取到這些信息呢?於是我們需要采集。

    所謂采集又可以拆分成采樣集聚兩個步驟來理解。這就好比“曹聰稱象”,先將大的總體分解成一個個樣本,再將分解得到的樣本整合起來,其思想無非就是用樣本來模擬總體

 

 (1)對於視頻而言,采集的過程就如同下圖所示

 

    我們知道,視頻總是連續的,但是我們可以將其分解為一張張的圖片,即圖片幀,到時候我們再將得到的這些圖片按照相應的時序來播放就可以基本還原成原來的視頻了。

    在這里,有幾個重要的量是我們需要關注的。

   a.分辨率

    首先我們要關注每一個樣本的大小,因為樣本的大小意味着其所包含的數據量的多少,而一個數據量大的樣本比一個數據量小的樣本更能夠反映總體。就拿圖中的例子來說,我們對一只鴿子的起飛過程進行連續的拍照,但是我們用高像素來拍和用低像素來拍,到時候連續翻看的時候,效果肯定是不一樣的。因為每個圖像幀的數據量的大小將影響到所得視頻的清晰度。而這個圖像幀的大小是用一個什么量來表示的呢?這個量就是分辨率。圖像的分辨率越高,所包含的像素點就越多,所包含的數據量就越大,就越能夠反映原始圖像的本來面貌。

   b.幀頻

    其次,原始的視頻是連續的,我們采集得到的圖像都是離散的。那么這個離散的程度肯定也會影響到所得視頻的效果。如果圖片的離散程度過大,那么所得視頻看起來就會顯得一卡一卡,而如果離散的程度足夠小,那么所得視頻就會顯得流暢自然。所以樣本之間的離散程度,影響到的是視頻的流暢性。而這個離散程度是用什么量來表示的呢?這個量就是幀頻。幀頻對於采集而言就是每秒采集到多少幀圖像,自然,幀頻越大,畫面就越流暢。

 

 (2)對於音頻而言,采集的過程也可以用類似地用下圖來說明

    類似於視頻的采集,音頻的采集也需要將連續的總體分解成離散的樣本,然后再“曹聰稱象”,組裝成整體。

    同樣,音頻采集中也有幾個重要的量需要我們關注。

   a.采樣深度

    類似於視頻采集,我們需要關注每一個樣本的數據量的大小。對於音頻采集而言,樣本的數據量的大小由什么來表示呢?我們用采樣深度來表示,所謂采樣深度又可稱為采樣位數,即每次采樣聲音數據的比特數。同樣,采樣深度的大小也會影響到所得音頻的清晰度。如果采樣位數過低,所得到的音頻聽起來就會含混不清。

   b.采樣率

    類似於視頻采集,我們也需要關注樣本之間的離散程度。對於音頻采集而言,這個離散程度我們用采樣率來表示,即每秒鍾采集的樣本的個數。采樣頻率的大小會影響到所得音頻的流暢程度。如果采樣頻率過低,則聲音聽起來就會有卡頓。

總結:

    無論是視頻采集還是音頻采集,說到底都是樣本采集,而我們采集的目的,無非就是想用樣本來模擬總體,至於這個模擬效果的好壞由兩個因素來決定,一是每個樣本的數據量的大小,二是樣本之間的密集程度。即,樣本數據量越大,樣本之間的密度越大,就越能夠代表總體,就越能夠反映出總體的本來面貌。所以,我們可以給出這樣一個總公式——

    樣本反映總體的效果 = 單個樣本數據量的大小 X  樣本之間的密集程度

   然后,對於視頻采集和音頻采集而言,可以給出如下兩個子公式——

    1.所得視頻的效果 = 分辨率 X 幀頻

    2.所得音頻的效果 = 采樣深度 X 采樣率

附:集示例Demo(含錄制)

  2.編碼

    對於采集得到的原始語音視頻數據,直接放到網絡上傳輸,數據量會非常大,會占用到非常大的帶寬。所以需要對原始數據進行編碼和壓縮。 所以,在實際的語音通話應用中,編碼這個環節是不可缺少的。目前有很多常用的語音編碼技術,像G.729、iLBC、AAC、SPEEX等等。

    同時我們也應該注意到,編碼壓縮的過程中不可避免的要丟失一些信息,而這也將影響到所得語音視頻的效果。
    所以我們再定義一個量:壓縮率,表示原始數據的壓縮程度,壓縮程度越高,意味着丟失的數據越多,因此由壓縮數據還原得到的語音視頻,距離原始語音視頻的本色越遠,失真越大。
    所以我們將這個因素補充到剛才的出的公式中。

    1.所得視頻的效果 = 分辨率 X 幀頻 / 壓縮率

    2.所得音頻的效果 = 采樣深度 X 采樣率 / 壓縮率

 

  3.傳輸

    數據傳輸,這個是計算機網絡的基礎知識,想必大家都很熟悉,我就不再贅述了。但是有一點需要注意的就是,在諸如即時通訊、視頻會議、遠程醫療、遠程教育等對實時性要求很高的網絡多媒體應用系統中,網絡的低延遲和高平穩是保證通訊的實時性的重要條件。

  4.解碼

    當接收方接收到經過編碼的數據后,會對其進行解碼,以恢復成為可供直接播放的語音視頻數據。 

  5.播放

    完成解碼后,即可將得到的語音視頻幀提交給相關設備進行播放。

附:采集+播放示例Demo

 

三.更多技術 

     然而,實際中的網絡語音視頻技術的實現遠非基本流程中所介紹的那樣簡單,其涉及到相當多的技術細節需要處理,甚至涉及到相當多頗有難度的技術問題需要克服。由於這些技術不是本文所介紹的重點,更不是本人所能夠駕馭的范疇,所以僅羅列如下,供大家參考。

    1.回音消除 AEC

    2.噪聲抑制 DENOISE

    3.抖動緩沖區 JitterBuffer

    4.靜音檢測 VAD

    5.混音算法

    想要對這些技術了解更多的朋友請參見知名博主 zhuweisky 的博客《淺談網絡語音技術》

    在此我要感謝zhuweisky,感謝他對我在網絡語音視頻技術方面的指點,即便是本文,也是我對其本人的博文中的相關內容的一個闡釋與發揮。

    正如錢鍾書先生所言:當我們吃到一個很好吃的雞蛋時,總是忍不住想要認識一下生下那個蛋的母雞。

    最后,也希望zhuweisky以后能與我們分享更多的技術與心得。 

    請移步至《網絡語音視頻技術淺議(二)—— 實時性與流暢性如何保障?

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM