BG电子·(中国区)官方网站



音視頻開發必備基礎知識彙總

发布者:聯誠發 时间:2022-06-28 20:24 浏览量:1977

音視頻技術介绍

什么是音視頻技術?音視頻技術其实就是音频技術和视频技術的一个统称,在技術处理上,其实音频和视频是要分开处理的。

而且要注意一點,音視頻從開始收集數據到最後展示都是離不開硬件設備的,所以在以後的開發過程中,要做好與硬件打交道的心理准備了。

音視頻的主要處理過程:

1. 采集。比如從客戶端的攝像頭、麥克風和本地原始文件等,獲得基礎的音視頻數據;

2. 預處理。在這個階段其實就是對音視頻進行修剪操作,畢竟收集到的原始數據,不一定是想要在最後呈現的效果,因此在這裏可能會進行美顔、裁剪、AI識別處理、聲音A3處理等;

3. 編碼。在經過預處理或者沒處理過的原始文件,一般都會比較大,不適合進行傳輸,這個時候就需要進行壓縮、轉碼之類的操作,減少文件提交,然後再進行傳輸,執行編碼的工具叫編碼器,壓縮數據的算法叫做編碼格式;

4. 解碼。壓縮數據傳輸完之後,就需要解碼成原始文件一樣的數據才能使用,用來解碼的工具就是解碼器了,不過通常編碼器和解碼器是一塊的,統稱爲編解碼器codec;

5. 渲染與展示。接收到原始數據文件之後,就可以通過硬件或者軟件進行渲染與展示了,硬件例如顯示器、音響等,軟件有SurfaceView;

6. 文件封裝/解封裝。其實從采集,音頻和視頻都是分開進行處理的,但是在進行傳輸的時候,我們需要同一套音頻文件是在一塊的,所以需要進行一次文件封裝。存放音視頻的容器叫封裝容器,文件類型叫封裝格式;

7. 網絡協議打包。音視頻文件在網絡中傳輸的時候,一般都會有一個特定的協議,也就是流媒體協議。

網絡協議會將音視頻數據文件打包成協議包,通過網絡協議端口發送出去,接收方接收到網絡包之後,要通過網絡協議解開協議包,才能獲得音視頻數據文件。

音視頻主要參數即格式

視頻參數:

1. 分辨率:视频面积大。ㄏ袼豴x);

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帧和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長度有關。只有他們達到了最佳平衡,才能呈現最佳的畫質。

比如說,分辨率,一般在我們的印象中,就是越高,畫質就越清晰,這也是沒毛病的,畢竟分辨率越高,畫面分配到的像素點越多,細節描繪就越好,但是要注意,分辨率越高,帶來的問題就是數據量越大,數據量越大,那就代表著需要的碼率也就越高,只有碼率高了才能保證我們視頻數據的正常輸出,如果碼率低了,就是造成視頻的卡頓,也就是我們?匆姷摹耙曨l緩存中”。

不過現在很多視頻軟件也會做一些操作來降低碼率帶來的卡頓效果,比如調節壓縮比,壓縮比高了,數據量就小了,需要的碼率也就降低了,當然犧牲的就是原視頻的分辨率了。目前很多軟件會自動幫你調節壓縮比。

那麽幀率又在其中起到了什麽作用呢?玩遊戲的都知道,幀率越高,遊戲的流暢度就越高,幀率就是視頻的刷新率,也就是一秒鍾刷新的幀數,比如說幀率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)的概念,时间相近的音频帧和视频。颐蔷腿隙ㄎ峭降牧礁鲋。飧鱿嘟滴颐强梢越兴兄担飧鲢兄挡⒉皇撬嬉舛ㄒ宓模幸桓龉时曜冀蠷FC-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. 帶寬:网口允许收发数据量的大。ノ籦ps,发送速率:实际收发的数据量的大。ノ籦ps。帶寬可以理解成最大发送速率;

網絡抖動就是实际发(收)的数据没有发(收),判断是否抖动就是看丟包率是否增加、 RTT是否增加、发送速率是否降低。

JitterBuffer就是为了减少網絡抖動给音視頻传输带来的影响而产生的,jitterBuffer是传输过程中的一个缓冲区,连接着解码器和网络协议栈。

JitterBuffer会有一的延迟音視頻传输时间,将数据先缓存在缓冲区中,并且也会将之前缓存的数据发送到接收端,我就把他理解成我们在网上看电视的时候的视频缓存,这样的话,即使出现了偶尔的網絡抖動,也不会影响到用户的体验。

JitterBuffer帶來的好處就是:

1. 降低了网络轻微抖动打来的卡顿;

2. 平衡编解码器和网络协议栈的数据供求量;

3. 动态调整数据的收发量,在一定范围内控制数据收发平衡性。

總結

以上是聯誠發小编整合了一些其他大佬的资料和一些自己的理解写出的知识点,音視頻技術涵盖的内容其实比较广泛的,我这里也仅仅是列出了一些基础的概念,后续的TRTC学习之旅,有机会的话,聯誠發LED顯示屏小編繼續與大家探討一些其他的知識。


分享:

13
【网站地图】【sitemap】