27.Android Studio下FFmpeg的編譯和使用(一.音視訊基礎知識概要)
前言
之前寫了很多關於ndk的文章,也以FFmpeg的編譯為例大概的講述了一次ndk開發從編譯到使用的過程,但是內容過於分散,而且有些東西已經過時,比如eclipse工具,比如ndk-build的編譯方式以及之前ffmpeg使用的2.x的版本,這些都已經漸漸的不被使用了,這次打算在Android+Studio/">Android Studio的工具下使用Cmake的編譯方式,編譯較新的ffmpeg版本,完成一次完整的編譯開發過程,實現一次功能較完備的ffmpeg播放器。目前最新的ffmpeg是4.x,我這次打算使用3.x的進行編譯,因為每一個版本對應的編譯指令碼也是有所不同的,使用相同的指令碼並不能成功的適應所有的version。所以我們必須針對它版本的更新去調整我們的指令碼。ffmpeg功能強大,我也是在學習的過程中,有些地方可能寫的不夠完善,還望各位多多指正。
本文這次主要以音視訊的基礎內容為主
MPEG-4
一套用於音訊、視訊資訊的壓縮編碼標準,MPEG4於1998 年11 月公佈,原預計1999 年1月投入使用的國際標準MPEG4不僅是針對一定位元率下的視訊、音訊編碼,更加註重多媒體系統的互動性和靈活性。MPEG專家組的專家們正在為MPEG-4的制定努力工作。MPEG-4標準主要應用於視像電話(Video Phone),視像電子郵件(Video Email)和電子新聞(Electronic News)等,其傳輸速率要求較低,在4800-64000bits/sec之間,解析度為176X144。MPEG-4利用很窄的頻寬,通過幀重建技術,壓縮和傳輸資料,以求以最少的資料獲得最佳的影象質量。
常用封裝格式
AVI
壓縮標準可任意選擇,AVI英文全稱為Audio Video Interleaved,即音訊視訊交錯格式,是微軟公司於1992年11月推出、作為其Windows視訊軟體一部分的一種多媒體容器格式。AVI檔案將音訊(語音)和視訊(影像)資料包含在一個檔案容器中,允許音視訊同步回放。類似DVD視訊格式,AVI檔案支援多個音視訊流。AVI資訊主要應用在多媒體光碟上,用來儲存電視、電影等各種影像資訊。
FLV
流媒體格式,FLV 是FLASH VIDEO的簡稱,FLV流媒體格式是隨著Flash MX的推出發展而來的視訊格式。由於它形成的檔案極小、載入速度極快,使得網路觀看視訊檔案成為可能,它的出現有效地解決了視訊檔案匯入Flash後,使匯出的SWF檔案體積龐大,不能在網路上很好的使用等問題。
ASF
ASF是(Advanced Streaming Format) 高階串流格式的縮寫,是 Microsoft 為 Windows 98 所開發的串流多媒體檔案格式。同JPG/JPG、MPG檔案一樣,ASF檔案也是一種檔案型別,但是特別適合在IP網上傳輸。ASF是微軟公司Windows Media的核心,這是一種包含 ofollow,noindex">音訊 、視訊、影象以及控制命令指令碼的資料格式。這個詞彙當前可和 WMA 及 WMV 互換使用。利用ASF檔案可以實現點播功能、直播功能以及遠端教育,具有本地或網路回放、可擴充的媒體型別等優點。
MP4
MP4是一套用於音訊、視訊資訊的壓縮編碼標準,由國際標準化組織(ISO)和國際電工委員會(IEC)下屬的“動態影象專家組”(Moving Picture Experts Group,即MPEG)制定,第一版在1998年10月通過,第二版在1999年12月通過。MPEG-4格式的主要用途在於網上流、光碟、語音傳送(視訊電話),以及電視廣播。
MPEG-4包含了MPEG-1及MPEG-2的絕大部份功能及其他格式的長處,並加入及擴充對虛擬現實模型語言(VRML , VirtualReality Modeling Language)的支援,面向物件的合成檔案(包括音效,視訊及VRML物件),以及數字版權管理(DRM)及其他互動功能。而MPEG-4比MPEG-2更先進的其中一個特點,就是不再使用巨集區塊做影像分析,而是以影像上個體為變化記錄,因此儘管影像變化速度很快、位元速率不足時,也不會出現方塊畫面。

