201904144 視音頻知識筆記

前言

工作中接觸到了一點流媒體的知識,rtsp協議、rtsp流、rtmp、hls、拉流、推流、流媒體服務器、ffmpeg等等東西看的很暈很暈。感覺是基礎知識還沒打好吧。因此寫下這篇筆記。
這篇文章更多的是在講視音頻的東西,這篇文章只是做些摘抄以及自己的一些理解,主要內容是參考了下面的這兩篇文章:
https://blog.csdn.net/qq_36688143/article/details/79162121
https://blog.csdn.net/qq_36688143/article/details/79162121

正文

先來看一張視頻播放器的播放本地文件的原理圖:
在這裏插入圖片描述

視音頻技術主要包含以下幾點:

  1. 封裝技術;
  2. 視頻壓縮編碼技術;
  3. 音頻壓縮編碼技術;

封裝技術

封裝技術即指把音頻壓縮數據和視頻壓縮數據以一定的格式要求整合成一個文件如mp4、flv等,以及把一個mp4、flv或其他的彙總文件分解成音頻壓縮文件和視頻壓縮文件。

封裝數據格式

其中,這裏說的彙總文件,具體如mp4、flv、mkv等,它們有一個專業名稱,就是上圖中的封裝格式數據。

視頻壓縮數據、視頻編碼數據、視頻碼流

視頻壓縮數據、視頻編碼數據、視頻碼流,都是同一個意思(下文統一用視頻編碼數據指代),都是表示通過封裝格式數據分解得到的視頻流。這裏要注意的是,這個並不是在定義視頻編碼數據,而是在告訴我們視頻編碼數據和封裝格式數據的關係。因爲可能會有人會理解成先有了封裝格式數據,纔有視頻編碼數據,但並不是這樣。實際上是由視頻編碼數據和音頻編碼數據這兩個原材料,以一定的方式存儲在一起才成了封裝格式數據。
那視頻編碼數據是怎麼來的呢?這裏先記着,視頻編碼數據是對視頻像素數據壓縮得到的。

音頻壓縮數據、音頻編碼數據、音頻碼流

音頻壓縮數據、音頻編碼數據、音頻碼流,也一樣表示的是通過封裝格式數據分解得到的音頻流。
同上,音頻編碼數據是由音頻採樣數據壓縮得到的。

視頻像素數據

什麼是影片?其實就是一組(很多張)圖片,時間間隔很小的連續展示出來,人們就覺得畫面中的人物在動,這就是影片。那電影的實質就是N多張圖片的集合。這些原始的圖片,也成爲顏色數據,也就是視頻原始數據,也稱爲視頻像素數據,如YUV420P,RGB等等。它保存了屏幕上每一個像素點的像素值

音頻採樣數據

同上,音頻採樣數據就是音頻原始數據,即沒有被壓縮過的音頻數據。它保存了音頻中每個採樣點的值。

編碼、解碼

前面提到了這麼一句話:視頻編碼數據是對視頻像素數據壓縮得到的。
那麼有這麼兩個問題:爲什麼要壓縮?怎麼壓縮?
接下來再來回答這兩個問題。
之所以要對視頻像素數據即視頻原始數據進行壓縮,是因爲視頻像素數據體積很大,一般情況下一小時高清視頻的RGB24格式的數據體積爲:
360025192010803=559.9GB(PS:這裏假定幀率爲25HZ,取樣精度8bit)
因此要對視頻編碼數據進行壓縮。
至於怎麼壓縮,其實壓縮指的就是編碼,即通過採用一系列的算法來減少數據的容量,如視頻編碼中的IPB技術。
至於音頻中,也是如此。

壓縮編碼標準

視頻壓縮中,有這麼幾種工業標準:H.264,MPEG2,VC-1,最常見的就是H.264。要理解的是,H.264僅僅是一個編碼標準,而不是具體的編碼器。將視頻像素數據壓縮爲視頻編碼數據的,是具體的編碼器。音頻壓縮也是一個道理。

FFmpeg

學習視音頻技術,還有一個很強大的工具沒有提到,那就是ffmpeg,上面說的視頻播放器的原理,其實現就是就是通過ffmpeg。

FFmpeg是一套可以用來記錄、轉換數字音頻、視頻,並能將其轉化爲流的開源計算機程序。

它包括了領先的音/視頻編碼庫libavcodec等:

  1. libavformat:用於各種音視頻封裝格式的生成和解析,包括獲取解碼所需信息以生成解碼上下文結構和讀取音視頻幀等功能;
  2. libavcodec:用於各種類型聲音/圖像編解碼;
  3. libavutil:包含一些公共的工具函數;
  4. libswscale:用於視頻場景比例縮放、色彩映射轉換;
  5. libpostproc:用於後期效果處理;
  6. ffmpeg:該項目提供的一個工具,可用於格式轉換、解碼或電視卡即時編碼等;
  7. ffsever:一個 HTTP多媒體即時廣播串流服務器;
  8. ffplay:是一個簡單的播放器,使用ffmpeg庫解析和解碼,通過SDL顯示;

即ffmpeg可以實現封裝、解封裝、編碼、解碼的功能。

最後

視音頻知識和流媒體知識,是有很多交集的。上面提到的基礎概念,都很有必要去記住並理解,ffmpeg在流媒體中也會用到,如將rtsp流轉成rtmp流,如降低畫質、消聲等等。
之所以想做這篇筆記,是因爲我覺得要去使用一個東西,應該先要去理解它的一些基礎知識,否則一味的參考網上的教程去實現轉碼、推流等操作,雖然實現了,但是自己卻由於不理解而無法消化,過一段時間就忘了很多,這樣感覺不對。
於是就做了這個筆記,打好基礎知識!!

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