作者:小鱼儿太疯癫 | 来源:互联网 | 2017-07-31 09:12
坛里的各位高手,求助一个问题:
我在itu网站上下载了g729的标准算法,将pcm语音压缩后通过udp发送出去,在encode端,我dump出压缩后的语音文件,用工具解码之后,发现编码之后
的语音质量很差,都是杂音,在此求助。
我的处理过程是:
将pcm分两次编码,一次80bit
assert(readLen/4 == 80);
g729_encode_oneframe( (short *)buff, readLen/4, sendbuf+hdrlen, &g729_one_frame_size);
assert(g729_one_frame_size == G729_ONE_FRAME_SIZE);//G729_ONE_FRAME_SIZE=10
g729_encode_oneframe( ((short *)buff)+readLen/4, readLen/4, sendbuf+hdrlen+g729_one_frame_size, &g729_one_frame_size);
assert(g729_one_frame_size == G729_ONE_FRAME_SIZE);
PS:g729_encode_oneframe函数如下:
int g729_encode_oneframe(Word16 * pcm_src, Word16 src_len, unsigned char* dst, Word16 * dst_len_ptr)
{
extern Word16 *new_speech; /* Pointer to new speech data */
Word16 prm[PRM_SIZE+1]; /* Analysis parameters. */
Word16 serial[SERIAL_SIZE]; /* Output bitstream buffer */
Word16 syn[L_FRAME]; /* Buffer for synthesis speech */
Word16 i; /* frame counter */
/* For G.729B */
Word16 nb_words;
if (L_FRAME != src_len)
{
LOGD("pcm src is wrong len is not 80");
return 1;
}
LOGD("g729 encdoe one frame %d len",src_len);
for(i=0; i
= (Word16)0;
/* Loop for each "L_FRAME" speech data. */
memcpy(new_speech, pcm_src, sizeof(Word16) * src_len ); /* 可能会存在网络序问题 */
if (count_frame == 32767)
{
count_frame = 256;
}
else
{
count_frame++;
}
Pre_Process(new_speech, L_FRAME);
//Coder_ld8k(prm, syn, count_frame, use_vad);
Coder_ld8k(prm, syn);
prm2bits_ld8k( prm, serial);
if(use_annex_b)
{
nb_words = add((Word16)serial[1], 2);
}
else
{
nb_words = serial[1];
}
return 0;
}
在线,求指导,qq:178021614