走進5G時代的音視頻開發

音頻的基礎知識

1採樣和採樣頻率

現在是數字時代,在音頻處理時要先把音頻的模擬信號變成數字信號,這叫A/D轉換。要把音頻的模擬信號變成數字信號,就需要採樣。一秒鐘內採樣的次數稱爲採樣頻率

2採樣位數/位寬

數字信號是用0和1來表示的。採樣位數就是採樣值用多少位0和1來表示,也叫採樣精度,用的位數越多就越接近真實聲音。如用8位表示,採樣值取值範圍就是-128 ~ 127,如用16位表示,採樣值取值範圍就是-32768 ~ 32767。

3聲道(channel)

通常語音只用一個聲道。而對於音樂來說,既可以是單聲道(mono),也可以是雙聲道(即左聲道右聲道,叫立體聲stereo),還可以是多聲道,叫環繞立體聲

4編解碼

通常把音頻採樣過程也叫做脈衝編碼調製編碼,即PCM(Pulse Code Modulation)編碼,採樣值也叫PCM值。 如果把採樣值直接保存或者發送,會佔用很大的存儲空間。以16kHz採樣率16位採樣位數單聲道爲例,一秒鐘就有16/8*16000 = 32000字節。爲了節省保存空間或者發送流量,會對PCM值壓縮。

目前主要有三大技術標準組織制定壓縮標準:

1.ITU,主要制定有線語音的壓縮標準(g系列),有g711/g722/g726/g729等。

2.3GPP,主要制定無線語音的壓縮標準(amr系列等),有amr-nb/amr-wb。後來ITU吸納了amr-wb,形成了g722.2。

3.MPEG,主要制定音樂的壓縮標準,有11172-3,13818-3/7,14496-3等。

一些大公司或者組織也制定壓縮標準,比如iLBC,OPUS。

編碼過程:模擬信號->抽樣->量化->編碼->數字信號

5壓縮:
 

對於自然界中的音頻信號,如果轉換成數字信號,進行音頻編碼,那麼只能無限接近,不可能百分百還原。所以說實際上任何信號轉換成數字信號都會“有損”。但是在計算機應用中,能夠達到最高保真水平的就是PCM編碼。因此,PCM約定俗成了無損編碼。我們而習慣性的把MP3列入有損音頻編碼範疇,是相對PCM編碼的。強調編碼的相對性的有損和無損

6碼率:

碼率 = 採樣頻率 * 採樣位數 * 聲道個數; 例:採樣頻率44.1KHz,量化位數16bit,立體聲(雙聲道),未壓縮時的碼率 = 44.1KHz * 16 * 2 = 1411.2Kbps = 176.4KBps,即每秒要錄製的資源大小,理論上碼率和質量成正比

800 bps – 能夠分辨的語音所需最低碼率(需使用專用的FS-1015語音編解碼器)

8 kbps —電話質量(使用語音編碼)

8-500 kbps --Ogg Vorbis和MPEG1 Player1/2/3中使用的有損音頻模式

500 kbps–1.4 Mbps —44.1KHz的無損音頻,解碼器爲FLAC Audio,WavPack或Monkey's Audio

1411.2 - 2822.4 Kbps —脈衝編碼調製(PCM)聲音格式CD光碟的數字音頻

5644.8 kbps —SACD使用的Direct Stream Digital格式

7常用音頻格式

WAV 格式:音質高 無損格式 體積較大

AAC(Advanced Audio Coding) 格式:相對於 mp3,AAC 格式的音質更佳,文件更小,有損壓縮,一般蘋果或者Android SDK4.1.2(API 16)及以上版本支持播放,性價比高

AMR 格式:壓縮比比較大,但相對其他的壓縮格式質量比較差,多用於人聲,通話錄音

mp3 格式:特點 使用廣泛, 有損壓縮,犧牲了12KHz到16KHz高音頻的音質

8音頻開發的主要應用

音頻播放器

錄音機

語音電話

音視頻監控應用

音視頻直播應用

音頻編輯/處理軟件(ktv音效、變聲, 鈴聲轉換)

藍牙耳機/音箱

9音頻開發的具體內容

音頻採集/播放

音頻算法處理(去噪、靜音檢測、回聲消除、音效處理、功放/增強、混音/分離,等等)

音頻的編解碼和格式轉換

音頻傳輸協議的開發(SIP,A2DP、AVRCP,等等)

視頻基礎知識

視頻是一種有結構的數據

內容元素 ( Content )

圖像 ( Image )

音頻 ( Audio )

元信息 ( Metadata )

編碼格式 ( Codec )

Video : H.264,H.265, …

Audio : AAC, HE-AAC, …

