adpcm的压缩和解压缩实现
来源:互联网 发布:sql数值 编辑:程序博客网 时间:2024/06/13 11:21
转自: http://blog.csdn.net/nogodoss/article/details/10399403
前一博客介绍了adpcm的原理。这篇是具体实现。看了网上的资料,大部分都是没有提供具体实现。这里免费提供(暂时先提供解码部分)
static int index_adjust[16] = {-1,-1,-1,-1,2,4,6,8,-1,-1,-1,-1,2,4,6,8};
static int step_table[89] = {
7,8,9,10,11,12,13,14,16,17,19,21,23,25,28,31,34,37,41,45,
50,55,60,66,73,80,88,97,107,118,130,143,157,173,190,209,230,253,279,307,337,371,
408,449,494,544,598,658,724,796,876,963,1060,1166,1282,1411,1552,1707,1878,2066,
2272,2499,2749,3024,3327,3660,4026,4428,4871,5358,5894,6484,7132,7845,8630,9493,
10442,11487,12635,13899,15289,16818,18500,20350,22385,24623,27086,29794,32767
};
pre_sample = 0;
index = 0; 从0开始
void adpcmDecode(unsigned char * src, int len, unsigned char * des, int * pre_sample, int * index) {
int i;
int code;
int sb;
int diff;
short * tempDes = (short *)des;
for (i = 0;i < 2*len;i ++){
code = src[i >> 1] & 0x0f; ////////
if ((code & 8) != 0)
sb = 1;
else
sb = 0;
code &= 7;
diff = (step_table[* index] * code) / 4 + step_table[* index] / 8;
if (sb)
diff = -diff;
* pre_sample += diff;
if (* pre_sample > 32767)
* pre_sample = 32767;
else if (* pre_sample < -32768)
* pre_sample = -32768;
tempDes[i] = * pre_sample;
* index += index_adjust[code];
if (* index < 0)
* index = 0;
if (* index > 88)
* index = 88;
}
}
- adpcm的压缩和解压缩实现
- adpcm的压缩和解压缩实现
- ADPCM-PCM 的压缩
- C#实现文件的压缩和解压缩
- C#实现文件的压缩和解压缩
- 文件的压缩和解压缩
- 压缩和解压缩的方法
- 压缩和解压缩的类
- 字符串的压缩和解压缩
- urlno的压缩和解压缩
- 文件的压缩和解压缩
- zipfile的压缩和解压缩
- Linux的压缩和解压缩
- asp.net在线压缩和解压缩的实现
- asp.net在线压缩和解压缩的实现
- 用ASP.NET实现文件的在线压缩和解压缩
- 用ASP.Net实现文件的在线压缩和解压缩
- asp.net在线压缩和解压缩的实现v
- 用Laravel创建项目
- android canvas使用line画半园
- 数组指针与指针数组
- CTF比赛中必备的瑞士军刀ctf-tools
- 个人独立游戏总结
- adpcm的压缩和解压缩实现
- 【疑难杂症】-CentOS-yum错误: Cannot retrieve repository metadata (repomd.xml) for repository:
- crypt.c —— libcrypt
- BB FlashBack单独导出音频
- 一念永恒 > 第126章 厚积薄发
- ${pageContext.request.contextPath}的作用
- Android编码规范
- Game of Life -- leetcode
- c语言文件操作函数详解