流媒體服務新手入門教程03--音視頻基礎


對於簡單的接入攝像頭等硬件或者推送視頻流、錄制文件,那么直接下載m7s官網編譯好的二進制文件即可。

如果要做二次開發,那么就需要了一些基礎的音視頻基礎,及m7s代碼了,我們先了解一些音視頻基礎。

視頻基礎

視頻幀

對於視頻來說,我們可以把其想象為一幅一幅圖片組成的,當把這些圖片連續快速播放時,由於人眼的視覺暫留,只要播放的速度大於1秒24幅圖片,那么我們看起來就是連續的。其中這個每秒播放多少張圖片就稱為幀率 ,一副圖片就稱為。假如就這么把圖片放在一起,我們來算一下現在流行的15秒短視頻大概有多大。
我們現在的手機攝像頭都是千萬像素,拍攝出來的照片基本都超過1M,這里就按1M計算,幀率按照24,則15秒的短視頻有 24*1*15 = 360M
是不是嚇一跳,實際上視頻並不簡單的把圖片組合起來,而是按照一定的規范壓縮過。要不然我們刷幾個短視頻,流量蹭蹭蹭的往下掉,誰也扛不住啊!

幀間壓縮

我們比較一下相鄰的兩幅圖片,會發現第二幅圖片相對第一幅來說變動很小。如果只記錄這個變化的地方,那么存儲不就降下來了嗎。
於是這些技術專家們提出了三種幀:
I 幀(Intra-coded picture)表示關鍵幀,你可以理解為這一幀畫面的完整保留;解碼時只需要本幀數據就可以完成(因為包含完整畫面)
P幀 (Predictive-coded Picture)前向預測編碼圖像幀,P幀表示的是這一幀跟之前的一個關鍵幀(或P幀)的差別,解碼時需要用之前緩存的畫面疊加上本幀定義的差別,生成最終畫面。
B幀 (Bidirectionally predicted picture)雙向預測編碼圖像幀,B幀是雙向差別幀,也就是B幀記錄的是本幀與前后幀的差別,換言之,要解碼B幀,不僅要取得之前的緩存畫面,還要解碼之后的畫面,通過前后畫面的與本幀數據的疊加取得最終的畫面。B幀壓縮率高,但是解碼時CPU會比較累。

幀內壓縮

看到這里,你可能會想到,除了對幀間壓縮,我們是否還可以對幀內進行壓縮呢?答案是肯定的。
我們常見的圖片是利用紅、綠、藍三原色來表示每一個像素點,即RGB模式。但實際上攝像頭,流媒體里用的更多的是YUV。
什么是YUV?
Y表示明亮度(Luminance或Luma),也就是灰度值;
U(Cb)表示色度(Chrominance)
V(Cr)表示濃度(Chroma)
它們直接的關系可以參考這副圖片,YUV和RGB直接的換算關系可以參考此文

和RGB類似,原始的YUV也是用三個分量代表顏色,這時存儲大小也是和RGB一樣的。
但是人眼對亮度更敏感。於是我們就可以壓縮U和V分量了。
比如常見的YUV 422,表示 UV 分量的是 Y 分量的一半,那么存儲空間就相當於以前的 (0.5 + 0.5 + 1) / 3 = 2/3 了。
壓縮更高的還有YUV 420,表示UV分量隔行存儲,並且只有Y分量的一半,那么存儲空間就相當於以前的 (0.25 + 0.25 + 1) / 3 = 1/2 了。
對於YUV其實還有很多情況,我這里就不多說了,請自行查找。
當然幀內壓縮還有其它方式,這里只說一下最常見的情況。

編解碼和解封包

視頻壓縮思路確定后,就是具體的壓縮算法了。不同的機構提出了各種各樣的壓縮算法。
壓縮視頻幀還原視頻幀被稱為編解碼。
編碼就是指通過壓縮技術,將原始視頻格式的文件轉換成另一種視頻格式文件的方式。
解碼即對已編碼的數字視頻進行還原操作的過程。
常見的編碼有:

  • H264 當前主流編碼,個人免費,商業收費
  • H265 H264的下一代,壓縮率更高,已開始普及,個人免費,商業收費
  • VP8/VP9 Google推出,主要用在webrtc中, 開源免費
  • AV1 Google 推出,想要與H265爭奪市場,開源免費
  • AVS 國產視頻編碼,AVS1替代H264,AVS2 替代H265,比同期的H264和H265都強。個人免費,商業收費,比H264、H265低很多。
    作為國人,希望國產編碼標准能夠開源免費,這樣可以吸引到足夠的開發者和硬件廠商,打造良好的生態,逐漸推廣到世界。

確定好編解碼后,下一步就是怎么保存這些編碼后的數據了。可以想象最簡單的一種方案是直接保存編解碼后的數據,對於直接保存為文件來說,這當然是沒有問題的。
但是把原始數據放在網絡上傳播,就有點困難了。我們知道網絡是一個不確定的環境,數據有可能丟失或者順序錯位,這時給原始的視頻數據加一層殼,在這層殼上添加
編號,以及一些校驗數據,就可以大大降低網絡傳輸的不確定性了。
在網絡傳輸中,為了方便數據傳輸,常常對數據的打包后發送,被稱為封包。打包的數據分成兩個部分,包括控制信息,也就是表頭(header),和數據本身,也就是負載(payload)。解包即封包的反向操作了,通過讀取表頭header里的信息,提取負載數據。
雖然文件可以不用封包,但是我們常見的視頻文件,其實也是對編碼后的視頻封包了,方便壓縮傳輸和自定義(比如封裝字幕加水印啥的)。

