海思音频开发
2659 打赏
在学了在学了! 2020-10-10 11:00:00

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

一、驱动部分 很多应用程序播放音频调用的是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音频文件可以直接播放不用添加海思头。

原文链接:https://blog.csdn.net/qq845699/article/details/104152775?biz_id=102&utm_term=%E6%B5%B7%E6%80%9D&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-2-104152775&spm=1018.2118.3001.4187

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
评论
0个
时间排序
内容存在敏感词
    0 条记录 第 0 /
    相关专栏
    打赏作者
    易百纳技术社区
    在学了在学了!
    您的支持将鼓励我继续创作!
    打赏金额:
    ¥1 易百纳技术社区
    ¥5 易百纳技术社区
    ¥10 易百纳技术社区
    ¥50 易百纳技术社区
    ¥100 易百纳技术社区
    支付方式:
    微信支付
    支付宝支付
    易百纳技术社区 微信支付
    易百纳技术社区
    打赏成功!

    感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

    举报反馈

    举报类型

    • 内容涉黄/赌/毒
    • 内容侵权/抄袭
    • 政治相关
    • 涉嫌广告
    • 侮辱谩骂
    • 其他

    详细说明

    审核成功

    发布时间设置
    发布时间:
    是否关联周任务-专栏模块

    审核失败

    失败原因
    备注
    Loading...
    易百纳技术社区
    确定要删除此文章、专栏、评论吗?
    确定
    取消
    易百纳技术社区
    易百纳技术社区
    在专栏模块发布专栏,可获得其他E友的打赏
    易百纳技术社区
    回答悬赏问答,被题主采纳后即可获得悬赏金
    易百纳技术社区
    在上传资料时,有价值的资料可设置为付费资源
    易百纳技术社区
    达到一定金额,收益即可提现~
    收益也可用来充值ebc,下载资料、兑换礼品更容易
    易百纳技术社区
    活动规则
    • 1.周任务为周期性任务,每周周一00:00刷新,上周完成的任务不会累计到本周,本周需要从头开始任务,当前任务完成后才可以完成下一个任务
    • 2.发布的专栏与资料需要与平台的板块有相关性,禁止注水,专栏/资料任务以审核通过的篇数为准,专栏需为原创文章且首次在社区发布
    • 3.任务完成后,现金奖励直接打款到微信账户;EBC/收益将自动发放到个人账户,可前往“我的钱包”查看;其他奖励请联系客服兑换
    易百纳技术社区
    升级提醒
    升级

    恭喜您的社区称号由 升级为 “社区游民”

    同时为了感谢您对社区的支持,我们将送出xxx礼品一份, 记得领取哦~

    升级提醒
    易百纳技术社区