JAVA音視頻解決方案----視頻基礎知識

序言

公司現在在做汽車終端的平臺,需要了解交通部808,1078的終端協議.  尤其是1078是關於音視頻的協議.故此開始入坑java的音視頻解決方案.本系列文章涉及一個完整的音視頻服務搭建.大概整理這麼多也是站在大家的肩膀上弄出來的.如有問題可以聯繫[email protected]

 

Java音視頻中間庫

這個肯定是站在巨人的肩上.我們會使用JAVACV來處理所有的視頻,音頻信息.  

 

音視頻基礎知識

1、圖像像素格式與圖片封裝格式

       圖像像素格式(簡稱像素格式),一般指的是沒有經過編碼的按照原始像素排列的數據。舉個栗子,一個完整圖像的像素排列一般是這樣的(以4*4像素的rgb像素格式爲例):

rgbrgbrgbrgb

rgbrgbrgbrgb

rgbrgbrgbrgb

rgbrgbrgbrgb

       當然我們存儲的時候一般使用一維數組來存這些數據,所以排列順序就變成這樣:rgbrgbrgbrgb.......以此類推。

       圖片封裝格式指的我們日常見到的png,jpg,bmp,gif等等圖片格式,其中bmp是無損格式,裏面的數據格式就是圖片頭信息加上rgb排列的像素數據,png/jpg這些都是有損壓縮格式,但是壓縮比還是很高的,爲什麼要壓縮下面會講到。(壓縮就是編碼[email protected])


 

2、圖像與視頻幀

       圖像像素數據指的是yuv、rgb,rbga,bgr,gbra等圖像像素格式,經過編碼後纔是視頻幀。比如我們常見的h264編碼,編碼其實就是對圖像像素數據的壓縮,(以rgb爲例,假如當前圖像像素尺寸爲1920*1080,,每種顏色用一個字節表示,也就是說每個像素點有紅綠藍三色共3字節,圖像有1920*1080個像素點,也就是說這張圖像大小爲1920*1080*3字節,顯然數據太大了),可以這樣理解,h264編碼本質上就是一種圖像數據壓縮算法。(一個像素爲啥佔用3個字節,因爲紅綠藍三原色[email protected])

       視頻幀中常常提到的I幀,B幀和P幀指的是什麼?i幀也叫關鍵幀,實際上就是一張完整的靜態圖像,而B幀和P幀只是用來記錄畫面的運動矢量等非圖像數據,B/P幀都需要依賴i幀才能夠正確解碼出完整圖像(有損的圖像畫面)。在實際應用中各種視頻源中很少使用B幀,原因是雖然使用大量B幀可以提高壓縮率,但也會消耗更多的硬件性能,所以大多數情況下的視頻源都以i幀(關鍵幀)和大量P幀爲主。

       另外在直播應用中i幀間隔會很低,這樣能夠更快的顯示首幀畫面(B/P幀需要i幀才能夠解碼),但是這樣也增加了傳輸的數據量,因爲一個i幀通常會很大。

       補充:由於人類眼睛的特殊生理結構,如果所看畫面之幀率高於16的時候,就會認爲是連貫的,此現象稱之爲視覺停留。這也就是爲什麼電影膠片是一格一格拍攝出來,然後快速播放的。

       一般來說,現在監控的攝像頭是25幀。這個當然是工作需要了。實際上,用攝像頭錄製播放視頻時,只要幀率達到15,人眼就感覺是連續的。這個有什麼用呢?相比25,15幀可以節省大量的編碼、解碼、刷屏工作。至於10-12,勉強連續,只能說某些特殊場合下的選擇了。

       幀數簡單地說,幀數就是在1秒鐘時間裏傳輸的圖片的幀數,也可以理解爲圖形處理器每秒鐘能夠刷新幾次,通常用fps(Frames Per Second)表示。每一幀都是靜止的圖象,快速連續地顯示幀便形成了運動的假象。高的幀率可以得到更流暢、更逼真的動畫。每秒鐘幀數 (fps) 愈多,所顯示的動作就會愈流暢。一般來說30fps是可以接受的,所以要避免動作不流暢的最低fps是30。除了30fps外,有些計算機視頻格式,例如AVI,每秒只能提供15幀。我們之所以能夠利用攝像頭來看到連續不斷的影像,是因爲影像傳感器不斷攝取畫面並傳輸到屏幕上來,當傳輸速度達到一定的水平時,人眼就無法辨別畫面之間的時間間隙,所以大家可以看到連續動態的畫面。

 