H@CWAK)R@E)Z@CK1`)QBI6O.png
常用視訊編碼格式
H264
H.264,同時也是MPEG-4第十部分,是由ITU-T視訊編碼專家組(VCEG)和ISO/IEC動態影象專家組(MPEG)聯合組成的聯合視訊組(JVT,Joint Video Team)提出的高度壓縮數字視訊編解碼器標準。這個標準通常被稱之為H.264/AVC(或者AVC/H.264或者H.264/MPEG-4 AVC或MPEG-4/H.264 AVC)而明確的說明它兩方面的開發者。
H264標準各主要部分有Access Unit delimiter(訪問單元分割符),SEI(附加增強資訊),primary coded picture(基本影象編碼),Redundant Coded Picture(冗餘影象編碼)。還有Instantaneous Decoding Refresh(IDR,即時解碼重新整理)、Hypothetical Reference Decoder(HRD,假想參考解碼)、Hypothetical Stream Scheduler(HSS,假想碼流排程器)。
WMV
WMV(Windows Media Video)是微軟開發的一系列視訊編解碼和其相關的視訊編碼格式的統稱,是微軟Windows媒體框架的一部分。WMV包含三種不同的編解碼:作為RealVideo的競爭對手,最初為Internet上的流應用而設計開發的WMV原始的視訊壓縮技術;另一種是為滿足特定內容需要的WMV螢幕和WMV影象的壓縮技術;在經過SMPTE(Society of Motion Picture and Television Engineers)學會標準化以後,WMV版本9被採納作為物理介質的釋出格式,比如高清DVD和藍光光碟,即所謂的VC-1。
Xvid
Xvid是一個開放原始碼的MPEG-4視訊編解碼器,它是基於OpenDivX而編寫的。Xvid是由一群原OpenDivX義務開發者在OpenDivX於2001年7月停止開發後自行開發的。Xvid支援多種編碼模式,量化(Quantization)方式和範圍控,運動偵測(Motion Search)和曲線平衡分配(Curve)等眾多編碼技術,對使用者來說功能十分強大。Xvid的主要競爭對手是DivX。但Xvid是開放原始碼的,而DivX則只有免費(不是自由)的版本和商用版本。
MJPEG
MJPEG(技術即運動靜止影象(或逐幀) 壓縮技術 )是24-bit的"true-color"影像標準。MJPEG的工作是將RGB格式的影像 轉換 成YCrCB格式,目的是為了減少檔案大小,一般約可減少1/3~1/2左右。

QQ圖片20180924111401.png
常用音訊編碼格式
AAC
AAC(Advanced Audio Coding),中文名:高階音訊編碼,出現於1997年,基於MPEG-2的音訊編碼技術。由Fraunhofer IIS、杜比實驗室、AT&T、Sony等公司共同開發,目的是取代MP3格式。2000年,MPEG-4標準出現後,AAC重新集成了其特性,加入了SBR技術和PS技術,為了區別於傳統的MPEG-2 AAC又稱為MPEG-4 AAC。
APE
APE是流行的數字音樂無失真壓縮格式之一,因出現較早,在全世界特別是中國大陸有著廣泛的使用者群。與MP3這類有失真壓縮格式不可逆轉地刪除(人耳聽力不敏感的)資料以縮減原始檔體積不同,APE這類無失真壓縮格式,是以更精煉的記錄方式來縮減體積,還原後資料與原始檔一樣,從而保證了檔案的完整性。APE由軟體Monkey's audio壓制得到,開發者為Matthew T. Ashland,原始碼開放,因其介面上有隻“猴子”標誌而出名。相較同類檔案格式FLAC,ape有查錯能力但不提供糾錯功能,以保證檔案的無損和純正;其另一個特色是壓縮率約為55%,比FLAC高,體積大概為原CD的一半,便於儲存。
FLAC
FLAC中文可解釋為無損音訊壓縮編碼。FLAC是一套著名的自由音訊壓縮編碼,其特點是無失真壓縮。不同於其他有失真壓縮編碼如MP3 及AAC,它不會破壞任何原有的音訊資訊,所以可以還原音樂光碟音質。2012年以來它已被很多軟體及硬體音訊產品(如CD等)所支援。
MP3
MP3是一種音訊壓縮技術,其全稱是動態影像專家壓縮標準音頻層面3(Moving Picture Experts Group Audio Layer III),簡稱為MP3。它被設計用來大幅度地降低音訊資料量。利用 MPEG Audio Layer 3 的技術,將音樂以1:10 甚至 1:12 的壓縮率,壓縮成容量較小的檔案,而對於大多數使用者來說重放的音質與最初的不壓縮音訊相比沒有明顯的下降。它是在1991年由位於德國埃爾朗根的研究組織Fraunhofer-Gesellschaft的一組工程師發明和標準化的。用MP3形式儲存的音樂就叫作MP3音樂,能播放MP3音樂的機器就叫作MP3播放器。
H。264/AVC視訊編碼標準
視訊編碼層面(VCL)
-視訊資料的內容
網路抽象層面
-格式化資料並提供頭資訊
NAL單元
每幀資料就是一個NAL單元(SPS與PPS除外),在實際的H264資料幀中,往往幀前面帶有00 00 00 01或00 00 01分隔符,一般來說編碼器編出的首幀資料為PPS與SPS,接著為幀

948K_(}5_CUX9P6YP)209YF.png
GOP
所謂GOP,意思是畫面組,MPEG格中的幀序列,分為I、P、B三種,如排成IBBPBBPBBPBBPBBP...樣式,這種連續的幀圖片組合即為GOP(畫面群,GROUP OF PICTURE),是MPEG將來存取的最本基本的單位,它的排列順序將會一直重複到影像結束。一個GOP就是一組連續的IPB畫面。MPEG編碼將畫面(即幀)分為I、P、B三種,I是內部編碼幀,P是前向預測幀,B是雙向內插幀。簡單地講,I幀是一個完整的畫面,而P幀和B幀記錄的是相對於I幀的變化。沒有I幀,P幀和B幀就無法解碼,這就是MPEG格式難以精確剪輯的原因,也是我們之所以要微調頭和尾的原因。

QQ圖片20180924111733.png
畫素格式
yuv和rgb的轉換公式,播放視訊的時候需要將yuv轉換之後才可以進行顯示

QQ圖片20180924111850.png
PCM音訊引數
取樣率sample_rate 44100 (CD)
通道channels(左右聲道)
樣本大小 sample_size
樣本型別plannar
AV_SAMPLE_FMT_S16在記憶體的格式為:
c1,c2,c1,c2,c1,c2...
AV_SAMPLE_FMT_S16P在記憶體的格式為:
c1,c1,c1,...,c2,c2,c2,...