Silk解碼 開發日誌

      本人用的是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
相關文章
相關標籤/搜索