音频和视频的基础知识
目錄
- PCM-脈沖編碼調制
- 錄音的原理
- 記錄聲音-音頻數字化
- 音頻數字化-PCM
- 采樣
- 采樣
- 采樣率
- 采樣定理
- 量化
- 位深度
- 編碼
- 聲道(Channel)
- 比特率
- 信噪比
- 編碼(Encode)
- 解碼(Decode)
- 常見的音頻編碼和文件格式
- 無損
- Monkey's Audio
- FLAC
- ALAC
- 有損
- MP3
- WMA
- AAC
- Speex
- Opus
- 文件格式
- Ogg
- WAV
- AIFF
- 有損和無損
- 聲波
- 音調
- 響度
- 音色
- 噪音
- 像素
- RGB顏色模型
- 位深度
- 24bit顏色的表示形式
- 顏色數量
- 其他位深度
- 不同位深度的對比
- 格式
- 動畫
- YUV
- 體積更小
- 組成
- 兼容性
- RGB和YUV轉換
- 公式1
- 公式2
- 公式3
- 色度二次采樣
- 原理
- 概念
- 采樣格式
- 4:4:4
- 4:2:2
- 4:2:0
- H.264編碼
- 編碼器
- 解碼器
- 編碼過程與原理
- 劃分幀類型
- GOP的長度
- GOP的類型
- 幀內/幀間編碼
- 劃分宏塊
- 幀內編碼
- 幀間編碼
- 變換與量化
- 規格
PCM-脈沖編碼調制
錄音的原理
可以簡單理解為:把聲源的振動記錄下來,需要時再讓某個物體按照記錄下來的振動規律去振動,就會產生與原來一樣的聲音。
記錄聲音-音頻數字化
如何把聲音(聲源的振動)記錄下來呢?聲音屬于模擬信號,但更便于計算機處理和存儲的是數字信號(二進制編碼),所以需要將模擬信號(Analog Signal)轉成數字信號(Digital Signal)后進行存儲。這一過程,我們可以稱之為:音頻數字化。
音頻數字化-PCM
將音頻數字化的常見技術方案是脈沖編碼調制(PCM,Pulse Code Modulation),主要過程是:采樣 → 量化 → 編碼。
采樣
模擬信號的波形是無限光滑的,可以看成由無數個點組成,由于存儲空間是相對有限的,數字編碼過程中,必須要對波形的點進行采樣。
采樣
采樣(Sampling):每隔一段時間采集一次模擬信號的樣本,是一個在時間上將模擬信號離散化(把連續信號轉換成離散信號)的過程。
采樣率
每秒采集的樣本數量,稱為采樣率(采樣頻率,采樣速率,Sampling Rate)。比如,采樣率44.1kHz表示1秒鐘采集44100個樣本。
采樣定理
根據采樣定理(奈奎斯特–香農采樣定理,Nyquist-Shannon sampling theorem)得知:只有當采樣率高于聲音信號最高頻率的2倍時,才能把采集的聲音信號唯一地還原成原來的聲音。
人耳能夠感覺到的最高聲音頻率為20000Hz,因此為了滿足人耳的聽覺要求,需要至少每秒進行40000次采樣(40kHz采樣率)。
這就是為什么常見的CD的采樣率為44.1kHz。
電話、無線對講機、無線麥克風等的采樣率是8kHZ。
人耳聽覺 20HZ–20KHZ 敏感 1KHz–4KHz 最敏感 3.4KHz(再往上容易產生聽覺疲勞)
人嗓音 男 80Hz–500Hz 女100Hz–1KHz
電話 200/300–3KHZ
電視 100HZ
20–250 LOW (LF) 250–2KHz MID (MF) 2kHz–4KHz MH 4KHz–20KHz High (HF)
根據采樣定律,要保證信號傳輸中不失真,采樣頻率最起碼是最高頻率的兩倍,也就是說采樣頻率6800hz以上都可以,至于為什么是8000hz,可以認為是一種約定而已。
量化
量化(Quantization):將每一個采樣點的樣本值數字化。
位深度
位深度(采樣精度,采樣大小,Bit Depth):使用多少個二進制位來存儲一個采樣點的樣本值。位深度越高,表示的振幅越精確。常見的CD采用16bit的位深度,能表示65536(216)個不同的值。DVD使用24bit的位深度,大多數電話設備使用8bit的位深度。
就相當于下圖縱坐標的間距 位深度越大 縱坐標刻度越密集,表示的振幅越精確。
下圖的橫坐標間距越小 表示采樣率越高
編碼
編碼:將采樣和量化后的數字數據轉成二進制碼流。
聲道(Channel)
單聲道產生一組聲波數據,雙聲道(立體聲)產生兩組聲波數據。
采樣率44.1kHZ、位深度16bit的1分鐘立體聲PCM數據有多大?
- 采樣率 * 位深度 * 聲道數 * 時間
- 44100 * 16 * 2 * 60 / 8 ≈ 10.34MB
1分鐘10.34MB,這對于大部分用戶來說是不能接受的。
要想在不改變音頻時長的前提下,降低音頻數據的大小,只有2種方法:
降低采樣指標、壓縮。
降低采樣指標是不可取的,會導致音頻質量下降,用戶體驗變差,因此專家們研發了各種壓縮方案。
舉個例子:
現在有個需求,在局域網內實現實時語音,傳輸層協議使用UDP協議,如果直接使用AudioRecord進行錄制音頻流并發送到另一端進行播放,音質會非常差,而且斷斷續續,原因如下:
采樣頻率: fm = 44.1KHz
量化位數:16bit
聲道配置:2(雙聲道)
那么,碼率 V = 44.1K * 16 *2 = 1411.2 Kbps = 176.4KBps,即每秒傳輸速率大概176.4KB,
若音頻幀時間為20ms,每個音頻數據包大小為 size = 176.4KBps * 0.02s = 3.528KB,
一般情況下,我們每次讀取一個音頻幀的數據,可以取整為3600Byte,
所以 每秒大概發送 176.4/3.6=49 個數據包,每個數據包大小為3.6KB。
如果再考慮到數據報頭,實測每秒發送約45個數據包,每秒傳輸速率大概180KB。
由于一般都是使用手機連接Wifi,這就要求網絡質量和硬件設備必須很好,而且信道干擾較弱,并且鏈接的設備不能過多。只要稍微信號不好,就會導致丟包率特別高,而且延時十分大,根本無法滿足通信的需要。在這種情況下,我們就需要進行語音壓縮、降噪等處理。
比特率
比特率(Bit Rate),指單位時間內傳輸或處理的比特數量,單位是:比特每秒(bit/s或bps),還有:千比特每秒(Kbit/s或Kbps)、兆比特每秒(Mbit/s或Mbps)、吉比特每秒(Gbit/s或Gbps)、太比特每秒(Tbit/s或Tbps)。
采樣率44.1kHZ、位深度16bit的立體聲PCM數據的比特率是多少?
- 采樣率 * 位深度 * 聲道數
- 44100 * 16 * 2 = 1411.2Kbps
通常,采樣率、位深度越高,數字化音頻的質量就越好。從比特率的計算公式可以看得出來:比特率越高,數字化音頻的質量就越好。
信噪比
信噪比(Signal-to-noise ratio,SNR,S/N,訊噪比),指信號與噪聲的比例,用于比較所需信號的強度與背景噪聲的強度,以分貝(dB)為單位。
位深度限制了信噪比的最大值,它們的關系如下表所示。
| 4 | 24.08 |
| 8 | 48.16 |
| 11 | 66.22 |
| 12 | 72.24 |
| 16 | 96.33 |
| 18 | 108.37 |
| 20 | 120.41 |
| 24 | 144.49 |
| 32 | 192.66 |
| 48 | 288.99 |
| 64 | 385.32 |
關于信噪比的意義:
圖像的信噪比和圖像的清晰度一樣,都是衡量圖像質量高低的重要指標。圖像的信噪比是指視頻信號的大小與噪波信號大小的比值,其公式為:
S/N(信噪比)= 20 log (信號/噪聲)dB
信噪比大,圖像畫面就干凈,看不到什么噪波干擾(表現為“顆粒”和“雪花”),看起來很舒服;若信噪比小,則在畫面上,可能滿是雪花,嚴重影響圖像畫面。信噪比與圖像質量之間具有如下對應關系:
S/N為60dB(比率為1000:1)時,圖像質量優良,不出現噪聲;
S/N為50dB(比率為316:1)時,圖像有少量噪聲,但圖像質量算好;
S/N為40dB(比率為100:1)時,圖像有一定的精細顆粒或雪花,圖像的精細結構受到一定的損失;
S/N為30dB(比率為32:1),圖像將是有大量噪聲的劣質圖像;
S/N為20dB(比率為10:1),圖像就不能使用。
影響信噪比的因素很多,例如電源的干擾,電子元器件過熱產生的干擾,光敏元件上的小電壓放大成0.7V視頻信號時,因放大而產生的噪聲,光照度降低時,放大器增益提高,噪聲也將增加等等。
一般攝像機的信噪比在50-60dB之間,錄像機在40-50dB之間。
編碼(Encode)
PCM數據可以理解為是:未經壓縮的原始音頻數據,體積比較大,為了更便于存儲和傳輸,一般都會使用某種音頻編碼對它進行編碼壓縮,然后再存成某種音頻文件格式。
壓縮分為無損壓縮和有損壓縮。
- 無損壓縮
- 解壓后可以完全還原出原始數據
- 壓縮比小,體積大
- 有損壓縮
- 解壓后不能完全還原出原始數據,會丟失一部分信息
- 壓縮比大,體積小
- 壓縮比越大,丟失的信息就越多,還原后的信號失真就會越大
- 一般是通過舍棄原始數據中對人類聽覺不重要的部分,達成壓縮成較小文件的目的
- 壓縮比 = 未壓縮大小 / 壓縮后大小
解碼(Decode)
當需要播放音頻時,得先解碼(解壓縮)出PCM數據,然后再進行播放。
常見的音頻編碼和文件格式
需要注意的是:音頻文件格式并不等于音頻編碼。比如:
- WAV只是一種文件格式,并不是一種編碼
- FLAC既是一種文件格式,又是一種編碼
下面對常見的音頻編碼和文件格式做一個簡介。
| Monkey’s Audio | ?? | .ape |
| FLAC(Free Lossless Audio Codec) | ?? | .flac |
| ALAC(Apple Lossless Audio Codec) | ?? | .m4a/.caf |
| MP3(MPEG Audio Layer III) | ? | .mp3 |
| WMA(Windows Media Audio) | ? | .wma |
| AAC(Advanced Audio Coding) | ? | .acc/.mp4/.m4a |
| Vorbis | ? | .ogg |
| Speex | ? | .spx |
| Opus | ? | .opus |
| Ogg | .ogg | |
| WAV(Waveform Audio File Format) | .wav | |
| AIFF(Audio Interchange File Format) | .aiff、.aif |
無損
Monkey’s Audio
Monkey’s Audio,是一種無損的音頻編碼和文件格式,文件擴展名為.ape,壓縮率一般在55%左右。
FLAC
FLAC(Free Lossless Audio Codec),是一種無損的音頻編碼和文件格式,文件擴展名為.flac。雖然壓縮率稍有不及Monkey’s Audio,但FLAC技術更先進,占用資源更低,有更多的平臺及硬件產品支持FLAC。
ALAC
ALAC(Apple Lossless Audio Codec),是由Apple開發的一種無損的音頻編碼,文件擴展名為.m4a、.caf。
有損
MP3
MP3(MPEG Audio Layer III),是非常流行的一種有損音頻編碼和文件格式,文件擴展名為.mp3。
第1版是:MPEG-1 Audio Layer III,屬于國際標準ISO/IEC 11172-3
第2版是:MPEG-2 Audio Layer III,屬于國際標準ISO/IEC 13818-3
第3版是:MPEG-2.5 Audio Layer III,并不是由MPEG官方開發的,不是公認的標準
WMA
WMA(Windows Media Audio),是由Microsoft開發的音頻編碼和文件格式,文件擴展名為.wma。包括4種類型:
WMA:原始的WMA編解碼器,作為MP3的競爭者,屬于有損音頻編碼
WMA Pro:支持更多聲道和更高質量的音頻,屬于有損音頻編碼
WMA Lossless:屬于無損音頻編碼
WMA Voice:屬于有損音頻編碼
AAC
AAC(Advanced Audio Coding),是由Fraunhofer IIS、杜比實驗室、AT&T、Sony、Nokia等公司共同開發的有損音頻編碼和文件格式,壓縮比通常為18:1。
AAC被設計為MP3格式的后繼產品,通常在相同的比特率下可以獲得比MP3更高的聲音質量,是iPhone、iPod、iPad、iTunes的標準音頻格式。
AAC編碼的文件擴展名主要有3種:
.acc:傳統的AAC編碼,使用MPEG-2 Audio Transport Stream(ADTS)容器
.mp4:使用了MPEG-4 Part 14的簡化版即3GPP Media Release 6 Basic(3gp6)進行封裝的AAC編碼
.m4a:為了區別純音頻MP4文件和包含視頻的MP4文件而由Apple公司使用的擴展名
Apple iTunes對純音頻MP4文件采用了.m4a文件擴展名
M4A的本質和音頻MP4相同,故音頻MP4文件可以直接更改文件擴展名為.m4a
Vorbis
Vorbis,是由Xiph.Org基金會開發的一種有損音頻編碼。通常以Ogg作為容器格式,所以常合稱為Ogg Vorbis,文件擴展名為.ogg。
Speex
Speex,是由Xiph.Org基金會開發的一種有損音頻編碼和文件格式,文件擴展名為.spx。
Opus
Opus,是由Xiph.Org基金會開發的一種有損音頻編碼和文件格式,文件擴展名為.opus。用以取代Vorbis和Speedx。經過多次盲聽測試,在任何給定的比特率下都比其他標準音頻格式具有更高的質量,包括MP3、AAC。
文件格式
Ogg
Ogg是一種多媒體文件格式,由Xiph.Org基金會所維護,可以納入各式各樣的音視頻編碼(音頻、視頻都可以),文件擴展名常為.ogg。
Ogg常用的音頻編碼有:
有損壓縮:Speex、Vorbis、Opus
無損壓縮:FLAC
未壓縮:PCM
WAV
WAV(Waveform Audio File Format),是由IBM和Microsoft開發的音頻文件格式,擴展名是.wav,通常采用PCM編碼,常用于Windows系統中。
AIFF
AIFF(Audio Interchange File Format),由Apple開發的音頻文件格式,擴展名是.aiff、.aif。跟WAV一樣,通常采用PCM編碼,常用于Mac系統中。
有損和無損
根據采樣率和位深度可以得知:相對于自然界的信號,音頻編碼最多只能做到無限接近,任何數字音頻編碼方案都是有損的,因為無法完全還原。目前能夠達到最高保真水平的就是PCM編碼,因此,PCM約定俗成叫做無損音頻編碼,被廣泛用于素材保存及音樂欣賞,CD、DVD以及常見的WAV文件中均有應用。
但并不意味著PCM就能夠確保信號絕對保真,PCM也只能做到最大程度的無限接近。我們習慣性的把MP3列入有損音頻編碼范疇,是相對于PCM編碼的。要做到真正的無損是困難的,就像用數字去表達圓周率,不管精度多高,也只是無限接近,而不是真正等于圓周率的值。
聲波
以揚聲器為例子,揚聲器發聲時是振膜在振動。
振膜的振動會導致振膜旁邊的空氣振動,然后導致更大范圍的空氣跟著一起振動,最后耳朵旁邊的空氣也開始振動。
空氣的振動帶來了動能(Kinetic Energy),能量傳入了耳朵中,最后就聽到了聲音。
所以,揚聲器可以通過空氣來傳播能量,而不是傳播空氣本身。
聲音與波有著相同的關鍵特征:可以通過介質傳播能量,而不是傳播介質本身。
- 因此,我們也把聲音稱為聲波
- 聲音的傳播介質可以是氣體、液體、固體,比如:2個人面對面交流時,聲音是通過空氣傳播到對方耳中
為什么自己錄下來的聲音和平時說話的聲音,聽起來會不太一樣?
- 當自己說話的時候,實際上自己聽到了2個聲音,分別來自2種不同的傳播介質
- 聲波 → 空氣 → 耳朵
- 聲波 → 血肉、骨骼等介質 → 耳朵
- 錄制聲音時
- 聲波 → 空氣 → 錄音設備
- 當聽自己錄下來的聲音時,自己只聽到了1個聲音
- 聲波 → 空氣 → 耳朵
- 所以,平時別人耳中聽到的你說話的聲音,就是你錄音中的聲音
人耳又是如何聽到聲音的呢?
大概過程是:聲源 → 耳廓(收集聲波) → 外耳道(傳遞聲波) → 鼓膜(將聲波轉換成振動) → 聽小骨(放大振動) → 耳蝸(將振動轉換成電信號) → 聽覺神經(傳遞電信號) → 大腦(形成聽覺)
如果只關注單個空氣分子,可以發現:它來回振動的軌跡,就是一個正弦或余弦函數的曲線圖
橫軸:代表時間。
縱軸:代表空氣分子來回振動時產生的位移。
平衡位置:該空氣分子的未受振動干擾時的位置
從平衡位置到最大位移位置之間的距離,叫做振幅(Amplitude)。
空氣分子完全來回振動一次所花費的時間,叫做周期(Period),單位是秒(s)。
物體每秒來回振動的次數,叫做頻率(Frequency),也就是周期分之一。
- 單位是秒分之一(1/s),也稱為赫茲(Hz)
- 比如440Hz代表物體每秒來回振動440次
- 因此,頻率用來表示物體振動的快慢
理論上,人類的發聲頻率是85Hz ~ 1100Hz,人類只能聽見20Hz ~ 20000Hz之間的聲音。
- 低于20Hz的稱為:次聲波(Infrasound)
- 高于20000Hz的稱為:超聲波(Ultrasound)
音調
頻率越高,音調就越高。
頻率越低,音調就越低。
通常女生講話時,聲帶振動的頻率就比較高,因此我們聽到的音調就高,而男生講話時,聲帶振動的頻率就比較低,因此我們聽到的音調就低。
響度
當提高聲音的響度(音量,大小)時,振動的幅度會變大。
我們常用dB(分貝)來描述聲音的響度。
| 0 | 剛能聽到的聲音 |
| 15以下 | 感覺安靜 |
| 30 | 耳語的音量大小 |
| 40 | 冰箱的嗡嗡聲 |
| 60 | 正常交談的聲音 |
| 70 | 相當于走在鬧市區 |
| 85 | 汽車穿梭的馬路上 |
| 95 | 摩托車啟動聲音 |
| 100 | 裝修電鉆的聲音 |
| 110 | 卡拉OK、大聲播放MP3的聲音 |
| 120 | 飛機起飛時的聲音 |
| 150 | 燃放煙花爆竹的聲音 |
音色
音色(Timbre)是指聲音的特色。
- 不同的聲源由于其材料、結構不同,則發出聲音的音色也不同
- 我們之所以能夠根據聲音區分出不同的樂器、不同的人,都是因為它們的音色不同
- 不同音色的聲音,即使在同一響度和同一音調的情況下,也能讓人區分開來
原理
通常聲源的振動產生的并不是單一頻率的聲波,而是由基音和不同頻率的泛音組成的復合聲音。
- 當聲源的主體振動時會發出一個基音(基本頻率,基頻,Fundamental Frequency)
- 同時其余各部分也有復合的聲源,這些聲源組合產生泛音
- 泛音(Overtone)其實就是物理學上的諧波(Harmonic)
音調是由基音決定的,而音色主要取決于泛音。
音色不同,波形也就不同。
聲音的最終波形是由多個不同的波形組合而成的。
噪音
聲源作無規則振動時發出的聲音
長期的噪音可以影響人的身心健康。
- 噪音可能導致各種不同程度的聽力喪失
- 長時間處于85分貝以上的噪音可以影響人的聽力
- 響于120分貝的噪音可以使人耳聾
研究表明:
- 讓人討厭的噪音和嬰兒啼哭及人類尖叫的聲音有著相同的頻率
- 人耳對2000Hz ~ 4000Hz范圍內的聲音是難以接受的
- 而指甲刮黑板聲音的特殊之處,就在于它的頻率,正好處于2000Hz ~ 4000Hz頻段內
大腦中的杏仁核(Amygdala)在聽到指甲刮黑板的聲音時,會異常興奮,于是霸道地接管了大腦聽覺的任務,向聽覺皮層(Auditory Cortex)發出痛苦的信息。聽覺皮層是屬于大腦皮層(大腦皮質,Cerebral Cortex)的一部分。
像素
一個圖的分辨率是60x50,用Photoshop放大圖片上百倍后,可以清晰地看到圖片由若干個方形的色塊組成,每一個方形的色塊被稱為:像素(Pixel)。這張圖片的每一行都有60個像素,共50行,總共60*50=3000個像素。
總結一下:
- 每張圖片都是由N個像素組成的(N≥1)
- 如果一張圖片的分辨率是WxH,那么:
- 每一行都有W個像素,共H行,總共W*H個像素
- 寬度是W像素,高度是H像素
每個像素都有自己獨立的顏色,若干個像素就組成了一張色彩繽紛的完整圖片。
RGB顏色模型
實驗發現:太陽光通過三棱鏡折射后,會被折射分散成紅、橙、黃、綠、藍、靛、紫7種單色光。其中的紅、綠、藍被稱為是色光三原色。
接下來,再看一個很重要的概念:RGB顏色模型(RGB color model),又稱為三原色光模式。
- 將紅(Red)、綠(Green)、藍(Blue)三原色的色光以不同的含量相疊加,可以合成產生各種色彩光
每個像素的顏色,可以通過紅色、綠色、藍色以不同的含量混合而成。比如:
- 紅色(Red)、綠色(Green)可以合成:黃色(Yellow)
- 紅色(Red)、藍色(Blue)可以合成:洋紅色(Magenta)
- 綠色(Green)、藍色(Blue)可以合成:青色(Cyan)
- 紅色(Red)、綠色(Green)、藍色(Blue)可以合成:白色(White)
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-YPGOyZWN-1634558631089)(C:\Users\jym\Desktop\497279-20210301182807299-1567553861.png)]
位深度
每一個像素的顏色信息是如何存儲的呢?
- 取決于圖片的位深度(Bit Depth),也稱為:色彩深度(Color Depth,簡稱:色深)
- 如果一張圖片的位深度為n,那么它的每一個像素都會使用n個二進制位來存儲顏色信息
位深度是24,它的具體含義是:
- 每一個像素都會使用24個二進制位來存儲顏色信息
- 每一個像素的顏色都是由紅(Red)、綠(Green)、藍(Blue)3個顏色通道合成的
- 每個顏色通道都用8bit來表示其“含量”(值),取值范圍是:
- 二進制:00000000~11111111
- 十進制:0~255
- 十六進制:00~FF
- 舉例:01000000 11100000 11010000(共24bit)表示綠寶石色(Turquoise)
- 紅色的值:二進制01000000,十進制64,十六進制40
- 綠色的值:二進制11100000,十進制224,十六進制E0
- 藍色的值:二進制11010000,十進制208,十六進制D0
- 64的紅色 + 224的綠色 + 208的藍色 = 綠寶石色
24bit顏色的表示形式
我們常用2種形式來表示24bit顏色,比如剛才提到的綠寶石色
- 十進制:rgb(64, 224, 208)
- 十六進制:#40E0D0
常見的24bit顏色:
- 紅色:rgb(255, 0, 0),#FF0000
- 綠色:rgb(0, 255, 0),#00FF00
- 藍色:rgb(0, 0, 255),#0000FF
- 黃色:rgb(255, 255, 0),#FFFF00
- 洋紅色:rgb(255, 0, 255),#FF00FF
- 青色:rgb(0, 255, 255),#00FFFF
- 白色:rgb(255, 255, 255),#FFFFFF
- 黑色:rgb(0, 0, 0),#000000
- 當紅綠藍全為0時,就是黑色
- 這個其實很容易理解:沒有任何光,自然是一片漆黑
- 所以說:黑色是世界上最純潔的顏色,因為它啥也沒有,(づ。????。)づ
- 相反,白色是世界上最不純潔的顏色,因為它啥都有,而且都是滿色(全是255)
- 更多顏色,可以參考顏色對照表,紅綠藍的比例不同,合成的顏色也就不同
顏色數量
如果位深度為n,那么每一個像素能顯示2n種顏色。
- 所以,位深度為24時,每一個像素能顯示224種顏色,也就是16777216種顏色(約1678萬)
- 24bit顏色,也被稱為是:真彩色(True Color),也就是常說的24位真彩
其他位深度
除了24bit,常見的位深度還有:
- 1bit:2種顏色,黑白兩色
- 3bit:8種顏色,用于大部分早期的電腦顯示器,紅綠藍各占1位
- 8bit:256種顏色,用于最早期的彩色Unix工作站,紅色占3位、綠色占3位、藍色占2位
- 16bit:紅色占5位、藍色占5位、綠色占6位
- 32bit:基于24位,增加8個位的透明通道
- 可以表示帶有透明度的顏色
- 比如CSS中的rgba(255, 0, 0, 0.5)表示50%透明度的紅色
不同位深度的對比
位深度越大,能表示的顏色數量就越多,圖片也就越鮮艷,顏色過渡就會越平滑。
格式
一說到圖片,馬上能想到拓展名為jpg、png、gif的圖片文件。
每張圖片都有自己的大小,一張圖片的大小是如何計算出來的?為什么dragon01.jpg的大小是288KB?
- 要想知道一張圖片的大小是多少?首先得知道每個像素的大小是多少。
- 如果位深度是n,那么每個像素的大小就是n個二進制位
分辨率是60x50,位深度是24,所以:
- 每個像素的大小是:24bit(3字節,1字節=8bit)
- 圖片的理論大小是:(6050)(24/8)=9000B≈8.79KB
但實際上會發現:在相同分辨率、相同位深度的前提下,把這張圖片存成2種不同的格式(jpg、png),它們的大小是不同的,而且都小于理論上的8.79KB。
其實jpg、png都是經過壓縮后的圖片(具體的壓縮算法和原理,就不在此討論了,大家可以到網上自行搜索),所以它們的大小會比理論值偏小。
圖片的壓縮類型可以分為2種:
- 無損壓縮
- 不損失圖片質量
- 壓縮比小,體積大
- 解壓(顯示)后能夠還原出完整的原始圖片數據,不會損失任何圖片信息
- 有損壓縮
- 會損失圖片質量
- 壓縮比大,體積小
- 解壓(顯示)后無法還原出完整的原始圖片數據,會損失掉一些圖片信息
- 壓縮比 = 未壓縮大小 / 壓縮后大小
| JPG(JPEG) | 有損壓縮 | 24bit |
| PNG | 無損壓縮 | 8bit、24bit、32bit |
| GIF | 無損壓縮 | 8bit |
眾所周知,gif是一種支持動畫的圖片,所以一般也叫作gif動態圖,微信的動態表情包就是基于gif動態圖。
gif動畫的實現原理類似手翻書。gif的動畫原理是:
- gif內部存儲了很多幀(張)靜態圖片
- 在短時間內,連續按順序地呈現每一幀靜態圖片,就形成了動畫的效果
動畫
不管是gif動態圖,還是手翻書,它們的動畫原理其實都基于:視覺暫留(Persistence of vision)現象。
- 當人眼所看到的影像消失后,人眼仍能繼續保留其影像約0.1~0.4秒左右,這種現象被稱為視覺暫留現象
- 人眼觀看物體時,成像于視網膜上,并由視神經輸入人腦,感覺到物體的像,但當物體移去時,視神經對物體的印象不會立即消失,而要延續0.1~0.4秒的時間,人眼的這種性質被稱為“眼睛的視覺暫留”
- 我們日常使用的日光燈每秒大約熄滅100余次,但我們基本感覺不到日光燈的閃動,這都是因為視覺暫留的作用
- 在一幀圖片消失在大腦中之前呈現下一幀圖片,反復如此,就可以形成連貫的動畫效果
- 電影的幀率是24fps
- fps:每秒的幀數,Frames Per Second
YUV
YUV,是一種顏色編碼方法,跟RGB是同一個級別的概念,廣泛應用于多媒體領域中。
也就是說,圖像中每1個像素的顏色信息,除了可以用RGB的方式表示,也可以用YUV的方式表示。
對比RGB,YUV有哪些不同和優勢呢?
體積更小
- 如果使用RGB
- 比如RGB888(R、G、B每個分量都是8bit)
- 1個像素占用24bit(3字節)
- 如果使用YUV
- 1個像素可以減小至平均只占用12bit(1.5字節)
- 體積為RGB888的一半
組成
RGB數據由R、G、B三個分量組成。
YUV數據由Y、U、V三個分量組成,現在通常說的YUV指的是YCbCr。
- Y:表示亮度(Luminance、Luma),占8bit(1字節)
- Cb、Cr:表示色度(Chrominance、Chroma)
- Cb(U):藍色色度分量,占8bit(1字節)
- Cr(V):紅色色度分量,占8bit(1字節)
兼容性
- Y分量對呈現出清晰的圖像有著很大的貢獻
- Cb、Cr分量的內容不太容易識別清楚
Y分量的內容:其實以前黑白電視的畫面就是這樣子。
YUV的發明處在彩色電視與黑白電視的過渡時期。
- YUV將亮度信息(Y)與色度信息(UV)分離,沒有UV信息一樣可以顯示完整的圖像,只不過是黑白的
- 這樣的設計很好地解決了彩色電視與黑白電視的兼容性問題,使黑白電視也能夠接收彩色電視信號,只不過它只顯示了Y分量
- 彩色電視有Y、U、V分量,如果去掉UV分量,剩下的Y分量和黑白電視相同
RGB和YUV轉換
公式1
Y = 0.257R + 0.504G + 0.098B + 16 U = -0.148R - 0.291G + 0.439B + 128 V = 0.439R - 0.368G - 0.071B + 128R = 1.164(Y - 16) + 2.018(U - 128) G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128) B = 1.164(Y - 16) + 1.596(V - 128)- RGB的取值范圍是[0,255]
- Y的取值范圍是[16,235]
- UV的取值范圍是[16,239]
公式2
Y = 0.299R + 0.587G + 0.114B U = 0.564(B - Y) = -0.169R - 0.331G + 0.500B V = 0.713(R - Y) = 0.500R - 0.419G - 0.081BR = Y + 1.403V G = Y - 0.344U - 0.714V B = Y + 1.770U- RGB的取值范圍是[0, 1]
- Y的取值范圍是[0, 1]
- UV的取值范圍是[-0.5, 0.5]
公式3
Y = 0.299R + 0.587G + 0.114B U = -0.169R - 0.331G + 0.500B + 128 V = 0.500R - 0.419G - 0.081B + 128R = Y + 1.403(V - 128) G = Y - 0.343(U - 128) - 0.714(V - 128) B = Y + 1.770(U - 128)- RGB的取值范圍是[0, 255]
- YUV的取值范圍是[0, 255]
色度二次采樣
原理
人眼的視網膜上,分布著兩種感光細胞:視桿細胞和視錐細胞。
- 視桿細胞
- 感知光線的強弱
- 沒有色彩識別功能
- 負責夜間非彩色視覺
- 視錐細胞
- 感知顏色
- 負責白天彩色視覺
- 如果你的視錐細胞發育不正常,數量太少,那感知顏色就會受阻,可能會導致你色弱
人眼中有上億個感光細胞,其中視桿細胞占了95%,而視錐細胞僅占5%。
因此,人眼對亮度的敏感程度要高于對色度的敏感程度,人眼對于亮度的分辨要比對顏色的分辨精細一些。
如果把圖像的色度分量減少一些,人眼也絲毫感覺不到變化和差異。
概念
如果在色度分量上進行(相對亮度分量)較低分辨率的采樣,也就是存儲較多的亮度細節、較少的色度細節,這樣就可以在不明顯降低畫面質量的同時減小圖像的體積。上述過程稱為:色度二次采樣(Chroma Subsampling)。
采樣格式
采樣格式通常用A:B:C的形式來表示,比如4:4:4、4:2:2、4:2:0等,其中我們最需要關注的是4:2:0。
- A:一塊A*2個像素的概念區域,一般都是4
- B:第1行的色度采樣數目
- C:第2行的色度采樣數目
- C的值一般要么等于B,要么等于0
下圖可以看出:最上面的圖像顏色是下面兩個圖像顏色疊加。
下圖可以看出 左右兩個圖像顏色疊加產生第三列的圖像顏色
上圖中,不管是哪種采樣格式,Y分量都是全水平、全垂直分辨率采樣的,每一個像素都有自己獨立的Y分量。
4:4:4
- 第1行采集4組CbCr分量,第2行采集4組CbCr分量
- 每1個像素都有自己獨立的1組CbCr分量
- Y分量與CbCr分量的水平方向比例是1:1(每1列都有1組CbCr分量)
- Y分量與CbCr分量的垂直方向比例是1:1(每1行都有1組CbCr分量)
- Y分量與CbCr分量的總比例是1:1
- 1個像素占用24bit(3字節),跟RGB888的體積一樣
- 24bpp(bits per pixel)
- 這種格式是沒有進行色度二次采樣的
4:2:2
- 第1行采集2組CbCr分量,第2行采集2組CbCr分量
- 水平方向相鄰的2個像素(1行2列)共用1組CbCr分量
- Y分量與CbCr分量的水平方向比例是2:1(每2列就有1組CbCr分量)
- Y分量與CbCr分量的垂直方向比例是1:1(每1行都有1組CbCr分量)
- Y分量與CbCr分量的總比例是2:1
- 1個像素平均占用16bit(2字節)
- 16bpp
- 因為2個像素共占用32bit(4字節 = 2個Y分量 + 1個Cb分量 + 1個Cr分量)
4:2:0
- 第1行采集2組CbCr分量,第2行共享第1行的CbCr分量
- 相鄰的4個像素(2行2列)共用1組CbCr分量
- Y分量與CbCr分量的水平方向比例是2:1(每2列就有1組CbCr分量)
- Y分量與CbCr分量的垂直方向比例是2:1(每2行就有1組CbCr分量)
- Y分量與CbCr分量的總比例是4:1
- 1個像素平均占用12bit(1.5字節)
- 12bpp
- 因為4個像素共占用48bit(6字節 = 4個Y分量 + 1個Cb分量 + 1個Cr分量)
H.264編碼
計算一下:10秒鐘1080p(1920x1080)、30fps的YUV420P原始視頻,需要占用多大的存儲空間?
- (10 * 30) * (1920 * 1080) * 1.5 = 933120000字節 ≈ 889.89MB
- 可以看得出來,原始視頻的體積是非常巨大的
由于網絡帶寬和硬盤存儲空間都是非常有限的,因此,需要先使用視頻編碼技術(比如H.264編碼)對原始視頻進行壓縮,然后再進行存儲和分發。H.264編碼的壓縮比可以達到至少是100:1。
H.264,又稱為MPEG-4 Part 10,Advanced Video Coding。
- 譯為:MPEG-4第10部分,高級視頻編碼
- 簡稱:MPEG-4 AVC
H.264是迄今為止視頻錄制、壓縮和分發的最常用格式。截至2019年9月,已有91%的視頻開發人員使用了該格式。H.264提供了明顯優于以前任何標準的壓縮性能。H.264因其是藍光盤的其中一種編解碼標準而著名,所有藍光盤播放器都必須能解碼H.264。
編碼器
H.264標準允許制造廠商自由地開發具有競爭力的創新產品,它并沒有定義一個編碼器,而是定義了編碼器應該產生的輸出碼流。
x264是一款免費的高性能的H.264開源編碼器。x264編碼器在FFmpeg中的名稱是libx264。
解碼器
H.264標準中定義了一個解碼方法,但是制造廠商可以自由地開發可選的具有競爭力的、新的解碼器,前提是他們能夠獲得與標準中采用的方法同樣的結果。
FFmpeg默認已經內置了一個H.264的解碼器,名稱是h264。
編碼過程與原理
大體可以歸納為以下幾個主要步驟:
- 劃分幀類型
- 幀內/幀間編碼
- 變換 + 量化
- 濾波
- 熵編碼
劃分幀類型
有統計結果表明:在連續的幾幀圖像中,一般只有10%以內的像素有差別,亮度的差值變化不超過2%,而色度的差值變化只在1%以內。
于是可以將一串連續的相似的幀歸到一個圖像群組(Group Of Pictures,GOP)。
GOP中的幀可以分為3種類型:
- I幀(I Picture、I Frame、Intra Coded Picture),譯為:幀內編碼圖像,也叫做關鍵幀(Keyframe)
- 是視頻的第一幀,也是GOP的第一幀,一個GOP只有一個I幀
- 編碼
- 對整幀圖像數據進行編碼
- 解碼
- 僅用當前I幀的編碼數據就可以解碼出完整的圖像
- 是一種自帶全部信息的獨立幀,無需參考其他圖像便可獨立進行解碼,可以簡單理解為一張靜態圖像
- P幀(P Picture、P Frame、Predictive Coded Picture),譯為:預測編碼圖像
- 編碼
- 并不會對整幀圖像數據進行編碼
- 以前面的I幀或P幀作為參考幀,只編碼當前P幀與參考幀的差異數據
- 解碼
- 需要先解碼出前面的參考幀,再結合差異數據解碼出當前P幀完整的圖像
- 編碼
- B幀(B Picture、B Frame、Bipredictive Coded Picture),譯為:前后預測編碼圖像
- 編碼
- 并不會對整幀圖像數據進行編碼
- 同時以前面、后面的I幀或P幀作為參考幀,只編碼當前B幀與前后參考幀的差異數據
- 因為可參考的幀變多了,所以只需要存儲更少的差異數據
- 解碼
- 需要先解碼出前后的參考幀,再結合差異數據解碼出當前B幀完整的圖像
- 編碼
不難看出,編碼后的數據大小:I幀 > P幀 > B幀。
GOP的長度
GOP的長度表示GOP的幀數。GOP的長度需要控制在合理范圍,以平衡視頻質量、視頻大小(網絡帶寬)和seek效果(拖動、快進的響應速度)等。
- 加大GOP長度有利于減小視頻文件大小,但也不宜設置過大,太大則會導致GOP后部幀的畫面失真,影響視頻質量
- 由于P、B幀的復雜度大于I幀,GOP值過大,過多的P、B幀會影響編碼效率,使編碼效率降低
- 如果設置過小的GOP值,視頻文件會比較大,則需要提高視頻的輸出碼率,以確保畫面質量不會降低,故會增加網絡帶寬
- GOP長度也是影響視頻seek響應速度的關鍵因素,seek時播放器需要定位到離指定位置最近的前一個I幀,如果GOP太大意味著距離指定位置可能越遠(需要解碼的參考幀就越多)、seek響應的時間(緩沖時間)也越長
GOP的類型
GOP又可以分為開放(Open)、封閉(Closed)兩種。
- Open
- 前一個GOP的B幀可以參考下一個GOP的I幀
- Closed
- 前一個GOP的B幀不能參考下一個GOP的I幀
- GOP不能以B幀結尾
需要注意的是:
- 由于P幀、B幀都對前面的參考幀(P幀、I幀)有依賴性,因此,一旦前面的參考幀出現數據錯誤,就會導致后面的P幀、B幀也出現數據錯誤,而且這種錯誤還會繼續向后傳播
- 對于普通的I幀,其后的P幀和B幀可以參考該普通I幀之前的其他I幀
在Closed GOP中,有一種特殊的I幀,叫做IDR幀(Instantaneous Decoder Refresh,譯為:即時解碼刷新)。
- 當遇到IDR幀時,會清空參考幀隊列
- 如果前一個序列出現重大錯誤,在這里可以獲得重新同步的機會,使錯誤不會繼續往下傳播
- 一個IDR幀之后的所有幀,永遠都不會參考該IDR幀之前的幀
- 視頻播放時,播放器一般都支持隨機seek(拖動)到指定位置,而播放器直接選擇到指定位置附近的IDR幀進行播放最為便捷,因為可以明確知道該IDR幀之后的所有幀都不會參考其之前的其他I幀,從而避免較為復雜的反向解析
幀內/幀間編碼
I幀采用的是幀內(Intra Frame)編碼,處理的是空間冗余。
P幀、B幀采用的是幀間(Inter Frame)編碼,處理的是時間冗余。
劃分宏塊
在進行編碼之前,首先要將一張完整的幀切割成多個宏塊(Macroblock),H.264中的宏塊大小通常是16x16。
宏塊可以進一步拆分為多個更小的變換塊(Transform blocks)、預測塊(Prediction blocks)。
- 變換塊的尺寸有:16x16、8x8、4x4
- 預測塊的尺寸有:16×16、16×8、8×16、8×8、8×4、4×8、4×4
幀內編碼
幀內編碼,也稱幀內預測。以4x4的預測塊為例,共有9種可選的預測模式。
利用幀內預測技術,可以得到預測幀,最終只需要保留預測模式信息、以及預測幀與原始幀的殘差值。
編碼器會選取最佳預測模式,使預測幀更加接近原始幀,減少相互間的差異,提高編碼的壓縮效率。
幀間編碼
幀間編碼,也稱幀間預測,用到了運動補償(Motion compensation)技術。
編碼器利用塊匹配算法,嘗試在先前已編碼的幀(稱為參考幀)上搜索與正在編碼的塊相似的塊。如果編碼器搜索成功,則可以使用稱為運動矢量的向量對塊進行編碼,該向量指向匹配塊在參考幀處的位置。
在大多數情況下,編碼器將成功執行,但是找到的塊可能與它正在編碼的塊不完全匹配。這就是編碼器將計算它們之間差異的原因。這些殘差值稱為預測誤差,需要進行變換并將其發送給解碼器。
綜上所述,如果編碼器在參考幀上成功找到匹配塊,它將獲得指向匹配塊的運動矢量和預測誤差。使用這兩個元素,解碼器將能夠恢復該塊的原始像素。
如果一切順利,該算法將能夠找到一個幾乎沒有預測誤差的匹配塊,因此,一旦進行變換,運動矢量加上預測誤差的總大小將小于原始編碼的大小。
如果塊匹配算法未能找到合適的匹配,則預測誤差將是可觀的。因此,運動矢量的總大小加上預測誤差將大于原始編碼。在這種情況下,編碼器將產生異常,并為該特定塊發送原始編碼。
變換與量化
接下來對殘差值進行DCT變換(Discrete Cosine Transform,譯為離散余弦變換)。
規格
H.264的主要規格有:
- Baseline Profile(BP)
- 支持I/P幀,只支持無交錯(Progressive)和CAVLC
- 一般用于低階或需要額外容錯的應用,比如視頻通話、手機視頻等即時通信領域
- Extended Profile(XP)
- 在Baseline的基礎上增加了額外的功能,支持流之間的切換,改進誤碼性能
- 支持I/P/B/SP/SI幀,只支持無交錯(Progressive)和CAVLC
- 適合于視頻流在網絡上的傳輸場合,比如視頻點播
- Main Profile(MP)
- 提供I/P/B幀,支持無交錯(Progressive)和交錯(Interlaced),支持CAVLC和CABAC
- 用于主流消費類電子產品規格如低解碼(相對而言)的MP4、便攜的視頻播放器、PSP和iPod等
- High Profile(HiP)
- 最常用的規格
- 在Main的基礎上增加了8x8內部預測、自定義量化、無損視頻編碼和更多的YUV格式(如4:4:4)
- High 4:2:2 Profile(Hi422P)
- High 4:4:4 Predictive Profile(Hi444PP)
- High 4:2:2 Intra Profile
- High 4:4:4 Intra Profile
- 用于廣播及視頻碟片存儲(藍光影片),高清電視的應用
部分內容來自網絡以及參考https://www.cnblogs.com/mjios/p/14810630.html
總結
以上是生活随笔為你收集整理的音频和视频的基础知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何截取视频片段 批量截取片段的方法
- 下一篇: 台式计算机的安装顺序,台式电脑安装系统步