本人用的是SILK_SDK_SRC_v1.0.9進行開發.開發過程是曲折的,結果天然也是豐盛的. java
SDK是從github下載的,因爲這個已被整合到一個Android項目,可是文件目錄結構尚完整. git
因此本人就嘗試直接編譯整個項目,結果沒法編譯過去,我的認爲是NDK版本不對.後來又看到有 github
Makefile文件,嘗試用make來編譯,發現不大理想,首先要生成一堆make用到的文件,這方面不 web
大熟悉.後來看見有一個Silk_SDK.sln文件,乾脆就從這個文件入手,用vs2013打開這文件,先編 編程
譯Silk_Fix項目,再編譯Dec_SDK項目,完美編譯,在項目文件夾中生成Decoder_debug.exe.點 微信
擊能夠直接運行.算是成功了一半.在控制檯中運行,發現輸出參數說明是.pcm格式的,到了這裏有 eclipse
點眉目了,.pcm應該是音頻數據的最原始數據,聲卡可以直接的數據.由於之前在開發webp圖片解 函數
碼工具,就是直接生成圖像的像素數據的.因此認爲.pcm應該就是音頻最直接的原始數據.接着就是 工具
用Decoder_debug.exe來解碼一段Sdk提供的樣本.在目錄test_vectors\bitstream中. spa
用法: 樣本數據路徑 輸出路徑
固然能夠設置其餘的參數,這裏選擇默認不輸入,結果完整輸出,因此認爲程序的輸入參數正確.那有了
解碼生成的.pcm數據,怎中麼檢查是否正確,再回過頭來想想,既然.pcm數據是最原始數據,那應該
有程序能夠播放.後來通過百度一下:java pcm 發現能夠編寫java應用來播放.pcm.就立刻動手,打開
eclipse 複製代碼編譯運行,嘗試播放,結果能夠播放,不過聽得不清楚,是否是樣本數據自己就這樣的?
後來就去手機QQ裏找一段silk來進行嘗試.爲何我會從手機QQ裏找?這裏面是有原因的.
由於自從前幾天升級手機QQ以後,發現裏面的amr文件竟然是零字節,只能在手機QQ裏面找聊天
記錄播放,固然也能夠在裏面收藏起來,可是問題來了,只能在手機QQ裏播放,就算能收藏起來,誰知道
那天騰訊再也不提供收藏了怎麼辦?裏面的不少音頻聲音都是很動聽的呀,對於程序汪汪那是很珍貴的呀!
後來在該目錄下還發現有.slk文件,這個也是不能播放,發現和amr文件同名,能夠判定那是音頻數據,傳到
電腦,用notepad++ hex方式打開,發現文件頭有這麼一個標識 #!SILK_V3,後來通過百度搜索,發現這
是silk文件,後來找到了相關的SDK進行編譯.最開始找到的是v1.0.7版本的,裏面被上傳者寫有一個例子,
下載下來編譯不過去,其實應該仍是NDK的問題吧.再找其餘版本,而後就從github下載了v1.0.9版本,就
開始了上面的工做.
回到前面的話題,QQ裏面的silk文件不是標準的silk文件,騰訊在文件最前面加了一個字節,後面的與
標準的silk文件格式相同.立刻用java編寫程序,截取QQ語言文件裏面的silk文件.而後用
Decoder_debug.exe解碼,生成.pcm文件,用剛纔的java程序進行播放,終於傳出動人的完整聲音.那種
感受你們都懂的.
接着就是想辦法如何封裝pcm數據了,首先想到的是無損壓縮.由於在解碼silk的時候都是用了最好
的參數,這樣才能擁有更高保真度.搜索一番,發現都沒有好的工具來封裝pcm數據,convert能夠實現,但
是又要下載安裝,很不方便.可是發現和pcm數據有直接關係的是wav格式,寫個文件頭再複製pcm數據
就能夠了.立刻寫個java程序進行嘗試,果真可以完美播放.
又回到NDK的推薦編譯方式上,由於咱要把Android版的應用作出來才能方便大衆,畢竟不是每一個
人都有電腦吧,咱程序猿就講究奉獻吧?!必定要把Android的解碼工具作出來!既然不能直接編譯,就老
老實實地刪繁就簡,提取SILK_SDK_SRC_ARM_v1.0.9裏面的src和interface目錄的文件到Android
項目的jni目錄下,你們都知道編譯原生應用很關鍵的一步是,如何編寫Android.mk文件.但是不管怎麼
寫這個文件就是編譯不過去.那就先編譯SDK成靜態庫,發現能經過編譯.爲何v1.0.7裏面的例子就無
法編譯?後來乾脆刪除掉,再回頭看看vs2013裏面的程序是能夠完美運行的,那好直接將裏面的
Decoder.c複製過來.先不寫任何關於jni的代碼,先將Decoder編譯成動態庫試試,結果仍是不行.再回
過頭看看下載下來的項目,發現裏面的Android.mk文件多了些.S文件須要編譯,終於明白了是怎麼的
回事,原來S文件和.c文件做爲源文件一塊兒編譯,固然interface裏面的頭文件也要添加到Android.mk
裏面.Android.mk先編譯SDK靜態庫,再編譯Decoder.c成動態庫,但是仍是沒法編譯,百度後網友說,
NDK的版本不對,換了NDK版本仍是不行,就想是否是ARM版本不兼容?那就捨棄ARM最低版本,直接
將ABI設置爲ARMv7.這一次完美編譯.接着就是怎麼整合了,因爲QQ語音和微信語音文件不是標準的
silk文件,一個方案是在java裏面先將QQ語音截取成標準的silk文件.後來用了這樣的一個方案,將main
函數改爲int decode(int argc, char* argv[], int offset);前面兩個參數和控制檯的同樣.爲何要
加offset,不在argv多添加一個字符串,緣由是int 類型比字符串類型處理上方便些.再在jni.c文件中將
參數傳進去.完美編譯!問題又來了,ARM的虛擬機很差用,試試上X86 Android虛擬機,果真不行.那就
在Android.mk裏面添加條件語句,編譯X86版本的源文件變量不添加.S彙編.完美編譯.再用java寫封
裝方法,成功運行,解碼silk文件.
剩下的工做就是進行應用的修改,使得更加人性化.同時用C#編寫PC端工具,PC端主要是爲
Decoder.exe寫一個GUI的參數輸入工具,並同時實現封裝.
此次就寫到這裏,後面有好的編程經歷也會寫出來和你們分享.
我的成果分享
連接1:http://pan.baidu.com/s/1eRmtVTg
連接2: http://pan.baidu.com/s/1hrzhe7q 密碼: d7ug