Android -- 音視頻基礎(chǔ)知識

作者:開發(fā)的貓
原文鏈接:mp.weixin.qq.com/s/NZCd0i3L2…
【音視頻開發(fā)全系列教程】視頻教程:https://www.bilibili.com/video/BV1fb4y1d7JU?spm_id_from=333.999.0.0

一台谢、視頻是什么卵洗?

視頻幀

幀,是視頻的一個基本概念最域,表示一張畫面,如上面的翻頁動畫書中的一頁渐行,就是一幀罩句。一個視頻就是由許許多多幀組成的。

幀率

幀率病线,即單位時間內(nèi)幀的數(shù)量,單位為:幀/秒 或fps(frames per second)鲤嫡。一秒內(nèi)包含多少張圖片送挑,圖片越多,畫面越順滑泛范,過渡越自然让虐。 幀率的一般以下幾個典型值:

24/25 fps:1秒 24/25 幀,一般的電影幀率罢荡。

30/60 fps:1秒 30/60 幀赡突,游戲的幀率,30幀可以接受区赵,60幀會感覺更加流暢逼真惭缰。

85 fps以上人眼基本無法察覺出來了,所以更高的幀率在視頻里沒有太大意義笼才。

色彩空間

這里我們只講常用到的兩種色彩空間漱受。

  • RGB

RGB的顏色模式應(yīng)該是我們最熟悉的一種,在現(xiàn)在的電子設(shè)備中應(yīng)用廣泛骡送。通過R G B三種基礎(chǔ)色昂羡,可以混合出所有的顏色。

  • YUV

這里著重講一下YUV摔踱,這種色彩空間并不是我們熟悉的虐先。這是一種亮度與色度分離的色彩格式。

早期的電視都是黑白的派敷,即只有亮度值蛹批,即Y。有了彩色電視以后篮愉,加入了UV兩種色度腐芍,形成現(xiàn)在的YUV,也叫YCbCr试躏。

Y:亮度猪勇,就是灰度值。除了表示亮度信號外冗酿,還含有較多的綠色通道量埠对。

U:藍(lán)色通道與亮度的差值络断。

V:紅色通道與亮度的差值裁替。

采用YUV有什么優(yōu)勢呢项玛?

人眼對亮度敏感,對色度不敏感弱判,因此減少部分UV的數(shù)據(jù)量襟沮,人眼卻無法感知出來,這樣可以通過壓縮UV的分辨率昌腰,在不影響觀感的前提下开伏,減小視頻的體積。

RGB和YUV的換算
Y = 0.299R + 0.587G + 0.114B
U = -0.147R - 0.289G + 0.436B
V = 0.615R - 0.515G - 0.100B
——————————————————
R = Y + 1.14V
G = Y - 0.39U - 0.58V
B = Y + 2.03U

二遭商、音頻是什么固灵?

音頻數(shù)據(jù)的承載方式最常用的是脈沖編碼調(diào)制,即PCM劫流。

在自然界中巫玻,聲音是連續(xù)不斷的,是一種模擬信號祠汇,那怎樣才能把聲音保存下來呢仍秤?那就是把聲音數(shù)字化,即轉(zhuǎn)換為數(shù)字信號可很。

我們知道聲音是一種波诗力,有自己的振幅和頻率,那么要保存聲音我抠,就要保存聲音在各個時間點上的振幅苇本。

而數(shù)字信號并不能連續(xù)保存所有時間點的振幅,事實上菜拓,并不需要保存連續(xù)的信號瓣窄,就可以還原到人耳可接受的聲音。

根據(jù)奈奎斯特采樣定理:為了不失真地恢復(fù)模擬信號尘惧,采樣頻率應(yīng)該不小于模擬信號頻譜中最高頻率的2倍康栈。

根據(jù)以上分析,PCM的采集步驟分為以下步驟:

模擬信號->采樣->量化->編碼->數(shù)字信號

采樣率和采樣位數(shù)

采樣率喷橙,即采樣的頻率啥么。

