目錄:
1、為什么選擇FFmpeg?
2、Windows開發環境搭建(包括FFmpeg和Qt)
3、Mac開發環境搭建(包括FFmpeg和Qt)
4、重識圖片
5、重識聲音
6、重識音頻?之 PCM(脈沖編碼調制)
7、重識音頻?之 音頻的編碼與解碼
8、重識音頻之?常見的音頻編碼和文件格式
1、為什么選擇FFmpeg?
????????FFmpeg是跨平臺的音視頻開發庫。而且掌握了FFmpeg,可以很快上手其他音視頻開發庫,因為底層原理都是一樣的,最終操作的都是一樣的數據,比如MP3、MP4文件。
其他平臺開發庫簡介:iOS:AVFoundation、AudioUnit等;android:MediaPlayer、MediaCodec等;Windows:DriectShow等;
2、Windows開發環境搭建(包括FFmpeg和Qt)
3、Mac開發環境搭建(包括FFmpeg和Qt)
? ? Qt安裝參考https://www.cnblogs.com/GJ-ios/p/15674851.html
? ? Qt運行不起來:https://blog.csdn.net/qq_35664104/article/details/121480884
? ? Qt學習:http://c.biancheng.net/view/1817.html
4、重識圖片
? ? ? ? 包括像素、色深、文件格式(壓縮格式)
????1)、RGB顏色模型:將紅綠藍三原色的色光以不同的含量疊加可以合成各種顏色。
????2)、RGB位深度24的含義:每一個像素使用24個二進制位來存儲顏色信息;每一個像素的顏色是由RGB 3個顏色通道合成的,因此每個顏色通道都用8bit來表示其“含量”(值)。
?? ? ? 位深度有1、3、8、16、24、32等,這些可以網上查。對于32位深度,是在24的基礎上增加了8bit的透明度,可以表示帶透明度的顏色。
????3)、顏色數量:2的n次方,n為位深度。位深度24能展示的顏色有1678萬種,因此被稱為真彩色,即常說的24位真彩。
????4)、LCD屏幕有兩層,上層是RGB像素層,用于控制哪個顏色濾光,下層為背光層(發光);OLED屏幕沒有背光層了,每一個像素獨立發光,更節能,缺點是壽命短。
????5)、圖片格式(文件格式):將圖片按照一定的惡格式壓縮存儲。比如50*60像素24位深度的圖片原始大小為8.79KB,jpg格式存儲后為1.56KB。無損壓縮:優點不損失圖片質量,缺點壓縮率低,體積大,如png、gif。有損壓縮:優點壓縮率高,體積小,缺點損失圖片質量,如jpg。
????6)、jpg、png、gif格式是位圖,就是上面介紹的圖片;svg是矢量圖,上面未介紹。
5、重識聲音
? ? ? ? 1)、振幅:從平衡位置到最大位移位置之間的距離
? ? ? ? 2)、頻率(Frequency):物體每秒來回振動的次數。
? ? ? ? 2)、周期:完全來回振動一次所花費的時間
? ? ? ? 3)、音調:頻率越高,音調就越高;頻率越低,音調就越低。通常女生講話時,聲帶振動的頻率就比較高,因此我們聽到的音調就高,有時會有點刺耳,而男生講話時,聲帶振動的頻率就比較低,因此我們聽到的音調就低,顯得比較低沉。
? ? ? ? 4)、響度:常用dB(分貝)來描述。當提高聲音的響度(音量,大小)時,振動的幅度會變大。
? ? ? ? 5)、音色(Timbre)是指聲音的特色。不同的聲源由于其材料、結構不同,則發出聲音的音色也不同。我們之所以能夠根據聲音區分出不同的樂器、不同的人,都是因為它們的音色不同。不同音色的聲音,即使在同一響度和同一音調的情況下,也能讓人區分開來。
? ? ? ? 6)、基音、泛音:通常聲源的振動產生的并不是單一頻率的聲波,而是由基音和不同頻率的泛音組成的復合聲音。當聲源的主體振動時會發出一個基音(基本頻率,基頻,Fundamental Frequency)。同時其余各部分也有復合的聲源,這些聲源組合產生泛音。泛音(Overtone)其實就是物理學上的諧波(Harmonic)。音調是由基音決定的,而音色主要取決于泛音。
6、重識音頻?之 PCM(脈沖編碼調制)
? ? ? ? 1)、如何把聲音(聲源的振動)記錄下來呢?聲音屬于模擬信號,但更便于計算機處理和存儲的是數字信號(二進制編碼),所以需要將模擬信號(Analog Signal)轉成數字信號(Digital Signal)后進行存儲。這一過程,我們可以稱之為:音頻數字化。將音頻數字化的常見技術方案是脈沖編碼調制(PCM,Pulse Code Modulation),主要過程是:采樣 → 量化 → 編碼。
? ? ? ? 2)、采樣
模擬信號的波形是無限光滑的,可以看成由無數個點組成,由于存儲空間是相對有限的,數字編碼過程中,必須要對波形的點進行采樣。采樣(Sampling):每隔一段時間采集一次模擬信號的樣本,是一個在時間上將模擬信號離散化(把連續信號轉換成離散信號)的過程。
? ? ? ? (1)、采樣率(采樣頻率,采樣速率,Sampling Rate):每秒采集的樣本數量。根據采樣定理(奈奎斯特–香農采樣定理,Nyquist-Shannon sampling theorem)得知:只有當采樣率高于聲音信號最高頻率的2倍時,才能把采集的聲音信號唯一地還原成原來的聲音。人耳能夠感覺到的最高聲音頻率為20000Hz,因此為了滿足人耳的聽覺要求,需要至少每秒進行40000次采樣(40kHz采樣率)。這就是為什么常見的CD的采樣率為44.1kHz。電話、無線對講機、無線麥克風等的采樣率是8kHZ。
? ? ????3)、量化(Quantization):將每一個采樣點的樣本值數字化。位深度(采樣精度,采樣大小,Bit Depth):使用多少個二進制位來存儲一個采樣點的樣本值。位深度越高,表示的振幅越精確。常見的CD采用16bit的位深度,能表示65536個不同的值。DVD使用24bit的位深度,大多數電話設備使用8bit的位深度。
? ? ????4)、編碼:將采樣和量化后的數字數據轉成二進制碼流。
? ? ????5)、聲道:單聲道產生一組聲波數據,雙聲道(立體聲)產生兩組聲波數據。
? ? ? ? 6)、聲音大小計算
????????????????采樣率44.1kHZ、位深度16bit的1分鐘立體聲PCM數據有多大?
????????????????采樣率 * 位深度 * 聲道數 * 時間
? ??????????????44100 * 16 * 2 * 60 / 8 ≈ 10.34MB
????????????????1分鐘10.34MB,這對于大部分用戶來說是不能接受的。要想在不改變音頻時長的前提下,降低音頻數據的大小,只有2種方法:降低采樣指標、壓縮。降低采樣指標是不可取的,會導致音頻質量下降,用戶體驗變差,因此專家們研發了各種壓縮方案,即各種編碼。
? ? ? ? 7)、比特率(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
????????????????通常,采樣率、位深度越高,數字化音頻的質量就越好。從比特率的計算公式可以看得出來:比特率越高,數字化音頻的質量就越好。
? ? ? ? 8)、信噪比(Signal-to-noise ratio,SNR,S/N,訊噪比),指信號與噪聲的比例,用于比較所需信號的強度與背景噪聲的強度,以分貝(dB)為單位。位深度限制了信噪比的最大值,它們的關系如下表所示。
7、重識音頻?之 音頻的編碼與解碼
? ? ? ? 1)、編碼(Encode)
????????????????PCM數據可以理解為是:未經壓縮的原始音頻數據,體積比較大,為了更便于存儲和傳輸,一般都會使用某種音頻編碼對它進行編碼壓縮,然后再存成某種音頻文件格式。壓縮分為無損壓縮和有損壓縮。
? ??????????????無損壓縮:解壓后可以完全還原出原始數據;壓縮比小,體積大
? ??????????????有損壓縮:解壓后不能完全還原出原始數據,會丟失一部分信息;壓縮比大,體積小;壓縮比越大,丟失的信息就越多,還原后的信號失真就會越大;一般是通過舍棄原始數據中對人類聽覺不重要的部分,達成壓縮成較小文件的目的。
????????????????壓縮比 = 未壓縮大小 / 壓縮后大小
? ? ? ? ? ? ? ? 編碼后為什么要存儲為不同的音頻文件格式、容器?答案:音視頻編碼主要是對音視頻PCM進行壓縮,很多時候音頻編碼數據、視頻編碼數據、字幕需要同時展示給用戶,因此產生了不同的文件格式,作為容器同時存儲多種編碼數據。
? ? ? ? 2)、解碼(Decode)
????????????????當需要播放音頻時,先從音頻文件中取出壓縮數據,解碼(解壓縮)出PCM數據,然后再進行播放。
8、重識音頻之?常見的音頻編碼和文件格式
????????需要注意的是:音頻文件格式并不等于音頻編碼。比如:WAV只是一種文件格式,并不是一種編碼;FLAC既是一種文件格式,又是一種編碼。
下面對常見的音頻編碼和文件格式做一個簡介,以后有需要時再進行詳細介紹。
無損
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系統中。
WAV的文件格式如下圖所示,前面有44個字節的文件頭,緊跟在后面的就是音頻數據(比如PCM數據)。
WAV文件格式
WAV文件格式
NumChannels:聲道數
SampleRate:采樣率(Hz)
ByteRate:每秒多少個字節(Byte/s)
BitsPerSample:位深度
AIFF
AIFF(Audio Interchange File Format),由Apple開發的音頻文件格式,擴展名是.aiff、.aif。跟WAV一樣,通常采用PCM編碼,常用于Mac系統中。
有損和無損
根據采樣率和位深度可以得知:相對于自然界的信號,音頻編碼最多只能做到無限接近,任何數字音頻編碼方案都是有損的,因為無法完全還原。目前能夠達到最高保真水平的就是PCM編碼,因此,PCM約定俗成叫做無損音頻編碼,被廣泛用于素材保存及音樂欣賞,CD、DVD以及常見的WAV文件中均有應用。但并不意味著PCM就能夠確保信號絕對保真,PCM也只能做到最大程度的無限接近。我們習慣性的把MP3列入有損音頻編碼范疇,是相對于PCM編碼的。