项目实战:海思音频开发

时间:2024-04-07 14:09:09

        本文旨在简单减少如何在海思平台上进行音频开发,目的是方便后续研发人员在海思平台进行音频开发,加快开发以及维护进度。

一、驱动部分

        很多应用程序播放音频调用的是mplayer,mplayer调用alsa这个linux的驱动框架,关于alsa就不介绍内容比较多,总之alsa会掉用于底层的audio codec设备驱动,由于海思没有提供这些驱动所以移植alsa后运行会提示设备找不到的错误。

        那么海思是如何做的,海思底层是有提供音频模块的SDK供开发音频程序使用,内置audio codec有提供相应的驱动。

二、音频编码和解码

        海思提供了一组音频的SDK给用户开发音频应用层,但其支持的音频编码有限,仅支持G711、 G726、 ADPCM_DVI4、 ADPCM_ORG_DVI4、ADPCM_IMA等格式,都是CPU软解码格式,另外海思海引用了第三方的aac库对aac音频文件进行编解码。

        这里值得注意的一点是,海思提供的第三方aac库支持播放标准aac音频文件,但是其它标准格式音频文件海思为了兼容以前的版本都需要加上标准海思头才能正常播放音频。

下面以为例讲述一下g711u格式如何封装以及去除海思头。

关于音频每帧长度不同格式有不同的要求:

项目实战:海思音频开发

 

Hi3519.g711u 协议的封装即使将纯粹的g711u的音频数据加上帧头,符合海思解码格式的帧数据这样一个过程。

代码:

#include <stdio.h>

#include <string.h>

int main(int argc, char *argv[])

{

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

    FILE *pOutFile = fopen("encode_out.g711u", "wb");

    if (NULL == pInFile || NULL == pOutFile)

    {

        printf("open file failed\n");

        return 0;

    }

    int iRet = 0;

    int iRead = 0;

    unsigned char ucInBuff[640] = {0x00, 0x01, 0xA0, 0x00};

    unsigned char ucOutBuff[328] = {0x00, 0x01, 0xA0, 0x00};

    while (1)

    {

        iRead = fread(&ucInBuff[4], 1, 320, pInFile);

        if (iRead > 0)

        {

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

            fwrite(ucInBuff, 1, 324, pOutFile);

}

else

{

    printf("read the end\n");

    break;

}

}

fclose(pInFile);

fclose(pOutFile);

}

Hi3519.g711u 协议的解封解封过程既是将其中的 海思Header 去掉即可,代码如下:

#include <stdio.h>

#include <string.h>

int main(int argc, char *argv[])

{

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

    FILE *pOutFile = fopen("encode_out.g711u", "wb");

    if (NULL == pInFile || NULL == pOutFile)

    {

        printf("open file failed\n");

        return 0;

    }

    int iRet = 0;

    int iRead = 0;

    unsigned char ucInBuff[640] = {0x00, 0x01, 0xA0, 0x00};

    unsigned char ucOutBuff[328] = {0x00, 0x01, 0xA0, 0x00};

    while (1)

    {

        iRead = fread(ucInBuff, 1, 324, pInFile);

        if (iRead > 0)

        {

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

            fwrite(&ucInBuff[4], 1, 320, pOutFile);

        }

        else

        {

            printf("read the end\n");

break;

}

}

fclose(pInFile);

fclose(pOutFile);

}

三、播放音频

        海思对各个模块都有提供sample_xxx例程,可以在SDK中/smp/a53_linux/mmp/sample/audio中找到sample_audio.c。

以下是例程中的Usage提示:

项目实战:海思音频开发

 

        在Hi3519AV100的SDK中执行./sample_audio 2是播放当前路径的audio_chn0.aac音频,如上文提到的标准aac音频文件可以直接播放不用添加海思头。