在音乐创作、音视频剪辑和游戏等领域中,给用户带来沉浸式音频体验越来越重要。开发者如何在应用内打造3D环绕声效?华为音频编辑服务6.2.0版本此次带来了空间动态渲染功能,可以将人声、乐器等音频元素渲染到指定的三维空间方位,支持静态和动态渲染两种模式,进一步提升应用中的音效体验。开发者可以点击查看以下Demo演示,了解集成效果并上手实验功能特性。

开发实战

1. 开发准备

开发者提前准备音乐素材,MP3格式最佳。其他音频格式请参考“2.4”步骤转换,视频格式请参考“2.5”步骤进行音频提取。

1.1项目级build.gradle里配置Maven仓地址

buildscript {repositories {google()jcenter()// 配置HMS Core SDK的Maven仓地址。maven {url 'https://developer.huawei.com/repo/'}}dependencies {...// 增加agcp插件配置。classpath 'com.huawei.agconnect:agcp:1.4.2.300'}
}
allprojects {repositories {google()jcenter()// 配置HMS Core SDK的Maven仓地址。maven {url 'https://developer.huawei.com/repo/'}}
}

1.2 文件头增加配置

apply plugin: 'com.huawei.agconnect'

1.3 应用级build.gradle里配置SDK依赖

dependencies{implementation 'com.huawei.hms:audio-editor-ui:{version}'
}

1.4在AndroidManifest.xml文件中申请如下权限

<!--震动权限-->
<uses-permission android:name="android.permission.VIBRATE" />
<!--麦克风权限-->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!--写存储权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--读存储权限-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!--网络权限-->
<uses-permission android:name="android.permission.INTERNET" />
<!--网络状态权限-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--网络状态变化权限-->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />

2.代码开发

2.1创建应用自定义的activity界面,用于选择音频,并将该音频文件路径返回给音频编辑SDK

// 将音频文件路径List返回到音频编辑页面
private void sendAudioToSdk() {// 获取到的音频文件路径 filePathString filePath = "/sdcard/AudioEdit/audio/music.aac";ArrayList<String> audioList = new ArrayList<>();audioList.add(filePath);// 将音频文件路径返回到音频编辑页面Intent intent = new Intent();// 使用sdk提供的HAEConstant.AUDIO_PATH_LISTintent.putExtra(HAEConstant.AUDIO_PATH_LIST, audioList);// 使用sdk提供的HAEConstant.RESULT_CODE为结果CODEthis.setResult(HAEConstant.RESULT_CODE, intent);finish();
}

2.2在UI界面导入音频时,SDK会发送一个action值为com.huawei.hms.audioeditor.chooseaudio的intent以跳转到该activity。因此,该activity“AndroidManifest.xml”中的注册形式如下

<activity android:name="Activity ">
<intent-filter>
<action android:name="com.huawei.hms.audioeditor.chooseaudio"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>

2.3启动音频编辑页面,点击“添加音频”,SDK会主动调用“2.1”步骤中定义的activity。添加好音频,就可以进行音频编辑、特效添加等操作,完成后导出编辑音频

HAEUIManager.getInstance().launchEditorActivity(this);

2.4.如果音频素材不是MP3格式,此步骤可以完成音频格式转换

调用transformAudioUseDefaultPath接口进行音频格式转换,转换后的音频文件导出到默认路径。

// 音频格式转换接口
HAEAudioExpansion.getInstance().transformAudioUseDefaultPath(context,inAudioPath, audioFormat, new OnTransformCallBack() {// 进度回调(0-100)@Overridepublic void onProgress(int progress) {}// 转换失败@Overridepublic void onFail(int errorCode) {}// 转换成功@Overridepublic void onSuccess(String outPutPath) {}// 取消转换@Overridepublic void onCancel() {}});// 取消转换任务接口
HAEAudioExpansion.getInstance().cancelTransformAudio();

调用transformAudio接口进行音频格式转换,转换后的音频文件导出到目标路径。

// 音频格式转换接口
HAEAudioExpansion.getInstance().transformAudio(context,inAudioPath, outAudioPath, new OnTransformCallBack(){// 进度回调(0-100)@Overridepublic void onProgress(int progress) {}// 转换失败@Overridepublic void onFail(int errorCode) {}// 转换成功@Overridepublic void onSuccess(String outPutPath) {}// 取消转换@Overridepublic void onCancel() {}});
// 取消转换任务接口
HAEAudioExpansion.getInstance().cancelTransformAudio();

2.5如果素材是视频格式,可以调用extractAudio接口进行音频提取,从视频中提取音频文件再导出到指定目录

// outAudioDir提取出的音频保存的文件夹路径,非必填
// outAudioName提取出的音频名称,不带后缀,非必填
HAEAudioExpansion.getInstance().extractAudio(context,inVideoPath,outAudioDir, outAudioName,new AudioExtractCallBack() {@Overridepublic void onSuccess(String audioPath) {Log.d(TAG, "ExtractAudio onSuccess : " + audioPath);}@Overridepublic void onProgress(int progress) {Log.d(TAG, "ExtractAudio onProgress : " + progress);}@Overridepublic void onFail(int errCode) {Log.i(TAG, "ExtractAudio onFail : " + errCode);}@Overridepublic void onCancel() {Log.d(TAG, "ExtractAudio onCancel.");}});
// 取消音频提取任务接口
HAEAudioExpansion.getInstance().cancelExtractAudio();

2.6调用getInstruments和startSeparationTasks接口进行伴奏提取

// 获取提取伴奏类型ID,后面将此ID传给接口
HAEAudioSeparationFile haeAudioSeparationFile = new HAEAudioSeparationFile();
haeAudioSeparationFile.getInstruments(new SeparationCloudCallBack<List<SeparationBean>>() {@Override
public void onFinish(List<SeparationBean> response) {
// 返回的数据,包括伴奏的类型ID
}@Overridepublic void onError(int errorCode) {// 失败返回
}
});
// 设置要提取的伴奏参数
List instruments = new ArrayList<>();
instruments.add(“伴奏id”);
haeAudioSeparationFile.setInstruments(instruments);
// 开始进行伴奏分离
haeAudioSeparationFile.startSeparationTasks(inAudioPath, outAudioDir, outAudioName, new AudioSeparationCallBack() {@Overridepublic void onResult(SeparationBean separationBean) { }@Overridepublic void onFinish(List<SeparationBean> separationBeans) {}@Overridepublic void onFail(int errorCode) {}@Overridepublic void onCancel() {}
});
// 取消分离任务
haeAudioSeparationFile.cancel();

2.7调用applyAudioFile接口进行空间方位渲染

// 空间方位渲染
// 固定摆位
HAESpaceRenderFile haeSpaceRenderFile = new HAESpaceRenderFile(SpaceRenderMode.POSITION);
haeSpaceRenderFile.setSpacePositionParams(new SpaceRenderPositionParams(x, y, z));
// 动态渲染
HAESpaceRenderFile haeSpaceRenderFile = new HAESpaceRenderFile(SpaceRenderMode.ROTATION);
haeSpaceRenderFile.setRotationParams( new SpaceRenderRotationParams(x, y, z, surroundTime, surroundDirection));
// 扩展
HAESpaceRenderFile haeSpaceRenderFile = new HAESpaceRenderFile(SpaceRenderMode.EXTENSION);
haeSpaceRenderFile.setExtensionParams(new SpaceRenderExtensionParams(radiusVal, angledVal));
// 调用接口
haeSpaceRenderFile.applyAudioFile(inAudioPath, outAudioDir, outAudioName, callBack);
// 取消空间方位渲染
haeSpaceRenderFile.cancel();

完成以上步骤,就可以得到对应的空间动态渲染效果,在应用内轻松实现2D转3D音效啦!这项功能还可以应用到企业会议以及运动康复领域,比如在展会上进行产品沉浸式展示、作为视障人群的方向感线索,为日常生活提供便利等。开发者们可以根据自己应用的实际需求选择使用,如需了解更多详情,请参考:
华为开发者联盟音频编辑服务官网; 获取集成音频编辑服务指导文档。

了解更多详情>>

访问华为开发者联盟官网
获取开发指导文档
华为移动服务开源仓库地址:GitHub、Gitee

关注我们,第一时间了解 HMS Core 最新技术资讯~

声临其境,轻松几步教你把音频变成3D环绕音相关推荐

  1. 轻松三步教你配置oracle,oracle home 配置

    今天上班链接plsql 发现链接不上 报错 Error while trring to retrieve text for error  ORA-12154 tnsping 链接失败 提示 Messa ...

  2. 轻松三步教你配置oracle,Oracle Net Configuration Assistant 配置步骤简明教程

    Net Configuration Assistant 配置步骤 假设数据库所在服务器IP地址为: 192.168.0.1 数据库实例名为:ora92 用户名: umap 密码:umap 第一步:打开 ...

  3. 数据可视化之设计经验分享:轻松三步教你学会制作数据可视化大屏思路

    当看到屏幕上一个个炫酷,具有科技感的数据大屏时,很多人都会好奇这是怎么做出来的.自己在制作大屏时明明按着需求做了,可是做出来后总是觉得画面不好看,不够炫,感觉很糟糕. 那要如何才能设计那样的数据可视化 ...

  4. 轻松6步教您掌握TeeChart图表控件绘图攻略

    在软件开发的过程中,常会用到绘图控件,鉴于开发周期的限制,为了加快项目的开发效率,常选择使用TeeChart图表控件,快速将数据绘制成各式的曲线或图表,直观.形象地表示出数据传递出来的信息,本文就为大 ...

  5. 【专题介绍】声临其境 — 音频沉浸体验

    " "音视频+无限可能"是一扇 LiveVideoStackCon面向新兴领域开启的大门,在移动互联网红利消失.内卷的局面下,智能车.制造.金融.医疗.出海等新兴领域还在 ...

  6. 虚拟机服务器 资料安全,绝密:三步教你轻松窃取VMware虚拟机及其数据漏洞预警 -电脑资料...

    是否记得曾经虚拟化过的邮件服务器或者薪酬支付系统?如果拥有访问虚拟化工作环境管理员权限,就可以轻松地进入该虚拟化工作环境,并且窃取所有的数据,而又不会留下任何痕迹, 虚拟化技术可以提供很多物理服务器无 ...

  7. 打游戏计算机内存不足,玩游戏内存不足? 教你轻松几步升级电脑内存

    原标题:玩游戏内存不足? 教你轻松几步升级电脑内存 明明才忍痛更新了电脑显卡,为啥游戏体验提升没有任何感觉?其实,是内存在作怪! 对于游戏玩家来讲,在极致特效下畅玩自己心水的游戏,应当是件特别幸福的事 ...

  8. 三步教你轻松分辨区块链项目真伪

    三步教你轻松分辨区块链项目真伪 最近区块链数字货币的项目越来越多,大部分涉嫌虚假宣传,套用资金盘模式,参与的人大多数都是区块链小白,网络项目小白,什么都不懂,熟人一说就被忽悠信了.今天发一篇文章,教一 ...

  9. 2020最新版Android一步一步教轻松通过ArcSoft虹软平台实现人脸识别功能,保姆级别教程?

    Android实现人脸识别功能 第一步:注册并认证成为开发者. 第二步:创建应用 1.认证成功后,我们就可以开始创建应用. 2,填写信息 3.点击添加SDK 4.选择人脸识别 5.选择情况,如图所示. ...

  10. android实现推送功能实现,android教你怎么轻松实现手机推送功能,一步一步教你Mob+MobPush...

    mob平台实现推送功能 第一步:Mob平台账号 第二步:在mob平台配置MobPush环境 1.点击下图蓝色圆圈处的产品中心. 2.点击立即进入. 3.点击创建应用. 4.同意隐私服务. 5.创建应用 ...

最新文章

  1. Flash Socket安全问题的全面解析 服务器端代码
  2. openshift django目录结果
  3. 第五章 Python数据结构
  4. posman使用教程
  5. oracle dataguard 日志 很多no,Oracle DataGuard主庫丟失歸檔日志后備庫的RMAN增量恢復一例...
  6. JavaScript就这么回事 (JS基础知识整理)
  7. jquery中的live()方法
  8. 延迟退休板上钉钉,专家:男女延至同龄为好!如何延?35 岁“歧视线”又如何破?...
  9. 孙燕姿:(Hello, I'm Stefanie...)
  10. 编程的一些小知识点总结
  11. 遥感NDVI估算植被覆盖度
  12. 微软电脑管家登陆微软商店 简单无打扰 支持杀毒和垃圾清理等
  13. 杭州女程序员自述:疫情之下被迫离职,仲裁说理被公司索赔百万
  14. VMware Workstation 无法连接到虚拟机。请确保您有权运行该程序、访问该程序使用的所有目录以及访问所有临时文件目录。VMX进程已经提前退出。
  15. ROS订阅/cmd_vel话题,转化成移动机器人左右轮的转速
  16. 相似图片搜索的三种哈希算法
  17. Unity技能系统框架(三)分析一个具体被动技能
  18. linux u盘分区 mdev 卸载问题,迅为开发板最小Linux自动挂载TF卡/U盘等存储设备
  19. linux引导过程与服务控制
  20. 双通道中频信号数字下变频及相位差估计(FPGA)

热门文章

  1. I/O模型(同步、非同步、阻塞、非阻塞)总结
  2. GPGPU数学基础教程
  3. L13:MySQL - 性能与SQL优化2
  4. 基于冷冻电镜图像的低通滤波(Lowpass Filter)算法
  5. TEXT部分文字颜色的改变
  6. 晶圆切割机_单轴晶圆划片机特点:
  7. 苯小孩的伤感空间日志发布:一个人,一座城,满心疼
  8. C语言程序设计第六次作业
  9. device-side assert triggered原因和解决方法
  10. 中等计算机的配置,中等特效的电脑主机配置推荐