海思3536解码G711音频

海思3536解码G711音频


最近的一个项目,需要增加对G711的解码功能。而HI3536这款芯片是支持对G711进行CPU软件编解码的,所有的解码功能都基于独立封装的海思音频解码库,核心解码器工作在用户态,使用 CPU 软件解码。
对于海思的芯片来说,如果想要解码标准的G711音频数据的话,需要在G711音频数据流的每一帧前面都要加上一个海思的数据头,这样的G711音频数据才能被海思所解码。对于G711来说,HI3536能获取每帧数据长度为:N*40 (N 为[1,5]的任意正整数)。
海思语音帧结构为:
海思3536解码G711音频_第1张图片
代码处理:

FILE* fp = fopen(argv[1], "rb");

fseek(fp,0L,SEEK_END); //定位到文件末尾  
int flen = ftell(fp); // 得到文件大小 

fseek(fp,0L,SEEK_SET);// 回到文件头部

printf("flen = %d\n",flen);

int size  = 2 * 1024 * 1024;

char* buffer = (char*)malloc(size);
bzero(buffer,size);
if(fp)
{
	fread(buffer, 1, size , fp);
	fclose(fp);
}

int newlen = flen/200;
if( flen %200 )
{
	newlen += 1;
}

printf("newlen = %d\n",newlen);

newlen = flen + newlen*4;
printf("newlen = %d\n",newlen);
short * p = (short *)malloc(newlen);
bzero(p,newlen);

HisiVoiceAddHisiHeader((short *)buffer,(short *)p,200,flen);

free(buffer);

从标准的G711音频文件中读取数据,然后在按帧长度为200的间隔,对每个帧前加上一个海思的语音帧结构。

对于3536解码G711的过程,参考了海思提供的SDK,其中有个音频解码的demo sample_audio.c,具体的代码就不做分析,只是介绍一下大体上是怎么实现的,有兴趣的可以自己去看该代码。

G711解码流程:

  1. MMP系统初始化
  2. 设置音频输出设备属性,比如:采样率,数据宽度,I2S主从模式等
  3. 根据所设置的属性,创建ADEC通道
  4. 设置 AO 设备属性、启用 AO 设备、启用 AO 通道
  5. 数据源到数据接收者进行绑定
  6. 发送音频码流到音频解码通道

大体上的流程就是这样,还是个小白,只是想将学习的过程记录下来.

你可能感兴趣的:(海思3536解码G711音频)