容器封裝 (Container)

MP4,MOV,FLV,RM,RMVB,AVI,…

任何一個視頻 Video 文件,從結構上講,都是這樣一種組成方式:

由圖像和音頻構成最基本的內容元素;

圖像經過視頻編碼壓縮格式處理(通常是 H.264);

音頻經過音頻編碼壓縮格式處理(例如 AAC);

註明相應的元信息(Metadata);

最後經過一遍容器(Container)封裝打包(例如 MP4),構成一個完整的視頻文件。

視頻播放流程

走進5G時代的音視頻開發

視頻的播放流程

色彩空間

RBG:採用R、G、B相加混色的原理,通過發射出三種不同強度的電子束,使屏幕內側覆蓋的紅、綠、藍磷光材料發光而產生色彩。這種色彩的表示方法稱爲RGB色彩空間表示.

編解碼介紹

  視頻編碼的主要作用是將視頻像素數據(RGB等)壓縮成爲視頻碼流,從而降低視頻的數據量。如果視頻不經過壓縮編碼的話,體積通常是非常大的,一部電影可能就要上百G的空間。視頻編碼是視音頻技術中最重要的技術之一。視頻碼流的數據量佔了視音頻總數據量的絕大部分。高效率的視頻編碼在同等的碼率下,可以獲得更高的視頻質量。

  舉個直播上的栗子:我們知道從 CCD 採集到的圖像格式一般的 RGB 格式的(BMP),這種格式的存儲空間非常大,它是用三個字節描述一個像素的顏色值,如果是 1080P 分辨率的圖像空間:1920 x 1080 x 3 = 6MB,就算轉換成 JPG 也有近 200KB,如果是每秒 12 幀用 JPG 也需要近 2.4MB/S 的帶寬,這帶寬在公網上傳輸是無法接受的。

  視頻編碼器就是爲了解決這個問題的,它會根據前後圖像的變化做運動檢測,通過各種壓縮把變化的發送到對方,1080P 進行過 H.264 編碼後帶寬也就在 200KB/S ~ 300KB/S 左右。

  我們平時所看到的視頻,理論上就是一幀幀的圖片連續的播放,形成動畫效果。那麼完整的保存所有圖片,所佔用的空間是非常巨大的。視頻編碼就是爲了壓縮這些圖片,以節省空間。我先講一下簡單的理論,比如一秒鐘的視頻通常有24幀,這24張圖畫大部分區域可能都比較相近,那麼我們是不是可以找到一種方法,只保存一張完整圖片(我們稱爲關鍵幀),不保存其他圖片,只保存和這個完整圖片的不同(通過某種數學建模表達),這樣就會節省很多空間,在播放的時候,通過和關鍵幀與每一幀的不同逆向恢復成一張完整的圖片,這樣就得到了24張完整的圖片。(這裏只是舉例,實際應用中並不一定是每24幀圖像被設定一個關鍵幀)。OK,那麼所謂編碼格式就指的一種壓縮視頻圖像的算法。

H.264編碼介紹

  H.264是新一代的編碼標準,以高壓縮高質量和支持多種網絡的流媒體傳輸著稱,在編碼方面,它的理論依據是:一段時間內圖像的統計結果表明,在相鄰幾幅圖像畫面中,一般有差別的像素只有10%以內的點,亮度差值變化不超過2%,而色度差值的變化只有1%以內。所以對於一段變化不大的圖像畫面,我們可以先編碼出一個完整的圖像幀A,隨後的B幀不編碼全部圖像,只寫入與A幀的差別,這樣B幀的大小就只有完整幀的1/10或更小!B幀之後的C幀如果變化不大,我們可以繼續以參考B的方式編碼C幀,這樣循環下去。這段圖像我們稱爲一個序列,當某個圖像與之前的圖像變化很大,無法參考前面的幀來生成,那我們就結束上一個序列,開始下一段序列。

I 幀是內部編碼幀(也稱爲關鍵幀),P 幀是前向預測幀(前向參考幀),B 幀是雙向內插幀(雙向參考幀)。簡單地講,I 幀是一個完整的畫面,而 P 幀和 B 幀記錄的是相對於 I 幀的變化。

視頻的實時傳輸(直播)

視頻直播技術,就是將視頻內容的最小顆粒 ( I / P / B 幀,…),基於時間序列,以高速進行傳送的一種技術。

  簡而言之,直播就是將每一幀數據 ( Video / Audio / Data Frame ),打上時序標籤 ( Timestamp ) 後進行流式傳輸的過程。發送端源源不斷的採集音視頻數據,經過編碼、封包、推流,再經過中繼分發網絡進行擴散傳播,播放端再源源不斷地下載數據並按時序進行解碼播放。如此就實現了 “邊生產、邊傳輸、邊消費” 的直播過程。

