androidfaac編譯
『壹』 android如何使用fdk-aac編碼庫來把aac轉成pcm
線性PCM就是WAV。
AAC-LC是AAC的一個規格,你下載到或者轉換的這些高碼率的AAC都是AAC-LC的。
擴展名是.m4a。
.aac 是aac的音頻數據流,m4a是aac的一個封裝方式。其內容本身是一樣的。
我用s754,和e453功能是一樣的。m4a和wav的我都放了,沒問題,只是.aac的我還沒試過。
但我相信lz沒有.aac的。。因為這年頭你下載到的或者轉換出來的都是m4a的
『貳』 怎樣用AACLib V1.0在Android上音頻編碼解碼
這幾天在 android上的音頻項目,順便把用到的aac編解碼庫封裝了一下,有需要的可以從上面下載。當然是沒有本事自己寫編解碼器的,還是用FFmpeg + FDK_aac來做。下面介紹一下其java介面的使用。java庫見libaac.jar文件,把libaac.jar加到 libs目錄下,把libaac.so加到 libs/armeabi目錄即可使用。
AAC編碼:
(1) 創建一個Encoder對象作為成員變數
aac.Encoder encoder;
(2) 初始化它
encoder = new aac.Encoder();
if(! encoder.open(11025, 1))
{
Log.d("mylog", "failed to open encoder !\n");
encoder = null;
}
這里要指定輸入音頻源(PCM格式)的sampe_rate和channel個數,如果為CHANNEL_OUT_MONO,則channel=1,否則為2。 sample_rate一般設置為11025,因為手機性能有限,設置太高的話也處理不過來,而且處理人聲的話11025也是足夠了。
(3) 編碼
把接收到PCM數據交給encoder來處理即可,要求輸入源為ENCODING_PCM_16BIT,即每個sample是16BIT的。這個encoder對象內有2個緩沖區:inbuf, outbuf。顯然,在編碼時,inbuf就是用於存儲接收到的PCM數據,outbuf就是存編碼後得到的數據。
int out_size = encoder.encode(in_size);
其返回值out_size,表示在outbuf里的有效數據長度。此時可以把outbuf里的aac數據通過網路發送或其他用途。
其中,用戶需要知道encoder每次處理多長的數據,即一個frame的大小。對於單聲道MONO來說,每次應該輸入2048byte的數據。對於雙聲道STEREO來說,應該輸入4096byte的數據。下面這一行可以根據聲道數來計算輸入的frame的大小:
int in_size = aac.Encoder.frameSize(1);
AAC解碼:
(1) 創建一個Decoder對象作為成員變數
aac.Decoder decoder;
(2) 初始化
decoder = new aac.Decoder();
if( ! decoder.open())
{
Log.d("mylog", "failed to open decoder !\n");
decoder = null;
}
(3) 解碼
Decoder對象也有inbuf和outbuf,把待解碼的aac frame放到inbuf里
int pcm_size = decoder.decode(aac_size);
解得到數據在outbuf里,其有效長度為上述函數的返回值pcm_size,此時可以把outbuf里的PCM數據取出來播放或其他用途。
『叄』 如何在Android系統上使用FAAC處理AAC音訊
AAC又不是蘋果的,只不過這個格式是現在最推崇的格式。
FAAC是AAC的一種編碼。。。我們平時一般轉換格式的編碼都是NERO或者FAAC,似乎看過測評說FAAC要優秀些,可以在更小體積上實現同等音質。這兩種編碼似乎都是的,其實還有很多商用AAC編碼,也許是用在正版歌曲上吧,只要支持AAC的機器都可以支持以上編碼。蘋果ITUNES不清楚是用什麼編碼。。。AAC格式主要的後綴名是 ".m4a"或者".mp4"FAAC是指編碼器,蘋果的AAC大概是指樓上說的iTunes plus aac。首先無論你用什麼音源轉換,無論你用什麼編碼器,無論你把碼率提升至什麼地步效果肯定是後者更好。因為後者使用錄音膠片(網友們的猜測,但是可能性很大)直接轉換的,避免因多次轉換而造成的不必要的信息損失。網上有直接用無損轉512K AAC和itunes plus aac的頻譜圖對比,後者的信息含量要比前者的多很多(特別是高頻部分)
『肆』 Android工程編譯順序是怎麼樣的先編譯哪個模塊,後編譯哪個模塊由誰來決定的
在ActivityManifest.xml聲明的Activity中,含有
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
是最先執行的,其它類就的順序在這個主函數中先調用或跳轉哪個就是哪個了
『伍』 Android的編譯打包流程詳解
下圖的是官網對於Android編譯打包流程的介紹。
官方的介紹非常籠統,簡而言之,其大致流程就是:
編譯-->DEX-->打包-->簽名和對齊
(好像什麼都沒Get到,有一種意猶未盡的感覺……)
來一張外國大神的圖片(註:這張圖少了簽名的步驟)
用文字解釋一下上圖的流程:
首先,我們整理一下編譯的輸入部分是什麼(圖中黃色部分):
接下來的步驟:
好了,編譯打包的詳細流程說完了,接下來我們看看是否能回答開篇的那些問題。
答:aapt工具對於每個資源文件生成了唯一的ID,這些ID保存在R.java文件中。如下是R.java文件的內容:
資源ID是一個4位元組的無符號整數,在R.java文件中用16進製表示。其中,最高的1位元組表示Package ID,次高1個位元組表示Type ID,最低2位元組表示Entry ID。
只有一個ID如何能引用到實際資源呢?實際上aapt工具還生成了一個文件resources.arsc,相當於一個資源索引表,或者你理解成一個map也行,map的key是資源ID,value是資源在apk文件中的路徑。resources.arsc裡面還有其他信息,這個就不多說了。
通過R.java文件和resources.arsc配合,就能引用到實際的資源文件。
答:第7步已經闡述了對齊所做的工作,為什麼要進行對齊,這是為了加快資源的訪問速度。如果每個資源的開始位置都是上一個資源之後的 4*n位元組,那麼訪問下一個資源就不用遍歷,直接跳到4*n位元組處判斷是不是一個新的資源即可。
如果舉例子,那麼對齊有點類似於資源數組化,數組的訪問速度當然比鏈錶快。
答:xml裡面都是各種字元,不利於快速遍歷。編譯成二進制文件,用數字替換各種符號,一方面能快速訪問,另一方面也能減少大小。
https://developer.android.com/studio/build/index.html
http://www.alittlemadness.com/2010/06/07/understanding-the-android-build-process/
http://blog.csdn.net/luoshengyang/article/details/8744683
https://stackoverflow.com/questions/6517151/how-does-the-mapping-between-android-resources-and-resources-id-work
http://www.jianshu.com/p/eaaddfe34d11
『陸』 faac 編譯錯誤問題!
注釋掉faac-1.28/common/mp4v2/mpeg4ip.h 里的第126行
char *strcasestr(const char *haystack, const char *needle);
重新編譯就可以了
『柒』 faac 和 faad 能不能在windows 下編譯如何編譯
ffmpeg是音視頻的分離,轉換,編碼解碼及流媒體的完全解決方案,其中最重要的就是libavcodec庫。它被mplayer或者xine使用作為解碼器。還有,國內比較流行的播放器影音風暴或MyMPC的後端ffdshow也是使用ffmpeg的解碼庫的。
ffmpeg軟體包經編譯過後將生成三個可執行文件,ffmpeg,ffserver,ffplay。其中ffmpeg用於對媒體文件進行處理,ffserver是一個http的流媒體伺服器,ffplay是一個基於SDL的簡單播放器。
ffmpeg中有五個庫文件,libavcodec,libavformat,libavutil,libswscale,libpostproc,其中庫libavcodec,libavformat用於對媒體文件進行處理,如格式的轉換;libavutil是一個通用的小型函數庫,該庫中實現了CRC校驗碼的產生,128位整數數學,最大公約數,整數開方,整數取對數,內存分配,大端小端格式的轉換等功能;libswscale,libpostproc暫時不知道何用。
『捌』 Android反編譯(三)— 手動編譯
PS: 最近沒工作,沒工作就沒需求,沒需求就沒什麼技術總結的靈感,那就沒更新什麼。但是兩個月不更新了,要是三個月不更新就會出大事,所以這次打算做一件有意思又不難的事。
之前有發文章寫過反編譯,今天就來試試反編譯之正編譯,開玩笑的,就是試試手動編譯的過程, 平時我們在項目中編譯出包都是使用Gradle直接執行assemble任務就能解決,我打算試試手動模擬整個過程。當然我也是第一次這樣搞,所以如果有寫得不對的地方,還望指出。
眾所周知,apk實質上就是一個壓縮包。復習一下,我們寫個最簡單的Demo,然後打包,然解壓,注意是解壓,不是反編譯,意義是不同的。
注意我這個Demo很簡單,什麼都不引入
然後我們看看整個出包的過程,隨便從網上拿張圖
然後這里我們用Android SDK給我們提供的工具來完成整個流程,工具在sdk文件夾下的build-tools文件夾下,有什麼aapt.exe、dx.bat,用的就是這些
這步應該是整個流程最簡單的吧,我感覺,所以從最簡單的開始。
我們先看看生成的dex有什麼
對比項目,我是一開始最基本的項目,什麼都沒動,所以只有一個MainActivity.clas,所以這里肯定是要先想辦法得到BuildConfig.class和R.class。
輸入命令:
aapt p -f -m -J <輸出路徑> -S <res路徑> -I <android.jar路徑> -M <Manifest路徑>
下一步,我們需要BuildConfig.class
這個BuildConfig.java是由gradle在我們配置好gradle之後自己幫我們生成的,所以我們直接拿來用,然後再javac就得到class文件了
然後我們再編譯我們的MainActivity.java並將它們放到同一個文件夾下, MainActivity因為引用了Android.jar和R文件,所以編譯時注意點,我為此被動好好的復習了一遍javac,都是淚
最後一步,我們用dx工具就能打出dex文件了
然後執行命令就得到一個Dex文件,看看這個文件裡面和上面直接打出的apk中的Dex文件有什麼不同:
看圖,我們上一步已經生成.dex了,那麼我們需要和compiled Resource 還有 Other Resource 一起生成APK。
我們先來生成compiled Resource,也就是resources.arsc
發現之前使用aapt生成R文件的時候沒寫完整,當時可以加一個-F參數直接生成arsc和Manifest
導出的abc.zip裡面就有resources.arsc和AndroidManifest.xml。
因為之前寫漏了,所以肯定要重新編一次MainActivity.java和Dex
我們把剛才的dex文件和aapt生成的resources.arsc、AndroidManifest.xml和res放到一個文件夾裡面。
PS:res文件夾也是上面aapt的命令生成的
然後我們對比這個文件夾和之前apk解壓的文件夾
最後運行
看來是成功了。
再說說遇到的還有兩個問題,並說下我解決問題的思路
(1)我把它們都放到一個文件夾之後,我壓縮成壓縮包,然後改後綴成.apk,然後發現安裝不了,我就直接反編譯,發現發編譯失敗,提示包有問題,以我多點玩包的經驗,我感覺就是壓縮工具出了問題,然後我去下個「好壓」(這不是廣告啊),然後就能正常反編譯了。
(2)但是還是安裝不了,再根據我多年的玩包經驗,我感覺是簽名問題,然後我隨便給這個包上一個簽名,就能正常安裝得到上圖的結果了。
總體來說,還真挺好玩的,這整個過程,就是翻車了幾次。做完之後感覺非常牛逼,為什麼這樣說,因為我知道這整個過程,我就可以做到,我不經過gradle來打包,我自己寫個python腳本來調用aapt和dx來打包也是能做到的。
當然上面純屬異想天開,因為這是個什麼都沒有的Demo所以覺得簡單,要是一個真實的項目,我感覺肯定要有很多坑,別的先不說,一個項目那麼多依賴關系,我這javac要搞死人。
最後如果有不對的地方,希望有大佬能夠指出,畢竟能運行也不能證明完全沒問題。然後我使用的build-tools是28的,不敢保證其它版本包括以後版本的玩法都一樣。
『玖』 android編譯命令的說明
android源碼目錄下的build/envsetup.sh文件,描述編譯的命令
- m: Makes from the top of the tree.
- mm: Builds all of the moles in the current directory.
- mmm: Builds all of the moles in the supplied directories.
要想使用這些命令,首先需要設置android腳本編譯環境,在源碼根目錄執行 source build/envsetup.sh
m:編譯所有的模塊
mm:編譯當前目錄下的模塊,當前目錄下要有Android.mk文件
mmm:編譯指定路徑下的模塊,指定路徑下要有Android.mk文件
下面舉個例子說明,假設我要編譯android下的\framework\av\cmds\screenrecord模塊,
當前目錄為源碼根目錄,方法如下:
1、source build/envsetup.sh
2、mmm framework/av/cmds/screenrecord
或者 :
1、source build/envsetup.sh
2、cd framework/av/cmds/screenrecord
3、mm