上面提到,采樣率要大于原聲波頻率的2倍贰逾,人耳能聽到的最高頻率為20kHz悬荣,所以為了滿足人耳的聽覺要求,采樣率至少為40kHz疙剑,通常為44.1kHz氯迂,更高的通常為48kHz践叠。

采樣位數(shù),涉及到上面提到的振幅量化嚼蚀。波形振幅在模擬信號上也是連續(xù)的樣本值禁灼,而在數(shù)字信號中,信號一般是不連續(xù)的轿曙,所以模擬信號量化以后弄捕,只能取一個近似的整數(shù)值,為了記錄這些振幅值导帝,采樣器會采用一個固定的位數(shù)來記錄這些振幅值守谓,通常有8位、16位您单、32位斋荞。

位數(shù) 最小值 最大值
8 0 255
16 -32768 32767
32 -2147483648 2147483647

位數(shù)越多,記錄的值越準(zhǔn)確虐秦,還原度越高平酿。

最后就是編碼了。由于數(shù)字信號是由0羡疗,1組成的染服,因此,需要將幅度值轉(zhuǎn)換為一系列0和1進(jìn)行存儲叨恨,也就是編碼柳刮,最后得到的數(shù)據(jù)就是數(shù)字信號:一串0和1組成的數(shù)據(jù)。

整個過程如下:

聲道數(shù)

聲道數(shù)痒钝,是指支持能不同發(fā)聲(注意是不同聲音)的音響的個數(shù)秉颗。 單聲道:1個聲道
雙聲道:2個聲道
立體聲道:默認(rèn)為2個聲道
立體聲道(4聲道):4個聲道

碼率

碼率,是指一個數(shù)據(jù)流中每秒鐘能通過的信息量送矩,單位bps(bit per second)

碼率 = 采樣率 * 采樣位數(shù) * 聲道數(shù)

三蚕甥、為什么要編碼

這里的編碼和上面音頻中提到的編碼不是同個概念,而是指壓縮編碼栋荸。

我們知道菇怀,在計算機(jī)的世界中,一切都是0和1組成的晌块,音頻和視頻數(shù)據(jù)也不例外爱沟。由于音視頻的數(shù)據(jù)量龐大,如果按照裸流數(shù)據(jù)存儲的話匆背,那將需要耗費非常大的存儲空間呼伸,也不利于傳送。而音視頻中钝尸,其實包含了大量0和1的重復(fù)數(shù)據(jù)括享,因此可以通過一定的算法來壓縮這些0和1的數(shù)據(jù)搂根。

特別在視頻中,由于畫面是逐漸過渡的铃辖,因此整個視頻中剩愧,包含了大量畫面/像素的重復(fù),這正好提供了非常大的壓縮空間澳叉。

因此隙咸,編碼可以大大減小音視頻數(shù)據(jù)的大小沐悦,讓音視頻更容易存儲和傳送成洗。

四、視頻編碼

視頻編碼格式

視頻編碼格式有很多藏否,比如H26x系列和MPEG系列的編碼瓶殃,這些編碼格式都是為了適應(yīng)時代發(fā)展而出現(xiàn)的。

其中副签,H26x(1/2/3/4/5)系列由ITU(International Telecommunication Union)國際電傳視訊聯(lián)盟主導(dǎo)

MPEG(1/2/3/4)系列由MPEG(Moving Picture Experts Group, ISO旗下的組織)主導(dǎo)遥椿。

當(dāng)然,他們也有聯(lián)合制定的編碼標(biāo)準(zhǔn)淆储,那就是現(xiàn)在主流的編碼格式H264冠场,當(dāng)然還有下一代更先進(jìn)的壓縮編碼標(biāo)準(zhǔn)H265。

H264編碼簡介

H264是目前最主流的視頻編碼標(biāo)準(zhǔn)本砰,所以我們后續(xù)的文章中主要以該編碼格式為基準(zhǔn)碴裙。

H264由ITU和MPEG共同定制,屬于MPEG-4第十部分內(nèi)容点额。

