g729编解码的总结

关于音频编解码这一块的内容,感觉就g729这个算法麻烦一点。

在网上查找资料关于g729有很多内容,大致也了解了一下。g729算法算是一个类,里面细分还有很多具体的东西,在ITU官网上下载的g729包里面,有各种各样的:g729a、g729b、g729c等等,自己实在是不知道该使用哪一个,仔细阅读了文档以后,才发现,g729a是适合自己的。具体来说,每个都实现的功能不同,有的算法中提供了关于码率选择,有的提供了VDA等功能,不过自己用不到,所以,就选择了g729a这个最基本的压缩算法。在网上搜索了一下,g729和g729a的区别在于:g729a的算法质量提高了,相当于g729的加强版,恩,就它了。

在linux下进行编译的时候,发现了一个问题:压缩后的文件,居然比压缩前的文件还大,我也是醉了。在网上搜索查资料,才发现,很多人在ITU下载的东西,编译后都遇到同样的问题。问题的关键在于如何优化。好吧,继续查找资料,我发现很资料关于优化这一块的内容,都是残缺不全的。这可是有点坑呀!想要去看的话,搜索:“g729算法 去串行化”即可。下面我是找了很长时间才找到的,是关于bits.c文件的修改,希望对大家有所帮助吧。

#include "stdafx.h"
#include "typedef.h"
#include "ld8a.h"
#include "tab_ld8a.h"

static void bit2byte(Word16 para,int bitlen,unsigned char * bits,int bitpos) ;
static Word16 byte2bit(int bitlen,unsigned char * bits,int bitpos) ;

void prm2bits_ld8k(Word16 *para,unsigned char *bits)
{
  int i;
  int bitpos = 0;
  for (i = 0;i> (bitlen - i -1) ) &0x01;
    newbyte = (1 << (7-bitpos%8));
    if(bit == 1)
    	*p |= newbyte;
    else
    	*p &= ~newbyte;
    bitpos++;
    if (bitpos % 8 == 0)
      p++;
  }
}

void bits2prm_ld8k(unsigned char *bits,Word16 *para)
{
  int i;
  int bitpos = 0;
  for (i = 0;i> (7 - bitpos % 8)) &0x01;
    if (bit == 1) 
    {
      newbyte = (1<<(bitlen -i-1));
  	  value |= newbyte;
    }
  	bitpos++;
  	if(bitpos%8 == 0)
  		p++;
  }  
  return value;
}
这是主要的东西,也是网上找的,其他细枝末节的东西我就不往上写了,需要的话,大家可以去搜索一下。而且自己已经测试过了,是可以进行16:1压缩的。
ps:我遇到了一个坑爹的问题,使用memcpy函数进行复制拷贝,可是当参数为char类型的时候,可以;参数为word16类型的时候,失败。好吧,可能是自己理解的不够!

你可能感兴趣的:(语音编解码)