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<PRM_SIZE;i++)
  {
  	bit2byte(*para++,bitsno[i],bits,bitpos);
  	bitpos+=bitsno[i];
  }

}

void bit2byte(Word16 para,int bitlen,unsigned char * bits,int bitpos)
{
  int i;
  int bit = 0;
  unsigned char newbyte = 0;
  
  unsigned char *p = bits + (bitpos / 8);
  for (i = 0 ;i<bitlen;i++)
  {
  	bit = (para >> (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<PRM_SIZE;i++)
  {
  	*para++=byte2bit(bitsno[i],bits,bitpos);
  	bitpos += bitsno[i];
  }

}

Word16 byte2bit(int bitlen,unsigned char * bits,int bitpos)
{
  int i;
  int bit = 0;
  Word16 newbyte = 0;
  Word16 value = 0;
  
  unsigned char *p = bits + (bitpos / 8);
  for (i = 0 ;i< bitlen;i++)
  {
  	bit = (*p >> (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类型的时候,失败。好吧,可能是自己理解的不够!

  • 7
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值