流媒體協議

RTSP協議

  該協議定義了一對多應用程序如何有效地通過IP網絡傳送多媒體數據。RTSP提供了一個可擴展框架,使實時數據,如音頻與視頻的受控、點播成爲可能。數據源包括現場數據與存儲在剪輯中的數據。該協議目的在於控制多個數據發送連接,爲選擇發送通道,如UDP、多播UDP與TCP提供途徑,併爲選擇基於RTP上發送機制提供方法。

RTMP協議

  RTMP是Adobe Systems公司爲Flash播放器和服務器之間音頻、視頻和數據實時傳輸開發的開放協議,因爲是開放協議所以都可以使用。

RTMP協議用於對象、視頻、音頻的傳輸,這個協議建立在TCP協議或者輪詢HTTP協議之上。

RTMP協議就像一個用來裝數據包的容器,這些數據可以是FLV中的視音頻數據。一個單一的連接可以通過不同的通道傳輸多路網絡流,這些通道中的包都是按照固定大小的包傳輸的。

HLS協議

  HTTP Live Streaming(HLS)是蘋果公司(Apple Inc.)實現基於HTTP的流媒體傳輸協議,傳輸內容包括兩部分,一是M3U8描述文件,二是TS媒體文件。可實現流媒體的直播和點播,主要應用在iOS系統,爲iOS設備(如iPhone、iPad)提供音視頻直播和點播方案。HLS點播,基本上就是常見的分段HTTP點播,不同在於,它的分段非常小。

  相對於常見的流媒體直播協議,例如RTMP協議、RTSP協議、MMS協議等,HLS直播最大的不同在於,直播客戶端獲取到的,並不是一個完整的數據流。HLS協議在服務器端將直播數據流存儲爲連續的、很短時長的媒體文件(MPEG-TS格式),而客戶端則不斷的下載並播放這些小文件,因爲服務器端總是會將最新的直播數據生成新的小文件,這樣客戶端只要不停的按順序播放從服務器獲取到的文件,就實現了直播。由此可見,基本上可以認爲,HLS是以點播的技術方式來實現直播。由於數據通過HTTP協議傳輸,所以完全不用考慮防火牆或者代理的問題,而且分段文件的時長很短,客戶端可以很快的選擇和切換碼率,以適應不同帶寬條件下的播放。不過HLS的這種技術特點,決定了它的延遲一般總是會高於普通的流媒體直播協議。

協議間的比較:

協議比較part1

協議比較part2

FFmpeg

  FFmpeg的名稱來自MPEG視頻編碼標準,前面的“FF”代表“Fast Forward”,FFmpeg是一套可以用來記錄、轉換數字音頻、視頻,並能將其轉化爲流的開源計算機程序。可以輕易地實現多種視頻格式之間的相互轉換。

FFmpeg函數庫介紹

libavutil:簡化編程的工具函數庫,包括隨機數生成器,數據結構,數學函數,多媒體核心工具函數等等。

libavcodec:包含音視頻編解碼的庫。

libavformat:包含複用,解複用(封裝格式處理)多媒體容器的庫。

libavdevice:包含輸入/輸出設備的庫,它能從一些通用的軟件框架中抓取數據,也能將多媒體數據送到一些通用軟件框架中去渲染。這些通用軟件框架包括:Video4Linux,Video4Linux2,VfW以及ALSA等。

libavfilter:濾鏡特效處理。

libswscale:用於執行高性能的圖像縮放,顏色空間或像素格式轉換的庫。

libswresample:用於執行高性能音頻重採樣,重矩陣化(rematrixing,不確定翻譯是否準確),採樣格式轉換以及混音(主要是聲道轉換(如5.1聲道轉到立體聲等))等功能的庫。

實現直播整體流程

推流端(採集、美顏處理、編碼、推流)、服務端處理(轉碼、錄製、截圖、鑑黃)、播放器(拉流、解碼、渲染)、互動系統(聊天室、禮物系統、贊)

走進5G時代的音視頻開發

實現直播的整體架構

關於直播的優化

