Android平台视频相关的多媒体技术理解笔记
? ? 做了幾年的視頻相關(guān)項目,一直沒有系統(tǒng)的對所涉技術(shù)進行整理,趁著最近有點事情,整理歸納一下。多媒體技術(shù)還是一個相當大而全的領(lǐng)域,我是做視頻的,只談一下視頻所涉的一些技術(shù)點的理解,平臺是基于Android的。
? ? 視頻所涉的多媒體技術(shù)也是非常龐大的,從哪入手呢,先來看一下圖吧:
? ? 上圖顯示了一個視頻從產(chǎn)生到展示到用戶面前所涉的各個環(huán)節(jié),封裝格式直接使用了當前主流的mp4,編解碼協(xié)議為H264/AAC。
? ? 按上圖所示的流程,逐步看一下都有那些技術(shù),并談一下自己對該方面技術(shù)的概括性理解。
? ? 一、拍攝
? ? 所有視頻都是拍出來的,即使是已有視頻,也是前人拍出來的,合成視頻,是用別人拍出來的視頻合成的。在Android平臺上,與拍攝有關(guān)的技術(shù)涉及攝像頭及音頻采集(一般是MIC)。Android系統(tǒng)提供了錄制的Api:MediaRecorder,以及攝像頭相關(guān)的Camera,與音頻錄制相關(guān)的api:AudioRecord。在我們的項目中,有兩種方式的錄制:其一是直接使用MediaRecorder直接錄制帶有音頻數(shù)據(jù)的視頻文件,這種做法的好處是實現(xiàn)簡單,在定制化不強的業(yè)務(wù)場景,直接使用該方法即可;其二是分開使用Camera錄制視頻,使用AudioRecorder錄制音頻,后期生成視頻文件時進行音視頻合成,這種實現(xiàn)方法比第一種要復雜很多,但可以獲得到單獨的音頻及視頻數(shù)據(jù),可以二次加工(比如加水印、人臉識別),當前我們項目所采用的錄制方式是第二種。
? ? 與拍攝有關(guān)的技術(shù)還包括:拍攝之前或拍攝中的攝像頭預覽,什么意思呢,沒有預覽,拍攝就是黑盒的,也是說設(shè)備是在錄制,但操作者看不到錄制過程,就像十幾年前的機械相機一樣。Android平臺,預覽可以使用GLSurfaceView來做,網(wǎng)上資料也是比較多的,感興趣的可以參考下。有一個注意點,攝像頭支持的尺寸及比例是有定值的,當前Android屏幕設(shè)備尺寸多種多樣,比如18.5:9的屏幕,其攝像頭不一定有這個比值,因此預覽的界面展示要有取舍,或者裁剪邊緣,或者要留一些黑邊。另外,輸出的視頻格式一般場景也不要太大,比如,用于短視頻的,最大取至720p即可,寬高比太大,意味著生成的視頻在編輯處理時給設(shè)備造成很大的壓力,當前大部分手機設(shè)備的處理性能并沒有想象中那么給力。
? ? 二、A/D轉(zhuǎn)換
? ? 拍攝過程在硬件及系統(tǒng)層面包含了采集、抽樣、量化。采集就是通過硬件設(shè)備獲取外界信息,其輸出為一些模似信號。模擬信號要進行處理前要進行抽樣,以音頻信號為例,一般采用8kHz抽樣即可得到可接受的人的語音信號(電話的抽樣頻率),通俗的說,就是每秒均分成8千次從模擬信號中獲取聲音的當時值。抽到的樣本要經(jīng)過量化,仍以音頻為例,抽樣得到的樣本,要用數(shù)值來表示,PCM算法中,使用8位二進制制表示該值,即有2^8=256個樣本值表述樣本的大小。PCM算法所得到的音頻文件碼率為:8kHz*8bit=64kbit/s,也就是說一秒鐘的該音頻,文件大小為8KB。此處提到一個碼率的概念,稍后會詳細討論一下。抽樣量化編碼合并稱為模數(shù)轉(zhuǎn)換(也叫A/D轉(zhuǎn)換)。視頻的A/D轉(zhuǎn)換轉(zhuǎn)為復雜,不做該方面工作的不需要對其間的算法進行深究,只要了解輸入及輸出即可。經(jīng)過A/D轉(zhuǎn)換后,視頻文件輸出格式為YUV或RGB(二者只是存儲格式有所差異,可相互轉(zhuǎn)換),音頻為PCM格式文件。
? ? 三、音視頻編碼
? ? 為什么要進行編碼呢?一個字概括就是;大。量化后的文件格式非常的大,直接存儲耗費大量的存儲空間,在網(wǎng)絡(luò)中傳輸更是不可想象的。我們可以折算一下,以RGB888格式的720*1080的視頻為例,一幀圖像的大小為:3*8*720*1080=18.7Mb,每秒30幀的話30*18.7Mb=560Mbit=70MB,一個兩小時的視頻70MB*60*120=500G,可以看出,的確是太大了。視頻的編碼格式非常的多,在Android平臺上,目前主流為H264(MPEG公司的),音頻為AAC,相對于視頻文件,音頻文件較小,因此編碼技術(shù)差點也沒關(guān)系,最近幾年基本沒什么新的音頻編碼協(xié)議出現(xiàn)。有關(guān)視頻編碼格式的具體實現(xiàn)是一個非常大的領(lǐng)域,本文不再展開了,感興趣的同學可以看一下相關(guān)文檔,推薦雷神所寫的:https://blog.csdn.net/leixiaohua1020/article/details/28114081,之后為加深理解,我也準備寫一篇學習筆記。
? ? 四、封裝格式
? ? 經(jīng)過編碼之后的視頻及音頻文件大小達到可接受的范圍,下一步要進行格式封裝。以當前最主流的封裝格式為mp4為例說明下。先簡單說一下什么是mp4,有幾種:首先:mp4是一種文件格式,可以是視頻,也可以是音頻,以.mp4為后綴; 其次:mp4往往來替代性的描述MPEG-4,MPEG-4是一種多媒體規(guī)范,可以是音視頻,也可以表示別的,只要滿足該規(guī)范的定義即可;第三:mp4也被用于口頭說視頻編碼算法,即好多人口中所說的mp4編碼算法,這種說法其實相當?shù)牟粶蚀_,mp4只是一個容器,單說mp4不能說明任何的編解碼規(guī)則,里面的視頻(音頻同理)可以采用各種不同的壓縮編碼算法,當前用的最多的是H264(視頻)/AAC(音頻)這個算法。??
? ? mp4文件的格式還是相當復雜的,想要了解內(nèi)部原理的可以看一下官方文檔,希望簡單了解一下的可以看一下這篇文章:https://www.cnblogs.com/ranson7zop/p/7889272.html,其實不作音視頻編解碼的同學可以不用理解這么深入,只需要知道一些基本結(jié)構(gòu):mp4是由多個Box組成的,每個Box含有播放相關(guān)的各種信息,對于視頻來講,最重要的Box是(1)moov--存儲著該視頻的各種信息,包括但不限于:編碼算法信息、寬高、碼率、幀率、時長、各種分塊時長對應(yīng)關(guān)系等。(2)mdat--存儲著視頻幀數(shù)據(jù)和音頻通道數(shù)據(jù)。經(jīng)過格式封裝之后,音視頻合并成了一個文件,可以直接放入本地等待播放。也可以是上傳至云端,供別的用戶在線播放或下載播放。
? ? 五、播放
? ? 簡單來講,播放的過程就是視頻生成過程的一個逆向。
1.云端視頻先要解協(xié)議,去除網(wǎng)絡(luò)協(xié)議層
2.然后是解封裝,拿掉格式,解出mp4頭,得到各幀的數(shù)據(jù)
3.對應(yīng)于編碼格式,執(zhí)行解碼程序,比如視頻通道使用H264解碼,音頻通道使用AAC解碼
4.解碼之后得到了幀數(shù)據(jù)及音頻數(shù)據(jù),視頻幀數(shù)據(jù)的播放在Android上是由OpenGL實現(xiàn)的,音頻的不太了解
5.最終的數(shù)據(jù)被送入顯卡驅(qū)動及聲卡驅(qū)動中,由硬件輸出給用戶
? ? 在Android中,最簡單的播放實現(xiàn)即調(diào)用系統(tǒng)所提供的MediaPlayer,上述五個過程均由系統(tǒng)封裝實現(xiàn)了。
? ? 六、一些特殊處理
? ? 如果有功能需要單獨定制,比如在我們的項目中,要在視頻幀中加入水印,這就需要以下過程:
1.分離音視頻通道,系統(tǒng)的接口為:MediaExtractor
2.視頻解碼,系統(tǒng)接口為MediaCodec,輸出視頻內(nèi)容至GLSurfaceView
3.使用OpenGL繪制水印
4.獲取到GLSurfaceView的數(shù)據(jù)然后進行編碼,系統(tǒng)接口為MediaCodec
5.合并音視頻通道,系統(tǒng)接口為MediaMuxer
? ? 上述的編解碼過程為硬編碼過程,在部分機型上有適配問題,還有一種編碼方式為FFMPEG,使用軟編碼方式,缺點是要編碼效率低,耗時長,但適配性好。
? ? 本文中從大面上總結(jié)一下與視頻相關(guān)的多媒體技術(shù),主要是疏理其脈絡(luò),理清其骨架,對內(nèi)部的技術(shù)實現(xiàn)只是簡單提及,對于上層app開發(fā)者來講,有這些也基本夠了,對于需要定制視頻功能的開發(fā)者來講,要針對具體模塊重點突破。多媒體技術(shù)范圍太大,要做到面面俱到,基本是不可能的,當前技術(shù)的行業(yè)分工精細,每個人基本是負責一塊,要做到自身所做某塊的融匯貫通,比每一塊都會一點更為重要。
總結(jié)
以上是生活随笔為你收集整理的Android平台视频相关的多媒体技术理解笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3.7V升5V2A兼容进口MP2359/
- 下一篇: 《大数据导论》之数据生命周期和数据使用