由于H264編碼算法十分復(fù)雜舔株,不是一時半刻能夠講清楚的,也不在本人目前的能力范圍內(nèi)还棱,所以這里只簡單介紹在日常開發(fā)中需要了解到的概念载慈。實際上,視頻的編碼和解碼部分通常由框架(如Android硬解/FFmpeg)完成珍手,一般的開發(fā)者并不會接觸到办铡。

  • 視頻幀

我們已經(jīng)知道,視頻是由一幀一幀畫面構(gòu)成的琳要,但是在視頻的數(shù)據(jù)中寡具,并不是真正按照一幀一幀原始數(shù)據(jù)保存下來的(如果這樣,壓縮編碼就沒有意義了)焙蹭。

H264會根據(jù)一段時間內(nèi)晒杈,畫面的變化情況,選取一幀畫面作為完整編碼孔厉,下一幀只記錄與上一幀完整數(shù)據(jù)的差別拯钻,是一個動態(tài)壓縮的過程帖努。

在H264中,三種類型的幀數(shù)據(jù)分別為

I幀:幀內(nèi)編碼幀粪般。就是一個完整幀拼余。

P幀:前向預(yù)測編碼幀。是一個非完整幀亩歹,通過參考前面的I幀或P幀生成匙监。

B幀:雙向預(yù)測內(nèi)插編碼幀。參考前后圖像幀編碼生成小作。B幀依賴其前最近的一個I幀或P幀及其后最近的一個P幀亭姥。

  • 圖像組:GOP和關(guān)鍵幀:IDR

全稱:Group of picture。指一組變化不大的視頻幀顾稀。

GOP的第一幀成為關(guān)鍵幀:IDR

IDR都是I幀达罗,可以防止一幀解碼出錯,導(dǎo)致后面所有幀解碼出錯的問題静秆。當(dāng)解碼器在解碼到IDR的時候粮揉,會將之前的參考幀清空,重新開始一個新的序列抚笔,這樣扶认,即便前面一幀解碼出現(xiàn)重大錯誤,也不會蔓延到后面的數(shù)據(jù)中殊橙。

注:關(guān)鍵幀都是I幀辐宾,但是I幀不一定是關(guān)鍵幀

  • DTS與PTS

DTS全稱:Decoding Time Stamp。標(biāo)示讀入內(nèi)存中數(shù)據(jù)流在什么時候開始送入解碼器中進(jìn)行解碼蛀柴。也就是解碼順序的時間戳螃概。

PTS全稱:Presentation Time Stamp。用于標(biāo)示解碼后的視頻幀什么時候被顯示出來鸽疾。

在沒有B幀的情況下吊洼,DTS和PTS的輸出順序是一樣的,一旦存在B幀制肮,PTS和DTS則會不同冒窍。

  • 幀的色彩空間

前面我們介紹了RGB和YUV兩種圖像色彩空間。H264采用的是YUV豺鼻。

YUV存儲方式分為兩大類:planar 和 packed综液。

planar:先存儲所有Y,緊接著存儲所有U儒飒,最后是V;
packed:每個像素點的 Y、U埠戳、V 連續(xù)交叉存儲蕉扮。

planar如下:

packed如下:

不過pakced存儲方式已經(jīng)非常少用整胃,大部分視頻都是采用planar存儲方式。

上面說過屁使,由于人眼對色度敏感度低奔则,所以可以通過省略一些色度信息蛮寂,即亮度共用一些色度信息,進(jìn)而節(jié)省存儲空間应狱。因此共郭,planar又區(qū)分了以下幾種格式:YUV444疾呻、 YUV422写半、YUV420叠蝇。

YUV 4:4:4采樣,每一個Y對應(yīng)一組UV分量悔捶。

YUV 4:2:2采樣蜕该,每兩個Y共用一組UV分量。

YUV 4:2:0采樣馋缅,每四個Y共用一組UV分量绢淀。

其中,最常用的就是YUV420覆履。

  • YUV420格式存儲方式

YUV420屬于planar存儲方式,但是又分兩種類型:

YUV420P:三平面存儲怪嫌。數(shù)據(jù)組成為YYYYYYYYUUVV(如I420)或YYYYYYYYVVUU(如YV12)柳沙。

YUV420SP:兩平面存儲。分為兩種類型YYYYYYYYUVUV(如NV12)或YYYYYYYYVUVU(如NV21)

關(guān)于H264的編碼算法和數(shù)據(jù)結(jié)構(gòu)噪径,涉及的知識和篇幅很多(如網(wǎng)絡(luò)抽象層NAL数初、SPS、PPS)车摄,本文不再深入細(xì)說仑鸥,網(wǎng)上也有比較多的教程講解,有興趣可以自行深入學(xué)習(xí)意狠。

五疮胖、音頻編碼

音頻編碼格式

原始的PCM音頻數(shù)據(jù)也是非常大的數(shù)據(jù)量,因此也需要對其進(jìn)行壓縮編碼院塞。

和視頻編碼一樣性昭,音頻也有許多的編碼格式,如:WAV创泄、MP3括蝠、WMA、APE搁拙、FLAC等等,音樂發(fā)燒友應(yīng)該對這些格式非常熟悉箕速,特別是后兩種無損壓縮格式盐茎。

但是,我們今天的主角不是他們字柠,而是另外一個叫AAC的壓縮格式窑业。

AAC是新一代的音頻有損壓縮技術(shù),一種高壓縮比的音頻壓縮算法鲤氢。在MP4視頻中的音頻數(shù)據(jù)西潘,大多數(shù)時候都是采用AAC壓縮格式。

AAC編碼簡介

AAC格式主要分為兩種:ADIF揍庄、ADTS东抹。

ADIF:Audio Data Interchange Format沃测。音頻數(shù)據(jù)交換格式。這種格式的特征是可以確定的找到這個音頻數(shù)據(jù)的開始馏谨,不需進(jìn)行在音頻數(shù)據(jù)流中間開始的解碼附迷,即它的解碼必須在明確定義的開始處進(jìn)行。這種格式常用在磁盤文件中喊儡。

ADTS:Audio Data Transport Stream稻据。音頻數(shù)據(jù)傳輸流。這種格式的特征是它是一個有同步字的比特流匆赃,解碼可以在這個流中任何位置開始。它的特征類似于mp3數(shù)據(jù)流格式低淡。

ADTS可以在任意幀解碼瞬项,它每一幀都有頭信息。ADIF只有一個統(tǒng)一的頭纸颜,所以必須得到所有的數(shù)據(jù)后解碼绎橘。且這兩種的header的格式也是不同的称鳞,目前一般編碼后的都是ADTS格式的音頻流。

ADIF數(shù)據(jù)格式:

header raw_data

ADTS 一幀 數(shù)據(jù)格式(中間部分狂票,左右省略號為前后數(shù)據(jù)幀):

AAC內(nèi)部結(jié)構(gòu)也不再贅述熙暴,可以參考AAC 文件解析及解碼流程

六、音視頻容器

細(xì)心的讀者可能已經(jīng)發(fā)現(xiàn)掂器,前面我們介紹的各種音視頻的編碼格式俱箱,沒有一種是我們平時使用到的視頻格式狞谱,比如:mp4、rmvb孵睬、avi与斤、mkv荚恶、mov...

沒錯磷支,這些我們熟悉的視頻格式,其實是包裹了音視頻編碼數(shù)據(jù)的容器廓潜,用來把以特定編碼標(biāo)準(zhǔn)編碼的視頻流和音頻流混在一起善榛,成為一個文件移盆。

例如:mp4支持H264、H265等視頻編碼和AAC据途、MP3等音頻編碼叙甸。

mp4是目前最流行的視頻格式,在移動端熔萧,一般將視頻封裝為mp4格式僚祷。

七、硬解碼和軟解碼

硬解和軟解的區(qū)別