1. 秒開優化

  改寫播放器邏輯讓播放器拿到第一個關鍵幀後就給予顯示。GOP 的第一幀通常都是關鍵幀,由於加載的數據較少,可以達到 “首幀秒開”。如果直播服務器支持 GOP 緩存,意味着播放器在和服務器建立連接後可立即拿到數據,從而省卻跨地域和跨運營商的回源傳輸時間。

  GOP 體現了關鍵幀的週期,也就是兩個關鍵幀之間的距離,即一個幀組的最大幀數。假設一個視頻的恆定幀率是 24fps(即1秒24幀圖像),關鍵幀週期爲 2s,那麼一個 GOP 就是 48 張圖像。一般而言,每一秒視頻至少需要使用一個關鍵幀。

  增加關鍵幀個數可改善畫質(GOP 通常爲 FPS 的倍數),但是同時增加了帶寬和網絡負載。這意味着,客戶端播放器下載一個 GOP,畢竟該 GOP 存在一定的數據體積,如果播放端網絡不佳,有可能不是能夠快速在秒級以內下載完該 GOP,進而影響觀感體驗。

2. 馬賽克、卡頓

  如果 GOP 分組中的P幀丟失會造成解碼端的圖像發生錯誤,其實這個錯誤表現出來的就是馬賽克。因爲中間連續的運動信息丟失了,H.264 在解碼的時候會根據前面的參考幀來補齊,但是補齊的並不是真正的運動變化後的數據,這樣就會出現顏色色差的問題,這就是所謂的馬賽克現象

走進5G時代的音視頻開發

視頻出現碼賽克

這種現象不是我們想看到的。爲了避免這類問題的發生,一般如果發現 P 幀或者 I 幀丟失,就不顯示本 GOP 內的所有幀,直到下一個 I 幀來後重新刷新圖像。但是 I 幀是按照幀週期來的,需要一個比較長的時間週期,如果在下一個 I 幀來之前不顯示後來的圖像,那麼視頻就靜止不動了,這就是出現了所謂的卡頓現象。如果連續丟失的視頻幀太多造成解碼器無幀可解,也會造成嚴重的卡頓現象。視頻解碼端的卡頓現象和馬賽克現象都是因爲丟幀引起的,最好的辦法就是讓幀儘量不丟。

3. 傳輸協議優化

在服務端節點和節點之間儘量使用 RTMP 而非基於 HTTP 的 HLS 協議進行傳輸,這樣可以降低整體的傳輸延遲。這個主要針對終端用戶使用 HLS 進行播放的情況。

如果終端用戶使用 RTMP 來播放,儘量在靠近推流端的收流節點進行轉碼,這樣傳輸的視頻流比原始視頻流更小。

如果有必要,可以使用定製的 UDP 協議來替換 TCP 協議,省去弱網環節下的丟包重傳可以降低延遲。它的主要缺點在於,基於 UDP 協議進行定製的協議的視頻流的傳輸和分發不夠通用,CDN 廠商支持的是標準的傳輸協議。另一個缺點在於可能出現丟包導致的花屏或者模糊(缺少關鍵幀的解碼參考),這就要求協議定製方在 UDP 基礎之上做好丟包控制。

4. 傳輸網絡優化

在服務端節點中緩存當前 GOP,配合播放器端優化視頻首開時間。

服務端實時記錄每個視頻流流向每個環節時的秒級幀率和碼率,實時監控碼率和幀率的波動。

客戶端(推流和播放)通過查詢服務端準實時獲取當前最優節點(5 秒一次),準實時下線當前故障節點和線路。

5. 推流、播放優化

考察發送端系統自帶的網絡 buffer 大小,系統可能在發送數據之前緩存數據,這個參數的調優也需要找到一個平衡點。

播放端緩存控制對於視頻的首開延遲也有較大影響,如果僅優化首開延遲,可以在 0 緩存情況下在數據到達的時候立即解碼。但如果在弱網環境下爲了消除網絡抖動造成的影響,設置一定的緩存也有必要,因此需要在直播的穩定性和首開延遲優化上找到平衡,調整優化緩衝區大小這個值。

播放端動態 buffer 策略,這是上面播放端緩存控制的改進版本。如果只是做 0 緩存和固定大小的緩存之間進行選擇找到平衡,最終還是會選擇一個固定大小的緩存,這對億級的移動互聯網終端用戶來說並不公平,他們不同的網絡狀況決定了這個固定大小的緩存並不完全合適。因此,我們可以考慮一種「動態 buffer 策略」,在播放器開啓的時候採用非常小甚至 0 緩存的策略,通過對下載首片視頻的耗時來決定下一個時間片的緩存大小,同時在播放過程中實時監測當前網絡,實時調整播放過程中緩存的大小。這樣即可做到極低的首開時間,又可能夠儘量消除網絡抖動造成的影響。

動態碼率播放策略。除了動態調整 buffer 大小的策略之外,也可以利用實時監測的網絡信息來動態調整播放過程中的碼率,在網絡帶寬不足的情況下降低碼率進行播放,減少延遲。


喜歡音視頻的朋友可以關注+評論

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章