借鉴链接:https://www.cnblogs.com/findumars/p/5706009.html
ffmpeg可以解码g729a,但不能编码成g729a,所以要想使用g729a编码需要用到va_g729a库。
头文件g729a.h:
#define L_FRAME_COMPRESSED 10
#define L_FRAME 80
extern "C" void va_g729a_init_encoder();
extern "C" void va_g729a_encoder(short *speech, unsigned char *bitstream);
extern "C" void va_g729a_init_decoder();
extern "C" void va_g729a_decoder(unsigned char *bitstream, short *synth_short, int bfi);
使用到了编码功能,下面上代码:
va_g729a_init_encoder();
//len 为320;data为320字节的pcm数据,因为g729a编码是按16:1的比例编码
short srcAudio[L_FRAME] = { 0 };
unsigned char *dstAudioG729 = new unsigned char[20];
memset(dstAudioG729, 0, 20);
int nAudioG729Len = 0;
for (int i = 0; i < len / (L_FRAME * 2); i++)
{
//char转short
memcpy(srcAudio, data + i * L_FRAME * 2, L_FRAME * 2);
//编码成g729
va_g729a_encoder(srcAudio, dstAudioG729 + i * L_FRAME_COMPRESSED);
nAudioG729Len += L_FRAME_COMPRESSED;
}
更新:下面是g729a数据解码的代码:
va_g729a_init_decoder();
//len收到数据长度,data收到的g729a数据
for (int i = 0; i < len / L_FRAME_COMPRESSED; i++)
{
unsigned char srcAudio[L_FRAME_COMPRESSED] = { '\0' };
short dstAudio[L_FRAME] = { 0 };
memcpy(srcAudio, data + i * L_FRAME_COMPRESSED, L_FRAME_COMPRESSED);
//G729解码
va_g729a_decoder(srcAudio, dstAudio, 0);
//short转char
char charDstAudio[L_FRAME * 2] = { 0 };
memcpy(charDstAudio, dstAudio, L_FRAME * 2);
FILE*fp = fopen("1.pcm", "ab+");
if (fp != NULL)
{
fwrite(charDstAudio, L_FRAME * 2, 1, fp);
fclose(fp);
}
}