前言
趁著項目空期漓滔,讓我們來走進音視頻開發(fā)這塊神圣的殿堂编饺,哈哈,先了解一下音視頻的相關(guān)概念吧
視頻實質(zhì)
純粹的視頻(不包括音頻)實質(zhì)上就是一組幀圖片响驴,經(jīng)過視頻編碼成為視頻(video)文件再把音頻(audio)文件有些還有字幕文件組裝在一起成為我們看到的視頻(movie)文件透且。1秒內(nèi)出現(xiàn)的圖片數(shù)就是幀率,圖片間隔越小畫面就越流暢豁鲤,所以幀率越高效果就越好秽誊,需要的存儲空間也就越多
音視頻采集
音視頻播放得需要數(shù)據(jù)源,所以從視頻采集開始琳骡,視頻采集有四種實現(xiàn)方式
- UIImagePickerController
- AVCaptureSession+AVCaptureMovieFileOutput
- AVCaptureSession+AVAssetWriter
- GpuImage
具體的采集實現(xiàn)會在接下來的文章中寫到锅论,采集完成數(shù)據(jù)量非常大,會造成存儲和傳輸上的困難日熬,所以視頻文件都需要在錄制完成后進行編碼棍厌。視頻編碼主要從兩個維度壓縮數(shù)據(jù)
視頻編碼
視頻編碼 這篇文章講到視頻編碼概念和編碼方式肾胯,當然除了了解編碼方式我們還需要了解碼率(比特率)、幀率耘纱、分辨率
這張圖片是通過系統(tǒng)UIImagePickerController錄制的十秒視頻敬肚,可以看數(shù)據(jù)速率,這就是碼率
碼率:
視頻碼率就是數(shù)據(jù)傳輸時單位時間傳送的數(shù)據(jù)位數(shù),一般我們用的單位是kbps即千位每秒束析。通俗一點的理解就是取樣率艳馒,單位時間內(nèi)取樣率越大,精度就越高员寇,處理出來的文件就越接近原始文件弄慰,但是文件體積與取樣率是成正比的,所以幾乎所有的編碼格式重視的都是如何用最低的碼率達到最少的失真蝶锋,圍繞這個核心衍生出來的cbr(固定碼率)與vbr(可變碼率)陆爽,都是在這方面做的文章,不過事情總不是絕對的扳缕,舉例來看慌闭,對于一個音頻,其碼率越高躯舔,被壓縮的比例越小驴剔,音質(zhì)損失越小,與音源的音質(zhì)越接近粥庄。
碼率就是失真度丧失,碼率越高越清晰,反之則畫面粗糙而多馬賽克
(1)碼率計算公式
碼率 = 采樣率 X 位深度 X 聲道
(2)文件大小
文件大小 = 碼率 X 時長 注:此計算公式對未壓縮的wav格式文件有效惜互,不適用于mp3等被壓縮的文件布讹。
(3)幾點原則
a. 碼率和質(zhì)量成正比,但是文件體積也和碼率成正比载佳。這是要牢記的;
b. 碼率超過一定數(shù)值炒事,對圖像的質(zhì)量沒有多大影響;
c. 如果是1M的寬帶,在網(wǎng)上只能看不超過1024kbps的視頻蔫慧,超過1024kbps的視頻只能等視頻緩沖才能順利觀看。
幀率
幀率就是在1秒鐘時間里傳輸?shù)膱D片的幀數(shù)权薯,也可以理解為圖形處理器每秒鐘能夠刷新幾次姑躲,通常用fps(Frames Per Second)表示。每一幀都是靜止的圖象盟蚣,快速連續(xù)地顯示幀便形成了運動的假象黍析。高的幀率可以得到更流暢、更逼真的動畫屎开。每秒鐘幀數(shù) (fps) 愈多阐枣,所顯示的動作就會愈流暢。一般來說30fps是可以接受的,所以要避免動作不流暢的最低fps是30蔼两。除了30fps外,有些計算機視頻格式,例如 AVI逢慌,每秒只能提供15幀疾党。我們之所以能夠利用攝像頭來看到連續(xù)不斷的影像,是因為影像傳感器不斷攝取畫面并傳輸?shù)狡聊簧蟻砜〈粒攤鬏斔俣冗_到一定的水平時揖赴,人眼就無法辨別畫面之間的時間間隙,所以大家可以看到連續(xù)動態(tài)的畫面抑胎。 每秒的幀數(shù)(fps)或者說幀率表示圖形處理器場景時每秒鐘能夠更新幾次燥滑。高的幀率可以得到更流暢、更逼真的動畫阿逃。一般來說30fps就是可以接受的突倍,但是將性能提升至60fps則可以明顯提升交互感和逼真感,但是一般來說超過75fps一般就不容易察覺到有明顯的流暢度提升了盆昙。如果幀率超過屏幕刷新率只會浪費圖形處理的能力羽历,因為顯示器不能以這么快的速度更新,這樣超過刷新率的幀率就浪費掉了淡喜。 一般用“FPS(frame per second秕磷,每秒鐘畫面更新的數(shù)量)”來表示該項指標。在欣賞電視炼团、電影畫面時澎嚣,只要畫面的刷新率達到24幀/秒,就能滿足人們的需要瘟芝。同樣的易桃,在玩普通的游戲時,如果刷新率達到24幀/秒即可锌俱,但在一些高速游戲中(例如射擊游戲)晤郑,如果畫面的刷新率還是只有24幀/秒,那么就會感覺到畫面比較遲鈍贸宏,不夠流暢造寝。 雖然理論上畫面的刷新率越快越好,但過高的刷新率并沒有實際意義——當畫面的FPS達到60幀/秒時吭练,已經(jīng)能滿足絕大部分應(yīng)用需求诫龙。一般情況下,如果能夠保證游戲畫面的平均FPS能夠達到30幀/秒鲫咽,那么畫面已經(jīng)基本流暢签赃;能夠達到50幀/秒谷异,就基本可以體會到行云流水的感覺了。一般人很難分辨出60 幀/秒與100幀/秒有什么不同锦聊。
影響FPS因素:
既然刷新率越快越好歹嘹,為什么還要強調(diào)沒必要追求太高的刷新率呢?其中原因是在顯示分辨率不變的情況下括丁,F(xiàn)PS越高荞下,則對顯卡的處理能力要求越高。電腦中所顯示的畫面史飞,都是由顯卡來進行輸出的尖昏,因此屏幕上每個像素的填充都得由顯卡來進行計算、輸出构资。當畫面的分辨率是1024×768時抽诉,畫面的刷新率要達到24幀/秒,那么顯卡在一秒鐘內(nèi)需要處理的像素量就達到了“1024×768×24=18874368”吐绵。如果要求畫面的刷新率達到50 幀/秒迹淌,則數(shù)據(jù)量一下子提升到了“1024×768×50=39321600”。
FPS與分辨率己单、顯卡處理能力的關(guān)系如下:處理能力=分辨率×刷新率唉窃。這也就是為什么在玩游戲時,分辨率設(shè)置得越大纹笼,畫面就越不流暢的原因了纹份。
分辨率
分辨率:影響圖像大小,與圖像大小成正比:分辨率越高廷痘,圖像越大蔓涧;分辨率越低,圖像越小笋额。
畫質(zhì)
畫質(zhì)就是畫面質(zhì)量元暴。包括清晰度、銳度兄猩、鏡頭畸變茉盏、色散度、解析度厦滤、色域范圍援岩、色彩純度(色彩艷度)、色彩平衡等幾方面指標掏导。
清晰度
在碼率一定的情況下,分辨率與清晰度成反比關(guān)系:分辨率越高羽峰,圖像越不清晰趟咆,分辨率越低添瓷,圖像越清晰;
在分辨率一定的情況下值纱,碼率與清晰度成正比關(guān)系鳞贷,碼率越高,圖像越清晰虐唠;碼率越低搀愧,圖像越不清晰。
音頻編碼
音頻常用格式
PCM格式
PCM屬于編碼格式疆偿,PCM是經(jīng)過話筒后直接得到的未經(jīng)壓縮的數(shù)據(jù)流
數(shù)據(jù)的大小 = 采樣率 * 采樣位數(shù) * 聲道 * 秒數(shù) / 8
采樣率一般是:22K或者是44K
位數(shù)一般是:8位或者16位
聲道一般是:雙聲道或者單聲道
PCM是一串由多個樣本值組成的數(shù)據(jù)流咱筛,本身沒有任何頭信息或者幀的概念。只有一段PCM數(shù)據(jù)是沒有辦法知道它的采樣率的信息的杆故。WAV格式
WAV是封裝格式迅箩,里面本身可以存放多種編碼格式,不過一般都存放PCM數(shù)據(jù)处铛。
WAV文件是由“WAV文件頭”和“WAV文件體”組成饲趋。前44字節(jié)存放采樣率,通道數(shù)撤蟆,數(shù)據(jù)部分的標識符等頭信息奕塑,后面就是存放數(shù)據(jù)部分。很顯然WAV的頭信息一旦損壞了家肯,播放就會產(chǎn)生問題龄砰。MP3格式
MP3是封裝格式,里面存放的數(shù)據(jù)使用的編碼方式為:MPEG1 Layer-3
MP3是由TAG_V2結(jié)構(gòu)體息楔,TAG_V1結(jié)構(gòu)體寝贡,和一組Frame組成。頭部和尾部的TAG結(jié)構(gòu)體不一定存在值依,需要判斷圃泡。中間的Frame,每一個Frame都是由幀頭和數(shù)據(jù)實體組成愿险,幀頭記錄了MP3的位率颇蜡,采樣率,版本等信息辆亏。每個幀之間相互獨立风秤,也就是說即使前面的幀損壞了,后面的也可以播放扮叨。AMR格式
AMR是封裝格式缤弦。
AMR文件包含一個文件頭,后面就是一幀一幀的AMR幀彻磁。
文件頭里面的值就固定值碍沐,用于標記文件為AMR文件狸捅。
每個幀分為幀頭和數(shù)據(jù)部分,幀頭里面包含編發(fā)方式和輔助信息累提。AMR的采樣率跟編碼方式的不同而不同尘喝。AAC格式
AAC文件可以沒有文件頭,全部由幀序列組成斋陪。
每個幀包含幀頭和數(shù)據(jù)部分朽褪。
幀頭包含采樣率,聲道數(shù)无虚,幀長度等有點類似MP3格式缔赠。CAF格式
CAF是蘋果的一種音頻封裝格式,與WAV差不多骑科,里面可以存放LPCM橡淑,MP3等多種編碼方式。
API里有很多的編碼格式可供選擇咆爽,其中PCM數(shù)據(jù)是最原始的完全無損的音頻數(shù)據(jù)梁棠,所以體積比較龐大,為了解決這個問題斗埂,則誕生了一系列的音頻編碼格式符糊。比如MP3、AAC呛凶、等男娄。而現(xiàn)在主流的音頻編碼格式則是AAC(mp3和AAC的選擇請看這里)
采樣頻率
采樣頻率是指單位時間內(nèi)對聲音模擬信號的采樣次數(shù)。采樣率類似于視頻的幀數(shù)漾稀,比如電影的采樣率是24Hz模闲。當我們把采樣到的一個個靜止畫面再以采樣率同樣的速度回放時,看到的就是連續(xù)的畫面崭捍。同樣的道理尸折,把以44.1kHZ采樣率記錄的CD以同樣的速率播放時,就能聽到連續(xù)的聲音殷蛇。顯然实夹,這個采樣率越高,聽到的聲音和看到的圖像就越連貫粒梦。當然亮航,人的聽覺和視覺器官能分辨的采樣率是有限的。對同一段聲音匀们,用20kHz和44.1kHz來采樣缴淋,重放時,可能可以聽出其中的差別,而基本上高于44.1kHZ采樣的聲音宴猾,比如說96kHz采樣圆存,絕大部分人已經(jīng)覺察不到兩種采樣出來的聲音的分別了叼旋。之所以使用44.1kHZ這個數(shù)值是因為經(jīng)過了反復(fù)實驗仇哆,人們發(fā)現(xiàn)這個采樣精度最合適,低于這個值就會有較明顯的損失夫植,而高于這個值人的耳朵已經(jīng)很難分辨讹剔,而且增大了數(shù)字音頻所占用的空間。我們所使用的CD的采樣標準就是44.1k详民。
采樣位數(shù)
采樣位數(shù)可以理解為采集卡處理聲音的解析度延欠。這個數(shù)值越大,解析度就越高沈跨,錄制和回放的聲音就越真實由捎。我們首先要知道:電腦中的聲音文件是用數(shù)字0和1來表示的。連續(xù)的模擬信號按一定的采樣頻率經(jīng)數(shù)碼脈沖取樣后饿凛,每一個離散的脈沖信號被以一定的量化精度量化成一串二進制編碼流狞玛,這串編碼流的位數(shù)即為采樣位數(shù),也稱為量化精度涧窒。在電腦上錄音的本質(zhì)就是把模擬聲音信號轉(zhuǎn)換成數(shù)字信號心肪。反之,在播放時則是把數(shù)字信號還原成模擬聲音信號輸出纠吴。采集卡的位是指采集卡在采集和播放聲音文件時所使用數(shù)字聲音信號的二進制位數(shù)硬鞍。采集卡的位客觀地反映了數(shù)字聲音信號對輸入聲音信號描述的準確程度。例如戴已,同一段音頻信息固该,使用8bit描述單個采樣信息,那么采樣量化的范圍就是0255,如果使用16bit表示單個采樣值,那么相應(yīng)的采樣量化的范圍為064k糖儡。與8位采樣位數(shù)相比伐坏,16位采樣的動態(tài)范圍的寬度更小,動態(tài)范圍更寬廣休玩,聲音的被記錄的更加精細著淆。一般CD使用的采樣位數(shù)為16位。
16位二進制數(shù)的最小值是0000000000000000拴疤,最大值是1111111111111111永部,對應(yīng)的十進制數(shù)就是0和65535,也就是最大和最小值之間的差值是65535呐矾,也就是說苔埋,它量化的模擬量的動態(tài)范圍可以差65535,也就是96.32分貝(20 * lg65535))蜒犯,所以组橄,量化精度只和動態(tài)范圍有關(guān)荞膘,和頻率響應(yīng)沒關(guān)系。動態(tài)范圍定在96分貝也是有道理的玉工,人耳的無痛苦極限聲壓是90分貝羽资,96分貝的動態(tài)范圍在普通應(yīng)用中足夠使用,所以96分貝動態(tài)范圍內(nèi)的模擬波遵班,經(jīng)量化后屠升,不會產(chǎn)生削波失真的。所謂分貝是指兩個相同的物理量(例A1和A0)之比取以10為底的對數(shù)并乘以10(或20)狭郑。N = 10lg(A1/A0) 分貝符號為"dB"腹暖,它是無量綱的。式中A0是基準量(或參考量)翰萨,A是被量度量脏答。被量度量和基準量之比取對數(shù),這對數(shù)值稱為被量度量的"級"亩鬼。亦即用對數(shù)標度時殖告,所得到的是比值,它代表被量度量比基準量高出多少"級"辛孵。
位速/比特率/碼率
位速/比特率/碼率描述的都是一個東西丛肮,是指在一個數(shù)據(jù)流中每秒鐘能通過的信息量。我們可能看到過音頻文件用 “128–Kbps MP3” 或 “64–Kbps WMA” 進行描述的情形魄缚。Kbps 表示 “每秒千位數(shù)”宝与,因此數(shù)值越大表示數(shù)據(jù)越多:128–Kbps MP3 音頻文件包含的數(shù)據(jù)量是 64–Kbps WMA 文件的兩倍,并占用兩倍的空間冶匹。(不過在這種情況下习劫,這兩種文件聽起來沒什么兩樣。原因是什么呢嚼隘?有些文件格式比其他文件能夠更有效地利用數(shù)據(jù)诽里, 64–Kbps WMA 文件的音質(zhì)與 128–Kbps MP3 的音質(zhì)相同。)需要了解的重要一點是飞蛹,位速越高谤狡,信息量越大,對這些信息進行解碼的處理量就越大卧檐,文件需要占用的空間也就越多墓懂。
從碼率的計算公式中可以清楚的看出碼率和采樣位數(shù)的關(guān)系:
碼率=取樣頻率×量化精度×聲道數(shù),一張CD,雙聲道,采樣率44.1kHz霉囚,每個采樣位數(shù)13bit捕仔,時長74分鐘(4440秒),則CD的容量為13244100*4440約等于640MB。
VBR榜跌、ABR闪唆、CBR
VBR(Variable Bitrate)動態(tài)比特率。也就是沒有固定的比特率钓葫,壓縮軟件在壓縮時根據(jù)音頻數(shù)據(jù)即時確定使用什么比特率悄蕾。這是新發(fā)展的算法,他們將一首歌的復(fù)雜部分用高Bitrate編碼瓤逼,簡單部分用低Bitrate編碼笼吟。主意雖然不錯,可惜新編碼器的VBR算法很差霸旗,音質(zhì)與CBR相去甚遠。幸運的是戚揭, Lame完美地優(yōu)化了VBR算法诱告,使之成為MP3的最佳編碼模式。這是以質(zhì)量為前提兼顧文件大小的方式民晒,推薦編碼模式精居。
ABR(Average Bitrate)平均比特率,是VBR的一種插值參數(shù)潜必。Lame針對CBR不佳的文件體積比和VBR生成文件大小不定的特點獨創(chuàng)了這種編碼模式靴姿。ABR也被稱為“Safe VBR”,它是在指定的平均Bitrate內(nèi)磁滚,以每50幀(30幀約1秒)為一段佛吓,低頻和不敏感頻率使用相對低的流量,高頻和大動態(tài)表現(xiàn)時使用高流量垂攘。舉例來說维雇,當指定用192kbps ABR對一段wav文件進行編碼時,Lame會將該文件的85%用192kbps固定編碼晒他,然后對剩余15%進行動態(tài)優(yōu)化:復(fù)雜部分用高于192kbps 來編碼吱型、簡單部分用低于192kbps來編碼。與192kbps CBR相比陨仅,192kbps ABR在文件大小上相差不多津滞,音質(zhì)卻提高不少。ABR編碼在速度上是VBR編碼的2到3倍灼伤,在128-256kbps范圍內(nèi)質(zhì)量要好于CBR触徐。可以做為 VBR和CBR的一種折衷選擇饺蔑。CBR(Constant Bitrate)锌介,常數(shù)比特率,指文件從頭到尾都是一種位速率。相對于VBR和ABR來講孔祸,它壓縮出來的文件體積很大隆敢,但音質(zhì)卻不會有明顯的提高。
真機運行的存儲視頻信息獲却藁邸:
1.xcode打開真機和模擬器選項
2.選中運行的項目拂蝎,下載該appdata文件
3.下載完成選中appdata文件右鍵顯示包內(nèi)容,從你存儲的路徑就能看到錄制的視頻
4.用Mac原生的QuickTime Player打開視頻惶室,command + i 就會彈出下圖的視頻信息
附上參考資料:
UIImagePickerController
AVCaptureSession+AVCaptureMovieFileOutput
AVCaptureSession+AVAssetWriter
GpuImage
iOS音頻(基礎(chǔ)篇)-常用的音頻格式
視頻編解碼:第三章 視頻碼率温自、幀率、分辨率皇钞、畫質(zhì)區(qū)別
感謝以上朋友的分享