海思3536解码G711音频
最近的一个项目,需要增加对G711的解码功能。而HI3536这款芯片是支持对G711进行CPU软件编解码的,所有的解码功能都基于独立封装的海思音频解码库,核心解码器工作在用户态,使用 CPU 软件解码。
对于海思的芯片来说,如果想要解码标准的G711音频数据的话,需要在G711音频数据流的每一帧前面都要加上一个海思的数据头,这样的G711音频数据才能被海思所解码。对于G711来说,HI3536能获取每帧数据长度为:N*40 (N 为[1,5]的任意正整数)。
海思语音帧结构为:
代码处理:
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解码流程:
- MMP系统初始化
- 设置音频输出设备属性,比如:采样率,数据宽度,I2S主从模式等
- 根据所设置的属性,创建ADEC通道
- 设置 AO 设备属性、启用 AO 设备、启用 AO 通道
- 数据源到数据接收者进行绑定
- 发送音频码流到音频解码通道
大体上的流程就是这样,还是个小白,只是想将学习的过程记录下来.