前些時(shí)間,我在知識(shí)星球上創(chuàng)建了一個(gè)音視頻技術(shù)社群:關(guān)鍵幀的音視頻開(kāi)發(fā)圈,在這里群友們會(huì)一起做一些打卡任務(wù)。比如:周期性地整理音視頻相關(guān)的面試題,匯集一份音視頻面試題集錦,你可以看看《音視頻面試題集錦 2022.04》。再比如:循序漸進(jìn)地歸納總結(jié)音視頻技術(shù)知識(shí),繪制一幅音視頻知識(shí)圖譜。
下面是 2022.04 月知識(shí)圖譜新增的內(nèi)容節(jié)選:
1)圖譜路徑:**采集/音頻采集/聲音三要素/響度******
- 主觀計(jì)量
- 響度,反映人耳感受到的聲音強(qiáng)弱。
- 響度級(jí),兩個(gè)聲音在聽(tīng)覺(jué)上認(rèn)為是相同的響度時(shí),就可以把 1000 Hz 純音的這個(gè)聲壓級(jí)規(guī)定為該頻率純音的「響度級(jí)」。單位:方(Phon)。
- 客觀計(jì)量
- 聲能,聲音在介質(zhì)中傳播時(shí),使媒介附加的能量。質(zhì)點(diǎn)振動(dòng)動(dòng)能和質(zhì)點(diǎn)偏離平衡位置所具有的勢(shì)能的總和。單位:瓦。
- 聲強(qiáng),單位時(shí)間內(nèi)通過(guò)垂直于聲波傳播方向的單位面積的平均聲能。單位:瓦/平方米。
- 聲強(qiáng)級(jí),人耳允許的聲強(qiáng)范圍太大;心理物理學(xué)的研究表明,人對(duì)聲音強(qiáng)弱的感覺(jué)并不是與聲強(qiáng)成正比,而是與其對(duì)數(shù)成正比。因此引入「聲強(qiáng)級(jí)」。
- 聲壓,聲波通過(guò)媒質(zhì)時(shí),由振動(dòng)所產(chǎn)生的壓強(qiáng)改變量。單位:牛頓/平方米、帕斯卡。實(shí)際中更多使用聲壓來(lái)代表聲波的振幅表現(xiàn):人耳表現(xiàn)為壓力敏感組織;壓力或壓強(qiáng)具有相對(duì)容易進(jìn)行實(shí)地測(cè)量。
- 聲壓級(jí),人耳允許的聲壓范圍太大;人對(duì)聲音的強(qiáng)弱的感覺(jué)是與聲壓的對(duì)數(shù)成正比。因此引入「聲壓級(jí)」。通常我們說(shuō)聲音大小有多少分貝,說(shuō)的就是「聲壓級(jí)」。
2)圖譜路徑:**采集/音頻采集/聲音三要素/音調(diào)******
- 主觀計(jì)量
- 音調(diào),人耳對(duì)聲音高低的主觀感受。單位:美(mel)。取頻率 1000Hz、聲壓級(jí)為 40 分貝的純音的音調(diào)作標(biāo)準(zhǔn),稱為 1000 美。另一些純音,聽(tīng)起來(lái)調(diào)子高一倍的稱為 2000 美,調(diào)子低一倍的稱為 500 美,依此類推,可建立起整個(gè)可聽(tīng)頻率內(nèi)的音調(diào)標(biāo)度。
- 科學(xué)音調(diào)記號(hào)法,兩個(gè)音符之間若頻率相差整數(shù)倍,則聽(tīng)起來(lái)非常相似。因此,我們將這些音放在同一個(gè)「音調(diào)集合」中。兩個(gè)音符間若相差一倍的頻率,則我們稱兩者之間相差一個(gè)八度。
- 客觀計(jì)量
- 頻率,聲音振動(dòng)的快慢。單位:赫茲。
3)圖譜路徑:**采集/音頻采集/聲音數(shù)字化/采樣率******
- 奈奎斯特采樣定理:一般實(shí)際應(yīng)用中保證采樣頻率為信號(hào)最高頻率的 2.56~4 倍。
- 人類發(fā)聲在 5kHz 內(nèi),聽(tīng)覺(jué)范圍是 20~20kHz 內(nèi)。數(shù)字音頻的采樣率需要在 40k 以上。
- 44100Hz 由來(lái):最早的數(shù)字錄音由一臺(tái)錄像機(jī)加上一部 PCM 編碼器制作的,由于當(dāng)時(shí)使用的是 PAL 錄像制式(帕制,與之對(duì)應(yīng)的有 NTSC),場(chǎng)頻 50 Hz,可用掃描線數(shù) 294 條,一條視頻掃描線的磁跡中記錄 3 個(gè)音頻數(shù)據(jù)塊,把它們相乘,就得到了 44100 這個(gè)奇葩數(shù)字。
4)圖譜路徑:**采集/音頻采集/聲音數(shù)字化/量化位深******
- 對(duì)模擬音頻信號(hào)的幅度軸進(jìn)行數(shù)字化,它決定了模擬信號(hào)數(shù)字化以后的動(dòng)態(tài)范圍。
- 8 bit 位深對(duì)應(yīng) 48 分貝的動(dòng)態(tài)范圍(最大聲壓級(jí) = 20 * lg(2^8) = 48.16),16 bit 位深對(duì)應(yīng) 96 分貝的動(dòng)態(tài)范圍,24 bit 位深對(duì)應(yīng) 144 分貝的動(dòng)態(tài)范圍。
5)圖譜路徑:**采集/視頻采集/圖像/顏色模型******
- CIE RGB 顏色模型:基于人眼視覺(jué)感知三原色理論,CIE 通過(guò)大量實(shí)驗(yàn)數(shù)據(jù)建立了 RGB 顏色模型,標(biāo)準(zhǔn)化了 RGB 表示。
- CIE XYZ 顏色模型:為了解決 RGB 模型中與負(fù)光混合所帶來(lái)的種種問(wèn)題,CIE 從數(shù)學(xué)上定義了三種標(biāo)準(zhǔn)基色 XYZ,形成了 CIE XYZ 顏色模型。
- NTSC YIQ 顏色模型:在模擬電視時(shí)代,RGB 工業(yè)顯示器要求一幅彩色圖像由分開(kāi)的 R、G、B 信號(hào)組成,而電視顯示器則需要混合信號(hào)輸入,為了實(shí)現(xiàn)對(duì)這兩種標(biāo)準(zhǔn)的兼容,NTSC 基于 XYZ 模型制定了 YIQ 顏色模型,實(shí)現(xiàn)了彩色電視和黑白電視的信號(hào)兼容。
- PAL YUV 顏色模型:為了解決 NTSC YIQ 的組合模擬視頻信號(hào)中分配給色度信息的帶寬較低而影響了圖像顏色質(zhì)量的問(wèn)題,PAL 引入了 YUV 顏色模型,支持用不同的采樣格式來(lái)調(diào)整傳輸?shù)纳刃畔⒘俊?/li>
- ITU-R YCbCr 顏色模型:進(jìn)入數(shù)字電視時(shí)代,ITU-R 為數(shù)字視頻轉(zhuǎn)換制定了 YCbCr 顏色模型,成為我們現(xiàn)在最常使用的顏色模型。
- 伽馬校正:在早年 CRT 顯示器流行的年代,我們遇到了顯示伽馬問(wèn)題,從而引入了伽馬校正過(guò)程并延用至今。
6)圖譜路徑:**采集/視頻采集/紋理/數(shù)據(jù)與紋理轉(zhuǎn)換/紋理轉(zhuǎn)數(shù)據(jù)(GPU → CPU)/Android 方案******
- glReadPixels
- OpenGL ES 2.0 和 3.0 均支持,兼容性較好。
- 會(huì)影響 CPU 時(shí)鐘周期,同時(shí) GPU 會(huì)等待當(dāng)前幀繪制完成,讀取像素完成之后,才開(kāi)始下一幀的計(jì)算,造成渲染管線停滯。
- 讀取的是當(dāng)前綁定 FBO 的顏色緩沖區(qū)圖像,所以當(dāng)使用多個(gè) FBO(幀緩沖區(qū)對(duì)象)時(shí),需要確定好我們要讀那個(gè) FBO 的顏色緩沖區(qū)。
- 在大分辨率圖像的讀取時(shí)性能略差。目前通用的優(yōu)化方法是在 shader 中將處理完成的 RGBA 轉(zhuǎn)成 YUV (一般是 YUYV 格式),然后基于 RGBA 的格式讀出 YUV 圖像,這樣傳輸數(shù)據(jù)量會(huì)降低一半,性能提升明顯。
- PBO(Pixel Buffer Object,像素緩沖區(qū)對(duì)象)
- OpenGL ES 3.0 才支持,在 Android 上有兼容性問(wèn)題。
- PBO 類似于 VBO(頂點(diǎn)緩沖區(qū)對(duì)象),開(kāi)辟的也是 GPU 緩存,而存儲(chǔ)的是圖像數(shù)據(jù)。PBO 不連接到紋理,且與 FBO (幀緩沖區(qū)對(duì)象)無(wú)關(guān)。
- PBO 可以在 GPU 的緩存間快速傳遞像素?cái)?shù)據(jù),不影響 CPU 時(shí)鐘周期,支持異步,主要用于異步像素傳輸。
- 以空間換時(shí)間,通常需要多個(gè) PBO 交替配合使用來(lái)提升性能。
- ImageReader
- ImageReader 是 Android SDK 提供的 Java 層對(duì)象,其內(nèi)部會(huì)創(chuàng)建一個(gè) Surface 對(duì)象。
- EGL 創(chuàng)建 OpenGL 上下文環(huán)境時(shí),eglCreateWindowSurface 需要傳入 ANativeWindow 對(duì)象,而 ANativeWindow 又基于 Surface 對(duì)象創(chuàng)建的??梢岳?ImageReader 對(duì)象的 Surface 對(duì)象作為 OpenGL 展示渲染結(jié)果的 Window Surface ,每次渲染的結(jié)果可以通過(guò) ImageReader 對(duì)象的回調(diào)獲取。
- HardwareBuffer
- 一個(gè)更底層的對(duì)象,代表可由各種硬件單元(GPU、傳感器或上下文集線器或其他輔助處理單元)訪問(wèn)的緩沖區(qū)。Native 層叫 AHardwareBuffer,AHardwareBuffer 讀取顯存(紋理)圖像數(shù)據(jù)時(shí),需要與 GLEXT 和 EGLEXT 配合使用。
- HardwareBuffer 是 Android 8 API >= 26 提供的用于替換 GraphicBuffer 的接口,在 API <= 25 時(shí)可以使用 GraphicBuffer。兩者在使用步驟上基本一致,均可以用于快速讀取顯存(紋理)圖像數(shù)據(jù),但是 HardwareBuffer 還可以訪問(wèn)其他硬件的存儲(chǔ)器,使用更廣泛。
- 性能和實(shí)現(xiàn)選擇
- 大分辨率情況,ImageReader、PBO、HardwareBuffer 明顯優(yōu)于 glReadPixels 方式。一般 HardwareBuffer、ImageReader、PBO 三種方式性能相差不大,HardwareBuffer 理論上性能最優(yōu)。
- Native 層建議選擇 PBO 方式,超大分辨率建議嘗試 HardwareBuffer 方式,Java 層建議使用 ImageReader 方式。
如果你也對(duì)音視頻技術(shù)感興趣,比如,符合下面的情況:
- 在校大學(xué)生 → 學(xué)習(xí)音視頻開(kāi)發(fā)
- iOS/Android 客戶端開(kāi)發(fā) → 轉(zhuǎn)入音視頻領(lǐng)域
- 直播/短視頻業(yè)務(wù)開(kāi)發(fā) → 深入音視頻底層 SDK 開(kāi)發(fā)
- 音視頻 SDK 開(kāi)發(fā) → 提升技能,解決優(yōu)化瓶頸
我們創(chuàng)建了一個(gè)音視頻社群,vx 搜索『gjzkeyframe』 關(guān)注『關(guān)鍵幀Keyframe』咨詢,或知識(shí)星球搜『關(guān)鍵幀的音視頻開(kāi)發(fā)圈』,了解一下這個(gè)社群,根據(jù)自己的情況按需加入
下面是 2022.04 月的知識(shí)圖譜新增內(nèi)容快照(圖片被平臺(tái)壓縮不夠清晰,可以加文章后面微信索要清晰原圖):
