调用方法:
#include "G729Codec.h"
#include <string.h>
#include "g729a.h"
#pragma comment( lib ,"../bin/g729a.lib" )
//
// Construction/Destruction
//
#define SIZE_AUDIO_FRAME 160//
#define SIZE_AUDIO_PACKED 20
G729Codec::G729Codec()
{
va_g729a_init_encoder();
va_g729a_init_decoder();
}
G729Codec::~G729Codec(){}
int G729Codec::Encode(void *input, int inputSizeBytes, void *output, int *outputSizeBytes)
{
short *dataIn = (short *)input;
unsigned char *dataOut = (unsigned char *)output;
if(!dataIn||inputSizeBytes!=SIZE_AUDIO_FRAME||!dataOut)
{
*outputSizeBytes = 0;
return -10;
}
else{
for(int i=0;i<SIZE_AUDIO_FRAME/160;i++){
va_g729a_encoder((dataIn+160*i),dataOut+10*i);
}
if(outputSizeBytes)
*outputSizeBytes=SIZE_AUDIO_PACKED;
}
return 0;
//
}
int
G729Codec::Decode(void *input, int inputSizeBytes, void *output, int *outputSizeBytes)
{
short *dataOut = (short *)output;
unsigned char *dataIn = (unsigned char *)input;
if(!dataIn||inputSizeBytes!=SIZE_AUDIO_PACKED||!dataOut)
{
*outputSizeBytes = 0;
return -10;
}
else{
for(int i=0;i<SIZE_AUDIO_FRAME/160;i++){
va_g729a_decoder(dataIn+10*i,(dataOut+160*i),0);
}
if(outputSizeBytes)
*outputSizeBytes=SIZE_AUDIO_FRAME;
}
return 0;
//
}
颤音处理:
编码的效果始终不理想,带有很大的颤抖,只要每次填写一帧数据,就可以解决问题。
改为g729下的输入参数
int MillisecPacketSize = 10;(10ms对应10字节,因为1kBPS,一帧长度10ms)
waveSource->SetBufferDuration(10);