ADPCM移植指南
ADPCM是一種音頻壓縮算法,4位的壓縮率,即原文件大小爲16KiB的話,壓縮完是4KiB。這個算法一般是C語言版本在網上公開的。因爲需要將其用在js
語言中,故對其做了移植,這裏記錄移植過程和思路,也屬於工作總結。
選擇一段大衆的音頻win7.wav
我一般喜歡使用win7.wav,其爲Windows 7開機音樂,比較不失一般性。
體驗ADPCM壓縮
一般地,瞭解一個新東西一般是在做任何編程之前先體驗,有了直觀的認識之後編程時就會思路會比較清晰。
Audacity含有ADPCM壓縮功能,我們體驗一下。使用Audacity打開win7.wav,可以看到win7.wav是44100
採樣率、16bit
,爲了測試壓縮效果,我們以相同參數導出壓縮後的數據,導出步驟如下File -> Export Audio
,格式選擇Custom FFmpeg Export
然後點擊Open custom FFmpeg format options
在Format
選擇wav
,Codes
選擇adpcm_ima_wav
。右側Bit Rate
選擇16
,Sample Rate
選擇44100
。如下圖所示:
大小對比如下:
-rw-rw-r-- 1 tony tony 570478 10月 10 15:40 win7.adpcm_ima
-rw-rw-r-- 1 tony tony 2265820 9月 18 17:42 win7.wav
2265820/570478=3.97
我們計算一下,大小差不多差4倍,關於wav
的頭部信息更多解釋見這裏:http://soundfile.sapp.org/doc/WaveFormat/
使用Audacity打開壓縮過的win7.adpcm_ima後還是可以聽到和原來音質差不的音樂。
這是壓縮了,不過這裏只能展示pcm
到adpcm
的轉換,不能adpcm
到pcm
的轉換。
使用C程序adpcm
編譯C程序用於壓縮解壓縮
使用網絡上公開的adpcm算法https://github.com/ctuning/ctuning-programs/blob/master/program/cbench-telecom-adpcm-d/adpcm.c
得到adpcm
。
將win7.wav轉換成win7_16bit_8k_mono.pcm
即去掉wav頭,將其轉換成16bit,採樣率爲8k,聲音爲mono
單聲道。
注:爲保證提取正確,可以在提取後,使用Audacity打開試聽,試聽正常則提取正常,否則失敗。
將win7_16bit_8k_mono.pcm壓縮成win7_16bit_8k_mono.adpcm
使用adpcm
將win7_16bit_8k_mono.pcm
壓縮成win7_16bit_8k_mono.adpcm
。
注:生成的adpcm沒有辦法單獨驗證正確與否。需要解壓後試聽;
將win7_16bit_8k_mono.adpcm解壓成win7_16bit_8k_mono.pcm2
使用adpcm
將win7_16bit_8k_mono.adpcm
解壓成win7_16bit_8k_mono.pcm2
。
注:使用Audacity導入Raw Data
方式試聽win7_16bit_8k_mono.pcm2
,如果試聽正常,則壓縮解壓正常,否則失敗。
開始移植到js語言中
有了win7_16bit_8k_mono.pcm
、win7_16bit_8k_mono.adpcm
和win7_16bit_8k_mono.pcm2
這些死數據,對移植能起到很多的作用。
adpcm算法就是對數據操作一些作用,作一些加減乘除操作,將其對應得轉換成js
中的運行符即可。
壓縮完,使用二進制對比工具和死數據對比;
解壓完,使用二進制對比工具和死數據對比;
每一步的對比數據必須完全一致,纔是移植成功。
就這樣就完成了移植。移植到其他語言中也是一樣的步驟,首先兩種新語言和C語言的差異要了解就會方便移植一些。