软讯网络 > 编程语言 > C/C++ > 声音编码gsm和msgsm的转换
【标 题】:声音编码gsm和msgsm的转换
【关键字】:
gsm,msgsm
【来 源】:http://www.cublog.cn/u/117/showart.php?id=93391
声音编码gsm和msgsm的转换
用google搜到这么一句,
- msgsm use a different frame format (without the 0xD header)
用ultraedit打开文件普通的gsm文件一看,果真每33字节是以0xD开始,我以为只需要将微软的每32.5字节向后移4位就可以了,于是有了以下代码。但是结果发现这样并不行,仍然无法正常播放。但是还是留下代码以作留念。
不过幸运的是,搜到了msgsm相关代码,而且是个比较有意思的软件Asterisk,可以作电信业务的,有空得研究一下。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void convert(unsigned char *dst, unsigned char *src)
{
int i = 0;
dst[i] = 0xD0 | (src[i] >> 4);
for (i = 1; i < 33; i++)
{
dst[i] = ((src[i-1] & 0x0F) << 4) | (src[i] >> 4);
}
dst[i++] = 0xD0 | (src[i-1] & 0x0F) ;//dst[33]
while(i < 66)
{
dst[i++] = src[i-1];
}
}
void fatal(char *s)
{
fprintf(stderr, "Error: %s\n", s);
exit(-1);
}
int main()
{
unsigned char a[65];
char *p;
unsigned char b[66];
FILE *fp_r, *fp_w;
if ((fp_r = fopen("d:\\msgsm.gsm", "rb")) == NULL)
fatal("cannot open msgsm.gsm");
if ((fp_w = fopen("d:\\ljhgsm.gsm", "wb")) == NULL)
fatal("cannot open ljhgsm.gsm");
while(fread(a, 1, 65, fp_r) == 65)
{
convert(b, a);
if(fwrite(b, 1, 66, fp_w) != 66)
fatal("fwrite");
}
fclose(fp_r);
fclose(fp_w);
return 0;
}