海思音频开发

在学了在学了! 2020-10-10 11:00:00 4289

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

一、驱动部分
很多应用程序播放音频调用的是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

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 1 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
在学了在学了!
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

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

举报反馈

举报类型

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

详细说明

审核成功

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

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区