更新時間:2019-09-12 09:31:19 來源:動力節(jié)點 瀏覽3300次
假設(shè)公司現(xiàn)在在做汽車終端的平臺,需要了解交通部808,1078的終端協(xié)議.尤其是1078是關(guān)于音視頻的協(xié)議.故此開始入坑Java的音視頻解決方案.本系列文章涉及一個完整的音視頻服務(wù)搭建.
Java音視頻中間庫
這個肯定是站在巨人的肩上.我們會使用JAVACV來處理所有的視頻,音頻信息.
音視頻基礎(chǔ)知識
1、圖像像素格式與圖片封裝格式
圖像像素格式(簡稱像素格式),一般指的是沒有經(jīng)過編碼的按照原始像素排列的數(shù)據(jù)。舉個栗子,一個完整圖像的像素排列一般是這樣的(以4*4像素的rgb像素格式為例):
當然我們存儲的時候一般使用一維數(shù)組來存這些數(shù)據(jù),所以排列順序就變成這樣:rgbrgbrgbrgb.......以此類推。
圖片封裝格式指的我們?nèi)粘R姷降膒ng,jpg,bmp,gif等等圖片格式,其中bmp是無損格式,里面的數(shù)據(jù)格式就是圖片頭信息加上rgb排列的像素數(shù)據(jù),png/jpg這些都是有損壓縮格式,但是壓縮比還是很高的,為什么要壓縮下面會講到。(壓縮就是編碼[email protected])
2、圖像與視頻幀
圖像像素數(shù)據(jù)指的是yuv、rgb,rbga,bgr,gbra等圖像像素格式,經(jīng)過編碼后才是視頻幀。比如我們常見的h264編碼,編碼其實就是對圖像像素數(shù)據(jù)的壓縮,(以rgb為例,假如當前圖像像素尺寸為1920*1080,,每種顏色用一個字節(jié)表示,也就是說每個像素點有紅綠藍三色共3字節(jié),圖像有1920*1080個像素點,也就是說這張圖像大小為1920*1080*3字節(jié),顯然數(shù)據(jù)太大了),可以這樣理解,h264編碼本質(zhì)上就是一種圖像數(shù)據(jù)壓縮算法。(一個像素為啥占用3個字節(jié),因為紅綠藍三原色
視頻幀中常常提到的I幀,B幀和P幀指的是什么?i幀也叫關(guān)鍵幀,實際上就是一張完整的靜態(tài)圖像,而B幀和P幀只是用來記錄畫面的運動矢量等非圖像數(shù)據(jù),B/P幀都需要依賴i幀才能夠正確解碼出完整圖像(有損的圖像畫面)。在實際應(yīng)用中各種視頻源中很少使用B幀,原因是雖然使用大量B幀可以提高壓縮率,但也會消耗更多的硬件性能,所以大多數(shù)情況下的視頻源都以i幀(關(guān)鍵幀)和大量P幀為主。
另外在直播應(yīng)用中i幀間隔會很低,這樣能夠更快的顯示首幀畫面(B/P幀需要i幀才能夠解碼),但是這樣也增加了傳輸?shù)臄?shù)據(jù)量,因為一個i幀通常會很大。
補充:由于人類眼睛的特殊生理結(jié)構(gòu),如果所看畫面之幀率高于16的時候,就會認為是連貫的,此現(xiàn)象稱之為視覺停留。這也就是為什么電影膠片是一格一格拍攝出來,然后快速播放的。
一般來說,現(xiàn)在監(jiān)控的攝像頭是25幀。這個當然是工作需要了。實際上,用攝像頭錄制播放視頻時,只要幀率達到15,人眼就感覺是連續(xù)的。這個有什么用呢?相比25,15幀可以節(jié)省大量的編碼、解碼、刷屏工作。至于10-12,勉強連續(xù),只能說某些特殊場合下的選擇了。
幀數(shù)簡單地說,幀數(shù)就是在1秒鐘時間里傳輸?shù)膱D片的幀數(shù),也可以理解為圖形處理器每秒鐘能夠刷新幾次,通常用fps(FramesPerSecond)表示。每一幀都是靜止的圖象,快速連續(xù)地顯示幀便形成了運動的假象。高的幀率可以得到更流暢、更逼真的動畫。每秒鐘幀數(shù)(fps)愈多,所顯示的動作就會愈流暢。一般來說30fps是可以接受的,所以要避免動作不流暢的最低fps是30。除了30fps外,有些計算機視頻格式,例如AVI,每秒只能提供15幀。我們之所以能夠利用攝像頭來看到連續(xù)不斷的影像,是因為影像傳感器不斷攝取畫面并傳輸?shù)狡聊簧蟻恚攤鬏斔俣冗_到一定的水平時,人眼就無法辨別畫面之間的時間間隙,所以大家可以看到連續(xù)動態(tài)的畫面。
3、編碼與封裝
編碼上面已經(jīng)講了,是一種壓縮算法;那么封裝格式又是什么呢,封裝格式就是我們?nèi)粘R姷降囊曨l文件了,比如mp4,avi,mkv,flv等等等,按照每種封裝格式的規(guī)范把視頻幀和音頻按照一定順序存起來就成我們?nèi)粘?吹降囊曨l文件了,這些封裝格式一般都會包含一些頭/尾標識和一些視頻描述信息,這樣播放器讀取視頻文件的時候就知道該怎么播放這些視頻文件了(可以把封裝格式理解成收納箱,上面貼著小紙條說明里面放了哪些東西)。壓縮圖片格式也可以參考視頻編碼格式,原理都一樣,都是對圖像數(shù)據(jù)做有損/無損壓縮。
4、轉(zhuǎn)封裝與轉(zhuǎn)碼
什么是轉(zhuǎn)封裝?為什么轉(zhuǎn)封裝比轉(zhuǎn)碼消耗更少?為什么轉(zhuǎn)封裝無法改動視頻尺寸?
先舉個栗子:假設(shè)視頻格式(mp4,flv,avi等)是盒子,里面的視頻編碼數(shù)據(jù)(h264,hevc)是蘋果,我們把這個蘋果從盒子里取出來放到另一個盒子里,盒子是變了,蘋果是沒有變動的,因此視頻相關(guān)的尺寸數(shù)據(jù)是沒有改動的,這個就是轉(zhuǎn)封裝的概念。有了上面這個例子,我們可以把“轉(zhuǎn)碼”理解為:把這個盒子里的蘋果(hevc)拿出來削皮切塊后再加工成櫻桃(h264)后再裝到另一個盒子里,多了一步對蘋果(hevc)轉(zhuǎn)換為櫻桃(h264)的操作,自然比直接把蘋果拿到另一個盒子(轉(zhuǎn)封裝)要消耗更多機器性能
5、音/視頻源
音/視頻源可以是視頻文件、音頻文件,流媒體源,設(shè)備等等。
比如我們要看電腦或手機攝像頭視頻,就得采集設(shè)備的圖像數(shù)據(jù)(從源設(shè)備采集到的是像素數(shù)據(jù),一般是bgr或者rgb像素數(shù)據(jù))如果是某些廠商的商用攝像機,可能會支持rtsp/rtmp協(xié)議,要采集聲音呢,就得采集錄音/話筒設(shè)備里面的數(shù)據(jù)(一般是pcm采樣數(shù)據(jù))。
6、流媒體協(xié)議
rtsp協(xié)議棧,rtmp協(xié)議棧,hls,http-flv(理論上講這個flv不能算是流媒體協(xié)議,它只是個無限大的flv文件)等等。
例如rtmp,對編碼后的音視頻幀,要對其進行封裝成flv進行傳輸。(說到底這些協(xié)議原理上依然是建立在tcp/udp基礎(chǔ)上的應(yīng)用層傳輸協(xié)議。[email protected].)部標的1078協(xié)議要求終端設(shè)備的推流協(xié)議是參考的rtp協(xié)議.后面我們寫代碼去處理它.
7、流媒體服務(wù)
流媒體服務(wù)就是接受rtsp,rtmp的推流服務(wù)器,并且能接收拉流.后面我們會搭建一個rtmp的流服務(wù)器.
8、音頻聲道
音響中的幾聲道指的是音響有幾個輸出線路,常見的有2.0、2.1、及5.1聲道
1、2.0聲道指的是音響只有左右兩個聲道輸出聲音。
2、2.1指的是音響有左右聲道和低音三個聲道輸出。
3、5.1則指的是音響有左右聲道加左右環(huán)繞再加一個中置和一個低音輸出。
聲道(SoundChannel)是指聲音在錄制或播放時在不同空間位置采集或回放的相互獨立的音頻信號,所以聲道數(shù)也就是聲音錄制時的音源數(shù)量或回放時相應(yīng)的揚聲器數(shù)量。
聲卡所支持的聲道數(shù)是衡量聲卡檔次的重要指標之一,從單聲道到最新的環(huán)繞立體聲.
以上就是動力節(jié)點java培訓(xùn)機構(gòu)小編分享的“Java音視頻解決方案-音視頻基礎(chǔ)知識”的內(nèi)容,希望對大家有幫助,更多java最新資訊請繼續(xù)關(guān)注動力節(jié)點java培訓(xùn)機構(gòu)官網(wǎng),每天會有精彩內(nèi)容分與你。
相關(guān)閱讀