比如常見的mkv格式,mkv實際是容器,內部可以裝不同編碼類型的原始視頻,既可以是h264,也可以是h265的。

音頻基礎

采樣率

我們聽到的聲音是聲波,聲波是一種模擬信號,要想讓計算機處理,得把其變成數字信號,這個轉換被叫做A/D(模數)轉換。
怎么把聲波變為數字信號呢?這就需要采樣,或者叫抽樣了。采樣率則是指錄音設備在一秒鍾內對聲音信號的采樣次數,單位Hz(赫茲)
如下圖,如果采樣的間隔越小,那么對聲音的還原度不久越高了嗎?

音頻壓縮

同視頻一樣,如果未經壓縮,原始數字音頻信號流(PCM編碼)文件也是大的嚇人。
音頻壓縮也是應用了人的聽覺差異,包括時域和空域。
空域:人耳對低頻和高頻不敏感,可以直接把這些信號去除。
時域:高頻聲音會覆蓋前后幾十毫秒的低頻聲音,那么這幾十毫秒的信號也可以去除。
當然這個同視頻一樣,這個是基礎壓縮,在這么處理后,還能夠繼續用算法來壓縮。
音頻壓縮又分為有損壓縮(即能夠還原原始音頻),和無損壓縮(即不能還原)。
常見的音頻編碼又:

  • aac 收費
  • mp3 收費
  • ogg 開源
  • wav 原始 直接在PCM上加了描述信息,沒有壓縮
  • ape 無損壓縮

其它理論

位數

視頻:比如我們保存圖片有8位、16位,位數越多則單個像素點的色彩種類越多。
音頻:對聲音來說,比如上面的采樣率,如果縱坐標范圍划分的越細,那么記錄的聲音強弱范圍也越詳細。

碼率/碼流/比特率

在攝像頭配置界面,我們常見的一個選項就是碼率了。知道碼率后,可以直接用 碼率x時間/8 來估算 文件大小。
為什么除以8呢?因為碼率的單位是b(bit),文件用的是B(Byte),一個字節是8位。
碼率有動態碼率和靜態碼率,在確定分辨率和幀率后,碼率仍然是可以調整的,碼率調整的是壓縮率。碼率不僅是視頻,也是音頻的一個參數。
碼率越高,質量越好。但是網絡傳輸條件下,我們往往要做取舍,選擇適當的碼率。
我們先使用ffprobe -i 文件路徑 發現輸出了下面的內容,展示了視頻文件的元數據、包括時長、碼率、音視頻編碼器,分辨率等

 Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: mp41mp42isom
    creation_time   : 2019-10-22T07:09:16.000000Z
  Duration: 00:31:46.72, start: 0.000000, bitrate: 15047 kb/s
    Stream #0:0(zho): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 251 kb/s (default)
    Metadata:
      creation_time   : 2019-10-22T07:09:16.000000Z
      handler_name    : Core Media Audio
    Stream #0:1(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 14791 kb/s, 25 fps, 25 tbr, 25 tbn, 50 tbc (default)
    Metadata:
      creation_time   : 2019-10-22T07:09:16.000000Z
      handler_name    : Core Media Video

常見碼率

dts pts gop

在播放視頻的時候,網絡情況不好,或者拖動進度條,會出現音視頻不同步的問題。音視頻不同步,就和下面兩個概念有關了:
DTS(Decoding Time Stamp):即解碼時間戳,這個時間戳的意義在於告訴播放器該在什么時候解碼這一幀的數據。
PTS(Presentation Time Stamp):即顯示時間戳,這個時間戳用來告訴播放器該在什么時候顯示這一幀的數據。

要實現音視頻同步,通常需要選擇一個參考時鍾,參考時鍾上的時間是線性遞增的,編碼音視頻流時依據參考時鍾上的時間給每幀數據打上時間戳。在播放時,讀取數據幀上的時間戳,同時參考當前參考時鍾上的時間來安排播放。

有時候還會遇到花屏,然后過一段時間后,自己又恢復了。這就和GOP有關了。
GOP ( Group of Pictures) 是一組連續的畫面,由一張 I 幀和數張 B / P 幀組成。花屏一般是因為中間有丟幀,造成解碼失敗,但上一組GOP結束后,便是新的GOP,新GOP的第一幀是I幀,可以獨立解碼。所以花屏后,過一會便自動恢復了。如果一直花屏,那么可能是視頻文件錯誤了。

下一章,我將分析m7s的代碼結構,開始正式的音視頻開發之旅。另外歡迎大家加入m7s微信群,共同探討進步,加群鏈接

參考文章及圖片來源 :

流媒體技術學習筆記之(五)碼流、碼率、采樣率、比特率、幀速率、分辨率、高清視頻的概念
I幀、P幀、B幀、GOP、IDR 和PTS, DTS之間的關系
音頻開發基礎
什么是音頻的采樣率?采樣率和音質有沒有關系?


免責聲明!

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



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