發布者:聯誠發 時間:2022-06-28 20:24 瀏覽量:1900
什么是音視頻技術?音視頻技術其實就是音頻技術和視頻技術的一個統稱,在技術處理上,其實音頻和視頻是要分開處理的。
而且要注意一點,音視頻從開始收集數據到最后展示都是離不開硬件設備的,所以在以后的開發過程中,要做好與硬件打交道的心理準備了。
音視頻的主要處理過程:
1. 采集。比如從客戶端的攝像頭、麥克風和本地原始文件等,獲得基礎的音視頻數據;
2. 預處理。在這個階段其實就是對音視頻進行修剪操作,畢竟收集到的原始數據,不一定是想要在最后呈現的效果,因此在這里可能會進行美顏、裁剪、AI識別處理、聲音A3處理等;
3. 編碼。在經過預處理或者沒處理過的原始文件,一般都會比較大,不適合進行傳輸,這個時候就需要進行壓縮、轉碼之類的操作,減少文件提交,然后再進行傳輸,執行編碼的工具叫編碼器,壓縮數據的算法叫做編碼格式;
4. 解碼。壓縮數據傳輸完之后,就需要解碼成原始文件一樣的數據才能使用,用來解碼的工具就是解碼器了,不過通常編碼器和解碼器是一塊的,統稱為編解碼器codec;
5. 渲染與展示。接收到原始數據文件之后,就可以通過硬件或者軟件進行渲染與展示了,硬件例如顯示器、音響等,軟件有SurfaceView;
6. 文件封裝/解封裝。其實從采集,音頻和視頻都是分開進行處理的,但是在進行傳輸的時候,我們需要同一套音頻文件是在一塊的,所以需要進行一次文件封裝。存放音視頻的容器叫封裝容器,文件類型叫封裝格式;
7. 網絡協議打包。音視頻文件在網絡中傳輸的時候,一般都會有一個特定的協議,也就是流媒體協議。
網絡協議會將音視頻數據文件打包成協議包,通過網絡協議端口發送出去,接收方接收到網絡包之后,要通過網絡協議解開協議包,才能獲得音視頻數據文件。
1. 分辨率:視頻面積大小(像素px);
2. 幀率:每秒的幀數量fps;
3. 碼率:每秒的數據量bps(b = bit)。
1. 采樣率:每秒采集的音頻點數量Hz;
2. 聲道數:同時采集聲音的通道數量,常見有單聲道和立體聲道;
3. 位寬:也叫采樣位寬,指保存單個聲音樣本點的比特位數,通常是16bit。
視頻:YUV、RGB;
音頻:PCM
視頻:H.264(也叫AVG);
音頻:AAC、Opus
視頻:MP4、FLV、TS;
音頻:不封裝
視頻幀就相當于一張圖片,多個圖片組合以極快的速度切換,就可以形成一段視頻。雖說只是圖片,但是視頻幀有很多種類之分,后面我會進行介紹。
目前視頻幀主要分為一下幾種:
1. I幀即關鍵幀,記錄了一個完整的圖像,可以被直接解碼顯示,兩個I幀中間的一組幀稱之為一個GOP(group of picture);
2. P幀,不記錄畫面,記錄的是本幀與前一幀的差異,P幀不能直接解碼,需要先解碼前序的參考幀;
3. B幀是記錄了本幀與前一個I/P幀和后一個I/P幀的差異;
4. 剩下的還有SI和SP幀,這倆是用于切換碼流使用,一般不常見。
P幀和B幀主要是用來壓縮視頻用的,大概原理可以理解,I幀存儲的是原圖像,那么存儲的數據量也會比較大,如果I幀出現的占比越多,那么整個視頻的數據量也就越多。
這個時候P幀和B幀的出現,可以明顯的減少數據量,P幀只會對比前一個P幀或者I幀的差異,并存儲下來,數據量比I幀小了很多,大概壓縮比有20左右,另外B幀會對比前一個I/P幀、后一個I/P幀與本幀的差異,并進行存儲,因為對比了兩個幀,所以B幀存儲的數據量就會更小,壓縮比能達到50。
在直播中,基本上不會出現B幀,因為B幀是需要解析了前后兩個幀之后做對比產生的,在直播這種最求速度和畫質的場景中,如果使用B幀,會因為大量解析的時間增加不少延遲,但是也不能全是I幀,I幀的數據量太大,全是I幀的話,效率也會很差,所以直播一般是用的I幀和P幀組合。
【文章福利】需要C/C++ Linux服務器架構師及音視頻學習資料加群812855908(資料包括C/C++,Linux,golang技術,內核,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒體,音視頻,CDN,P2P,K8S,Docker,TCP/IP,協程,DPDK,ffmpeg,大廠面試題 等)
一個視頻的畫質與視頻的碼率、分辨率、壓縮比、幀率、GOP長度有關。只有他們達到了最佳平衡,才能呈現最佳的畫質。
比如說,分辨率,一般在我們的印象中,就是越高,畫質就越清晰,這也是沒毛病的,畢竟分辨率越高,畫面分配到的像素點越多,細節描繪就越好,但是要注意,分辨率越高,帶來的問題就是數據量越大,數據量越大,那就代表著需要的碼率也就越高,只有碼率高了才能保證我們視頻數據的正常輸出,如果碼率低了,就是造成視頻的卡頓,也就是我們常看見的“視頻緩存中”。
不過現在很多視頻軟件也會做一些操作來降低碼率帶來的卡頓效果,比如調節壓縮比,壓縮比高了,數據量就小了,需要的碼率也就降低了,當然犧牲的就是原視頻的分辨率了。目前很多軟件會自動幫你調節壓縮比。
那么幀率又在其中起到了什么作用呢?玩游戲的都知道,幀率越高,游戲的流暢度就越高,幀率就是視頻的刷新率,也就是一秒鐘刷新的幀數,比如說幀率30fps,你就可以理解成,30幅連續動作的畫一秒鐘從你眼前閱過。
一般來說:30fps左右可以感覺動作已經是連貫的了;60fps體驗已經可以達到逼真感;超過75fps,一般就沒法察覺流暢度的提升了。
幀率有顯示器幀率和視頻幀率之分,這一點是要注意不要混淆了。那我們這里可以探討一下如果視頻幀率與顯示器幀率不同的情況下會出現什么情況。
其實視頻幀率就是顯卡繪制圖形速度控制的,假如說你的顯卡繪制速度是30fps,而顯示器的幀率是60fps,顯示器刷新的速度比顯卡繪制速度快,這個時候顯示器就只是刷新最新的那些幀,在觀看體驗上并不會有什么差異。
但是如果顯示器的幀率是30fps,而顯卡是60fps,那就問題來了,因為顯卡繪制圖形速度過快,而顯示器刷新速度太慢,就會導致有的幀被緩存下來,當緩存區別放慢了之后,后面繼續進來的數據就會把之前的數據擠走,這就導致了顯示器當前幀與緩存區下一幀不是連貫的,也就會出現了“畫面撕裂”。
再來說說GOP對畫質的影響,前面有說過,GOP就是一個I幀與下一個I幀之間的幀組合,比如IBBPBBP...之類的,在一組GOP中,因為B和P幀只記錄了差值,所以需要的數據量比I幀少很多。
所以我們可以想象,在有限的數據量里邊,如果GOP長度越長,I幀所分到的數據量就能越多,I幀的質量就可以更高,I幀又是GOP的基準幀,那么整體的畫質也就提升了。
但是不是GOP越長,就越好呢?回答當然是no,根據之前說的,P和B幀都是參考I幀生成的,有依賴關系,解析時間比I幀長很多,設置過多的B、P幀那就代表著在解析上面就要花費更多的時間,另外如果他們參照的I幀出現了數據問題,那么這一組GOP的數據就全部出錯。由此看見,GOP也并不是越長越好。
我們都知道,播放器在處理音視頻的時候是分開進行解碼渲染的,那么又如何才能達到音畫同步呢?我們可以聯想到我們的現實世界,我們是如何理解同步這個概念,其實同步就是指的同時發生。
那么要做到音畫同步也就是說我們要給音畫添加上時間戳(PTS)的概念,時間相近的音頻幀和視頻幀,我們就認定為是同步的兩個幀,這個相近值我們可以叫他閾值,這個閾值并不是隨意定義的,他有一個國際標準叫RFC-1359.
一般音視頻同步的做法有三種:視頻同步到音頻、音頻同步到視頻、音視頻同步的外部時鐘。
通常采用視頻同步到音頻的方法。這是因為視頻是一幀一幀播放的,而音頻則是一個流式的播放形式,也就是連續不間斷的形式,在處理邏輯上,處理一幀幀播放的視頻會來的更加方便。音視頻同步的算法如下圖所示:
音畫同步算法
通常音視頻數據體積比較大,所以在網絡傳輸過程中都是連續不斷的多媒體流量,在網絡中傳輸音視頻數據的技術叫流媒體技術,傳輸使用的協議就是流媒體協議。
通常使用的流媒體協議有一下幾種:
1. RTMP:基于TCP七層協議,性價比高,是目前直播推流的標準使用協議;
2. HTTP-FLV:基于TCP,使用HTTP傳輸FLV流,分發性能強,適用于CDN分發;
3. HLS:基于TCP,被HTML5寫入標準支持,延時大,但是兼容H5;
4. RTP:基于UDP四層協議,定義簡單且性能好,但是需要額外的信令協議。
除了以上四種之外,有些廠商還會有自己的協議已達到特定的傳輸目的。
首先要先來熟悉一下幾個衡量網絡好壞的指標:
1. 丟包率:(本端接收到的數據包/對端發送的數據包) * 100%;
2. 延時:對端接收時間T1-本端發送數據時間T0,一般用RTT來評估延時,即往返延時,本端發送數據,到對端接收數據并確認接收的耗時;
3. 帶寬:網口允許收發數據量的大小,單位bps,發送速率:實際收發的數據量的大小,單位bps。帶寬可以理解成最大發送速率;
網絡抖動就是實際發(收)的數據沒有發(收),判斷是否抖動就是看丟包率是否增加、 RTT是否增加、發送速率是否降低。
JitterBuffer就是為了減少網絡抖動給音視頻傳輸帶來的影響而產生的,jitterBuffer是傳輸過程中的一個緩沖區,連接著解碼器和網絡協議棧。
JitterBuffer會有一的延遲音視頻傳輸時間,將數據先緩存在緩沖區中,并且也會將之前緩存的數據發送到接收端,我就把他理解成我們在網上看電視的時候的視頻緩存,這樣的話,即使出現了偶爾的網絡抖動,也不會影響到用戶的體驗。
JitterBuffer帶來的好處就是:
1. 降低了網絡輕微抖動打來的卡頓;
2. 平衡編解碼器和網絡協議棧的數據供求量;
3. 動態調整數據的收發量,在一定范圍內控制數據收發平衡性。
以上是聯誠發小編整合了一些其他大佬的資料和一些自己的理解寫出的知識點,音視頻技術涵蓋的內容其實比較廣泛的,我這里也僅僅是列出了一些基礎的概念,后續的TRTC學習之旅,有機會的話,聯誠發LED顯示屏小編繼續與大家探討一些其他的知識。