3、編碼與封裝

     編碼上面已經講了,是一種壓縮算法;那麼封裝格式又是什麼呢,封裝格式就是我們日常見到的視頻文件了,比如mp4,avi,mkv,flv等等等,按照每種封裝格式的規範把視頻幀和音頻按照一定順序存起來就成我們日常看到的視頻文件了,這些封裝格式一般都會包含一些頭/尾標識和一些視頻描述信息,這樣播放器讀取視頻文件的時候就知道該怎麼播放這些視頻文件了(可以把封裝格式理解成收納箱,上面貼着小紙條說明裏面放了哪些東西)。壓縮圖片格式也可以參考視頻編碼格式,原理都一樣,都是對圖像數據做有損/無損壓縮。
 

4、轉封裝與轉碼

       什麼是轉封裝?爲什麼轉封裝比轉碼消耗更少?爲什麼轉封裝無法改動視頻尺寸?

       先舉個栗子:假設視頻格式(mp4,flv,avi等)是盒子,裏面的視頻編碼數據(h264,hevc)是蘋果,我們把這個蘋果從盒子裏取出來放到另一個盒子裏,盒子是變了,蘋果是沒有變動的,因此視頻相關的尺寸數據是沒有改動的,這個就是轉封裝的概念。有了上面這個例子,我們可以把“轉碼”理解爲:把這個盒子裏的蘋果(hevc)拿出來削皮切塊後再加工成櫻桃(h264)後再裝到另一個盒子裏,多了一步對蘋果(hevc)轉換爲櫻桃(h264)的操作,自然比直接把蘋果拿到另一個盒子(轉封裝)要消耗更多機器性能

5、音/視頻源

      音/視頻源可以是視頻文件、音頻文件,流媒體源,設備等等。

       比如我們要看電腦或手機攝像頭視頻,就得采集設備的圖像數據(從源設備採集到的是像素數據,一般是bgr或者rgb像素數據)如果是某些廠商的商用攝像機,可能會支持rtsp/rtmp協議,要採集聲音呢,就得采集錄音/話筒設備裏面的數據(一般是pcm採樣數據)。
 

6、流媒體協議

rtsp協議棧,rtmp協議棧,hls,http-flv(理論上講這個flv不能算是流媒體協議,它只是個無限大的flv文件)等等。

例如rtmp,對編碼後的音視頻幀,要對其進行封裝成flv進行傳輸。(說到底這些協議原理上依然是建立在tcp/udp基礎上的應用層傳輸協議。[email protected].)  部標的1078協議要求終端設備的推流協議是參考的rtp協議.後面我們寫代碼去處理它.

 

7、流媒體服務

 流媒體服務就是接受rtsp,rtmp的推流服務器,並且能接收拉流.後面我們會搭建一個rtmp的流服務器.

 

8、音頻聲道

音響中的幾聲道指的是音響有幾個輸出線路,常見的有2.0、2.1、及5.1聲道
  1、2.0聲道指的是音響只有左右兩個聲道輸出聲音。
  2、2.1指的是音響有左右聲道和低音三個聲道輸出。
  3、5.1則指的是音響有左右聲道加左右環繞再加一箇中置和一個低音輸出。
  聲道(Sound Channel) 是指聲音在錄製或播放時在不同空間位置採集或回放的相互獨立的音頻信號,所以聲道數也就是聲音錄製時的音源數量或回放時相應的揚聲器數量。
  聲卡所支持的聲道數是衡量聲卡檔次的重要指標之一,從單聲道到最新的環繞立體聲.

 

9、碼流率

碼流(Data Rate)是指視頻文件在單位時間內使用的數據流量,也叫碼率,是視頻編碼中畫面質量控制中最重要的部分。同樣分辨率下,視頻文件的碼流越大,壓縮比就越小,畫面質量就越好。

 

10、分辨率

       不同的分辨率的肯定存儲容量是不一樣的.同理網絡傳輸也是有影響的.

       分辨率越大越耗流量,因此流量排行:極速<流暢<高清<超清720P<1080P藍光。

      如下的P表示是一種視頻顯示格式,外語字母P意爲逐行掃描(Progressive scanning


      144p    (192×144,20幀/秒),4:3,錄製一分鐘大約1MB;
      240p    (320×240,20幀/秒),4:3,錄製一分鐘大約3MB;
      360p    (480×360,20幀/秒) ,4:3,錄製一分鐘大約7MB;
      480p    (640×480,20幀/秒),4:3,錄製一分鐘大約12MB;
      720p    (1280×720,30幀/秒)  , 16:9,錄製一分鐘大約35MB;
      1080p  (1920×1080,30幀/秒) ,16:9 , 錄製一分鐘大約80MB。
      2K (1152 × 2048)
      4K(2304 × 4096)

 

      如下是一個視頻的分界線.用於幫助你定位你的視頻應該設置成什麼樣的分辨率與碼率.

        流暢:碼率---256kbps,分辨率---480*360,俗稱360P

        高清:碼率---512kbps,分辨率---640*480,俗稱480P

        超清:碼率---1024kbps,分辨率---1280*720,俗稱720P

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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