ADPCM移植指南

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 optionsFormat選擇wavCodes選擇adpcm_ima_wav。右側Bit Rate選擇16Sample 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後還是可以聽到和原來音質差不的音樂。
這是壓縮了,不過這裏只能展示pcmadpcm的轉換,不能adpcmpcm的轉換。

使用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

使用adpcmwin7_16bit_8k_mono.pcm壓縮成win7_16bit_8k_mono.adpcm
注:生成的adpcm沒有辦法單獨驗證正確與否。需要解壓後試聽;

將win7_16bit_8k_mono.adpcm解壓成win7_16bit_8k_mono.pcm2

使用adpcmwin7_16bit_8k_mono.adpcm解壓成win7_16bit_8k_mono.pcm2
注:使用Audacity導入Raw Data方式試聽win7_16bit_8k_mono.pcm2,如果試聽正常,則壓縮解壓正常,否則失敗。

開始移植到js語言中

有了win7_16bit_8k_mono.pcmwin7_16bit_8k_mono.adpcmwin7_16bit_8k_mono.pcm2這些死數據,對移植能起到很多的作用。
adpcm算法就是對數據操作一些作用,作一些加減乘除操作,將其對應得轉換成js中的運行符即可。
壓縮完,使用二進制對比工具和死數據對比;
解壓完,使用二進制對比工具和死數據對比;
每一步的對比數據必須完全一致,纔是移植成功。
就這樣就完成了移植。移植到其他語言中也是一樣的步驟,首先兩種新語言和C語言的差異要了解就會方便移植一些。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章