我們在一些播放器中會看到晌杰,有硬解碼和軟解碼兩種播放形式給我們選擇筷弦,但是我們大部分時候并不能感覺出他們的區(qū)別抑诸,對于普通用戶來說蜕乡,只要能播放就行了。

那么他們內(nèi)部究竟有什么區(qū)別呢号醉?

在手機(jī)或者PC上,都會有CPU铅碍、GPU或者解碼器等硬件线椰。通常,我們的計算都是在CPU上進(jìn)行的烦绳,也就是我們軟件的執(zhí)行芯片配紫,而GPU主要負(fù)責(zé)畫面的顯示(是一種硬件加速)。

所謂軟解碼享扔,就是指利用CPU的計算能力來解碼括细,通常如果CPU的能力不是很強(qiáng)的時候奋单,一則解碼速度會比較慢,二則手機(jī)可能出現(xiàn)發(fā)熱現(xiàn)象呆盖。但是贷笛,由于使用統(tǒng)一的算法,兼容性會很好株扛。

硬解碼汇荐,指的是利用手機(jī)上專門的解碼芯片來加速解碼。通常硬解碼的解碼速度會快很多旬蟋,但是由于硬解碼由各個廠家實現(xiàn)革娄,質(zhì)量參差不齊,非常容易出現(xiàn)兼容性問題匆浙。

Android平臺的硬解碼

終于來到有關(guān)Android的部分了吞彤,作為本文的結(jié)尾,也算是為下一篇文章開一個頭挠羔。

MediaCodec 是Android 4.1(api 16)版本引入的編解碼接口埋嵌,是所有想在Android上開發(fā)音視頻的開發(fā)人員繞不開的坑。

由于Android碎片化嚴(yán)重范舀,雖然經(jīng)過多年的發(fā)展了罪,Android硬解已經(jīng)有了很大改觀泊藕,但實際上各個廠家實現(xiàn)不同, 還是會有一些意想不到的坑玫锋。

相對于FFmpeg讼呢,Android原生硬解碼還是相對容易入門一些,所以接下來节沦,我將會從MediaCodec入手础爬,講解如何實現(xiàn)視頻的編解碼幕帆,以及引入OpenGL實現(xiàn)對視頻的編輯赖条,最后才引入FFmpeg來實現(xiàn)軟解常熙,算是一個比較常規(guī)的音視頻開發(fā)入門流程吧碱茁。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纽竣,一起剝皮案震驚了整個濱河市蜓氨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌幽勒,老刑警劉巖港令,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件顷霹,死亡現(xiàn)場離奇詭異,居然都是意外死亡遥昧,警方通過查閱死者的電腦和手機(jī)绅喉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門柴罐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凿试,你說我怎么就攤上這事似芝〉澄停” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵呛谜,是天一觀的道長。 經(jīng)常有香客問我猫妙,道長割坠,這世上最難降的妖魔是什么妒牙? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任单旁,我火速辦了婚禮,結(jié)果婚禮上蔫饰,老公的妹妹穿的比我還像新娘愉豺。我一直安慰自己,他們只是感情好杖剪,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布盛嘿。 她就那樣靜靜地躺著括袒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪芥炭。 梳的紋絲不亂的頭發(fā)上恃慧,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天痢士,我揣著相機(jī)與錄音,去河邊找鬼陪汽。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的训挡。 我是一名探鬼主播歧强,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼摊册,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了忘分?” 一聲冷哼從身側(cè)響起白修,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤兵睛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后笛丙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體假颇,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡拆融,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年镜豹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泰讽。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡已卸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出梦抢,到底是詐尸還是另有隱情愧哟,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站肥矢,受9級特大地震影響甘改,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜玉锌,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一疟羹、第九天 我趴在偏房一處隱蔽的房頂上張望榄融。 院中可真熱鬧,春花似錦涎才、人聲如沸力九。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伴挚。三九已至,卻和暖如春颅眶,著一層夾襖步出監(jiān)牢的瞬間田弥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留沪哺,地道東北人辜妓。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓忌怎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親孽惰。 傳聞我的和親對象是個殘疾皇子鸥印,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容