視頻基礎(chǔ)知識
#編碼(生產(chǎn)部分)
? ??所謂視頻編碼方式就是指通過特定的壓縮技術(shù)漫贞,將某個視頻格式的文件轉(zhuǎn)換成另一種視頻格式文件的方式。視頻流傳輸中最為重要的編解碼標準有國際電聯(lián)的H.261臀稚、H.263、H.264乒融,運動靜止圖像專家組的M-JPEG和國際標準化組織運動圖像專家組的MPEG系列標準劲赠,此外在互聯(lián)網(wǎng)上被廣泛應(yīng)用的還有Real-Networks的RealVideo、微軟公司的WMV以及Apple公司的QuickTime等峡竣。
? ??MPEG-4第二部分可以用在網(wǎng)絡(luò)傳輸上靠抑。這里面MPEG-4第十部分和H.264的標準十分接近,兩個編碼組織甚至合作适掰,為這個標準命名為H.264/AVC颂碧,這也是目前主流的編碼格式,我們所看的很多視頻都是采用H.264編碼类浪。
MPEG系列
(由ISO[國際標準組織機構(gòu)]下屬的MPEG[運動圖象專家組]開發(fā) )視頻編碼方面主要是Mpeg1(vcd用的就是它)载城、Mpeg2(DVD使用)、Mpeg4(的DVDRIP使用的都是它的變種费就,如:divx诉瓦,xvid等)、Mpeg4 AVC(正熱門)力细;音頻編碼方面主要是MPEG Audio Layer 1/2睬澡、MPEG Audio Layer 3(大名鼎鼎的mp3)、MPEG-2 AAC 眠蚂、MPEG-4 AAC等等煞聪。注意:DVD音頻沒有采用Mpeg的。
H.26X系列
(由ITU[國際電傳視訊聯(lián)盟]主導逝慧,側(cè)重網(wǎng)絡(luò)傳輸昔脯,注意:只是視頻編碼)
包括H.261、H.262笛臣、H.263栅干、H.263+、H.263++捐祠、H.264(就是MPEG4 AVC-合作的結(jié)晶)?[1]
? ??圖像壓縮編碼有多種,如JPEG桑李、PSD踱蛀、GIF等窿给,把視頻的每一幀圖片壓縮成JPEG格式(編碼),就是Motion JPEG率拒。用這種視頻壓縮格式壓縮完的視頻還是會很大崩泡,難以傳輸和存儲。我們注意到猬膨,很多情況下角撞,視頻每兩幀之間的畫面差異并不大,所以記錄兩幀圖片的全量數(shù)據(jù)會有很多重復數(shù)據(jù)勃痴,這樣谒所,我們就可以記錄增量,從而大大減少數(shù)據(jù)存儲量沛申。H264就采用了這種存增量的思想劣领,以高壓縮高質(zhì)量和支持多種網(wǎng)絡(luò)的流媒體傳輸著稱。H264采用的核心算法是幀內(nèi)壓縮和幀間壓縮铁材,幀內(nèi)壓縮是生成I幀的算法尖淘,幀間壓縮是生成B幀和P幀的算法。I幀表示關(guān)鍵幀著觉,可以理解為這一幀畫面的完整保留村生,解碼時只需要本幀數(shù)據(jù)就可以完成;P幀解碼時饼丘,需要它前一幀的信息趁桃;B幀解碼時需要它前一幀和后一幀的數(shù)據(jù)。
#封裝格式(包裝部分)
? ? 封裝格式(也叫容器)葬毫,就是將已經(jīng)編碼壓縮好的視頻軌和音頻軌按照一定格式放到一個文件中镇辉,也就是說,僅僅是一個外殼贴捡。通俗講:視頻軌是米飯忽肛,音頻軌是菜,封裝格式就是一個鍋或者碗烂斋。
AVI:微軟在90年代初創(chuàng)立的封裝標準屹逛,壓縮標準可任意選擇。
FLV:針對于h.263家族的格式汛骂,ts流媒體格式罕模,電視。
MKV:萬能封裝器帘瞭,有良好的兼容和跨平臺性淑掌、糾錯性,可帶?外掛字幕蝶念。
MOV:MOV是Quicktime封裝抛腕。
MP4:主要應(yīng)用于mpeg4的封裝 芋绸。
TS/PS:PS封裝只能在HDDVD原版。
WMV:微軟推出的担敌,作為市場競爭摔敛。
#解碼
? ? 解碼,是編碼流程的逆過程全封。
#重采樣
????Android放音的采樣率固定為44.1KHz马昙,錄音的采樣率固定為8KHz,因此底層的音頻設(shè)備驅(qū)動需要設(shè)置好這兩個固定的采樣率刹悴。如果上層傳過來的采樣率不符的話行楞,需要進行resample重采樣處理。
?幾個名詞:
1. 采樣率
? ? 采樣設(shè)備每秒抽取樣本的次數(shù)
2.?音頻格式及量化精度(位寬)
? ? 每種音頻格式有不同的量化精度(位寬)颂跨,位數(shù)越多敢伸,表示值就越精確,聲音表現(xiàn)自然就越精準恒削。FFMpeg中音頻格式有以下幾種池颈,每種格式有其占用的字節(jié)數(shù)信息:
AV_SAMPLE_FMT_U8, ///< unsigned 8 bits?
AV_SAMPLE_FMT_S16, ///< signed 16 bits
?AV_SAMPLE_FMT_S32, ///< signed 32 bits
?AV_SAMPLE_FMT_FLT, ///< float?
?AV_SAMPLE_FMT_DBL, ///< double
3.?分片(plane)和打包(packed)
? ? 以雙聲道為例,帶P(plane)的數(shù)據(jù)格式在存儲時钓丰,其左聲道和右聲道的數(shù)據(jù)是分開存儲的躯砰,左聲道的數(shù)據(jù)存儲在data[0],右聲道的數(shù)據(jù)存儲在data[1]携丁,每個聲道的所占用的字節(jié)數(shù)為linesize[0]和linesize[1]琢歇;
? ? 不帶P(packed)的音頻數(shù)據(jù)在存儲時,是按照LRLRLR...的格式交替存儲在data[0]中梦鉴,linesize[0]表示總的數(shù)據(jù)量李茫。
4.?聲道分布(channel_layout)
? ? 聲道分布在FFmpeg\libavutil\channel_layout.h中有定義,一般來說用的比較多的是AV_CH_LAYOUT_STEREO(雙聲道)和AV_CH_LAYOUT_SURROUND(三聲道)
#像素格式
????RGB是一種常見的顏色編碼方法肥橙,在顯示器上魄宏,是通過電子槍打在屏幕的紅(Red)、綠(Green)存筏、藍(Blue)三色發(fā)光極上來產(chǎn)生色彩的; 而相機采集到的圖像是使用YUV顏色編碼方式,“Y”表示明亮度宠互,“U”和“V”則是色度、濃度椭坚。我們的視頻就是由相機采集到的予跌,所以我們要處理的視頻里每一幀的顏色編碼格式為YUV,要顯示到屏幕上到話善茎,需要處理頻里每一幀的顏色編碼格式券册,YUV 轉(zhuǎn)換為RGB。RGB存放方式:矩陣每一行做了對其操作,每行數(shù)據(jù)后會多一些數(shù)據(jù)汁掠。
大體開發(fā)階段
1.做一個播放自定義格式視頻的視頻播放器略吨。【原因:輸入我們系統(tǒng)的視頻格式是各式各樣的考阱,如mp4、mov等鞠苟,我們需要將他們處理成我們自定義的視頻格式乞榨,再進行視頻編輯處理】
2.做視頻裁剪
3.做視頻改分辨率、播放速度等
環(huán)境搭建
1.安裝android Studio
2.新建android項目
3.下載NDK当娱,點擊右上角的下載圖標吃既,找到SDK Tools,下載一下相關(guān)包跨细。
概念補充
參考https://blog.csdn.net/carson_ho/article/details/73250163
(1). JNI介紹
? ? 1.1簡介
? ? JNI鹦倚,全稱:Java Native Interface ,即java本地接口,作用:使得Java與本地其他類型語言(如c冀惭、 c++)交互震叙。
?????JNI是java調(diào)用Native語言的一種特性, JNI屬于java散休,與android無直接關(guān)系????
? ? 1.2實現(xiàn)步驟
? ? 1.在Java中聲明Native方法(即需要調(diào)用的本地(c++)方法)
? ? 2.編譯上述Java源文件javac(得到.class文件)
? ? 3.通過javah命令導出JNI的頭文件(.h文件)
? ? 4.使用java需要交互的本地代碼(c++) 實現(xiàn)在Java中聲明的Native方法
? ? 5.編譯.so庫文件
? ? 6.通過java命令執(zhí)行java程序媒楼,最終實現(xiàn)java調(diào)用本地代碼(c++)
(2). NDK介紹
? ? 2.1簡介
? ? NDK,全稱Native Development Kit,是Android的一個開發(fā)工具包戚丸,屬于android划址,與java無直接關(guān)系。作用:快速開發(fā)C限府、C++的動態(tài)庫夺颤,并自動將so的應(yīng)用一起打包成APK,即 可以通過NDK在Android中使用JNI與本地代碼(如C胁勺、C++)交互
? ??NDK允許用戶使用類似C / C++之類的原生代碼語言執(zhí)行部分程序
? ? 提供交叉編譯功能世澜,交叉編譯就是在一個平臺上生成另一個平臺上的可執(zhí)行代碼,在ndk中就是姻几,在把電腦上(x86架構(gòu))的代碼編譯成手機上(arm架構(gòu))的可執(zhí)行代碼宜狐。
? ? 在android studio中,通過NDK從而實現(xiàn)JNI的功能
? ? 其他解釋:
? ??NDK是一個工具集蛇捌,允許你的App使用一些底層語言代碼抚恒,例如C和C++。
????NDK提供一系列的工具络拌,幫助開發(fā)者快速的開發(fā)C(或者C++)動態(tài)庫俭驮,并能自動將這些.so庫文件和Java應(yīng)用程序打包到APK中。同時NDK工具集成了交叉編譯器,并提供了相應(yīng)的mk文件混萝,隔離了CPU遗遵、平臺、ABI等差異逸嘀,開發(fā)人員只需要簡單修改mk文件(指出“哪些文件需要編譯”车要、“編譯特性要求”等),就可以創(chuàng)建出so庫崭倘。這些將極大方便應(yīng)用開發(fā)者翼岁。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(原文:https://blog.csdn.net/chewbee/article/details/51927105)
? ? 2.2實現(xiàn)步驟
? ? 1. 配置 Android NDK環(huán)境
? ? 2. 創(chuàng)建 Android 項目,并與 NDK進行關(guān)聯(lián)
? ? 3. 在 Android 項目中聲明所需要調(diào)用的 Native方法
????4. 使用 Android需要交互的本地代碼 實現(xiàn)在Android中聲明的Native方法
? ? ? ? eg.比如 Android 需要與 C++ 交互司光,那么就用C++ 實現(xiàn) Java的Native方法
????5. 通過 ndk - bulid 命令編譯產(chǎn)生.so庫文件
? ? 6. 編譯 Android Studio 工程琅坡,從而實現(xiàn) Android 調(diào)用本地代碼
(3)NDK和JNI的關(guān)系
? ? 1.JNI是實現(xiàn)的方法残家,NDK是在android中實現(xiàn)JNI的手段榆俺。即,在android studio中坞淮,通過NDK來實現(xiàn)JNI功能
4.建git倉庫
5.把ffmapeg編譯到安卓平臺上(坑較多)
作業(yè)
把ffmapeg編譯到安卓平臺上流程理解