HarmonyOS学习路之开发篇—多媒体开发(音频开发 二)

简介: 音频采集的主要工作是通过输入设备将声音采集并转码为音频数据,同时对采集任务进行管理。

一、音频音频采集开发

场景介绍

音频采集的主要工作是通过输入设备将声音采集并转码为音频数据,同时对采集任务进行管理。


接口说明


image.pngimage.pngimage.png



开发步骤

1. 构造音频流参数的数据结构AudioStreamInfo,推荐使用AudioStreamInfo.Builder类来构造,模板如下,模板中设置的均为AudioStreamInfo.Builder类的默认值,根据音频流的具体规格来设置具体参数。


AudioStreamInfo audioStreamInfo = new AudioStreamInfo.Builder()
    .encodingFormat(AudioStreamInfo.EncodingFormat.ENCODING_PCM_16BIT) // 16-bit PCM
    .channelMask(AudioStreamInfo.ChannelMask.CHANNEL_IN_STEREO) // 双声道输入
    .sampleRate(44100) // 44.1kHz
    .build();
AudioCapturerInfo audioCapturerInfo = new AudioCapturerInfo.Builder().audioStreamInfo(audioStreamInfo)
    .build();

2. (可选)通过采集的采样率、声道数和数据格式,调用getMinBufferSize方法获取采集任务所需的最小buffer,参照该buffer值设置步骤3中AudioCapturerInfo的bufferSizeInBytes。


3. 使用步骤1创建的音频流构建音频采集的参数结构AudioCapturerInfo,推荐使用AudioCapturerInfo.Builder类来构造,根据音频采集的具体规格来设置具体参数。以真实的录制pcm流为例:

"module": {
  "reqPermissions": [
    {
      "name": "ohos.permission.MICROPHONE"
    },
    {
    ...
    }
  ]
}

4. (可选)设置采集设备,如麦克风、耳机等。通过AudioManager.getDevices(AudioDeviceDescriptor.DeviceFlag.INPUT_DEVICES_FLAG)获取到设备支持的输入设备,然后依照AudioDeviceDescriptor.DeviceType选择要选用的输入设备类型。


5. 通过构造方法获取AudioCapturer类的实例化对象(构造AudioCapturer类的实例化对象前需先去配置录音权限--ohos.permission.MICROPHONE),其中步骤3的参数为必选参数,通过步骤4获取的指定录音设备为可选参数。


录音权限的申请,需要开发者在config.json文件中的“reqPermissions”字段中声明所需要的权限。

public class MainAbility extends Ability {
    @Override
    public void onStart(Intent intent) {
        ...
        requestPermissions();    //在onStart方法中调用申请的权限
    }
    private void requestPermissions() {
        String[] permissions = {
                SystemPermission.ohos.permission.MICROPHONE, ...,...
        };
        requestPermissionsFromUser(Arrays.stream(permissions)
                .filter(permission -> verifySelfPermission(permission) != IBundleManager.PERMISSION_GRANTED).toArray(String[]::new), 0);
    }
}

实例化AudioCapturer对象:

AudioCapturer audioCapturer = new AudioCapturer(audioCapturerInfo);

6. (可选)设置采集音效,如降噪、回声消除等。使用addSoundEffect(UUID type, String packageName)进行音效设置,其中UUID参考类SoundEffect中提供的静态变量。


7. (可选)构造音频采集回调,首先继承抽象类AudioCapturerCallback,并实现抽象方法onCapturerConfigChanged(List<AudioCapturerConfig> configs),然后调用AudioManager类的registerAudioCapturerCallback(AudioCapturerCallback cb)方法进行音频采集回调注册。代码示例如下:

private AudioManager audioManager = new AudioManager();
public void main() {
    AudioCapturerCallback cb = new AudioCapturerCallback() {
        @Override
        public void onCapturerConfigChanged(List<AudioCapturerConfig> configs) {
            configs.forEach(config -> doSomething(config));
        }
    };
    audioManager.registerAudioCapturerCallback(cb);
}
private void doSomething(AudioCapturerConfig config) {
    ...
}


8. 调用 AudioCapturer实例化对象的start()方法启动采集任务。


9. 采集的音频数据读取为byte流,循环调用AudioCapturer的read方法进行数据读取。


10. 调用AudioCapturer实例化对象的stop()方法停止采集。


11. 采集任务结束后,调用AudioCapturer实例化对象的release()释放资源。


二、音量管理开发

场景介绍

音量管理的主要工作是音量调节,输入/输出设备管理,注册音频中断、音频采集中断的回调等。


接口说明

当前仅系统应用支持设置静音或响铃等模式。

image.png

image.png

image.png

image.png

去注册音频播放参数变更回调。


开发步骤

音量管理提供的都是独立的功能,一般作为音频播放和音频采集的功能补充来使用。开发者根据具体使用场景选择方法即可。


音频中断状态检测和音频采集中断状态检测的使用样例,请参考音频播放和音频采集的开发步骤。


三、短音播放开发

场景介绍

短音播放主要负责管理音频资源的加载与播放、tone音的生成与播放以及系统音播放。


接口说明

短音播放开放能力分为音频资源、tone音和系统音三部分,均定义在SoundPlayer类


接口名


描述



image.png

image.png


tone音的生成与播放API接口功能介绍


image.png


系统音的播放API接口功能介绍


image.png

音频资源的加载与播放

通过SoundPlayer(int)构造方法获取SoundPlayer类的实例化对象,其中入参taskType的取值范围和含义参考枚举类AudioManager.AudioStreamType的定义。

调用createSound(String)方法从指定路径加载音频资源,并生成短音ID,后续可使用通过短音ID进行短音资源的播放和删除等操作。

使用默认播放参数的play(int)方法进行播放,并通过播放成功后返回任务ID进行音量、循环次数、播放速度和优先级等参数的设置,也可以通过任务ID进行短音资源的暂停,恢复等操作。

短音资源需要暂停的时候可以使用stop(int)来停止短音播放,想要恢复可以使用resume(int)来对短音任务恢复播放。

短音资源使用完毕需要调用deleteSound(int)对短音任务ID删除,调用release(int)对短音资源的释放。下面的样例展示音频资源的加载与播放:

public SoundPlayer soundPlayer;
public Map<Integer, Boolean> soundMap = new HashMap<>();
public int taskId;
public static final int ERRORID = -1;
public void initSoundPlayer() {
    // 步骤1:实例化对象
    SoundPlayer soundPlayer = new SoundPlayer(AudioManager.AudioVolumeType.STREAM_MUSIC.getValue());
    // 步骤2:加载指定音频资源并创建短音
    int soundId1 = soundPlayer.createSound("/xxx/sound1_file_path");
    soundMap.put(soundId1, false);
    int soundId2 = soundPlayer.createSound("/xxx/sound2_file_path");
    soundMap.put(soundId2, false);
    int soundId3 = soundPlayer.createSound("/xxx/sound3_file_path");
    soundMap.put(soundId3, false);
    soundPlayer.setOnCreateCompleteListener((soundPlayer1, cacheId, status) -> {
        // 对应的短音创建成功
        if (status == 0 && soundMap.containsKey(cacheId)) {
            soundMap.put(cacheId, true);
        }
    });
}
public int PlaySound(int soundId) {
    // 步骤3:播放指定的短音
    if (soundMap.containsKey(cacheId) && soundMap.get(cacheId)) {
        taskId = soundPlayer.play(soundId);
    } else {
        taskId = ERRORID;
        HiLog.warn(TAG, "sound id is not ready.");
    }
    return taskId;
}
public void stopSoundPlayer(int taskId) {
    // 步骤4:停止短音资源
    if (taskId > 0){
        soundPlayer.stop(taskId);
    }
}
public void releaseSoundPlayer() {
    // 步骤5:释放短音资源
    Iterator<Map.Entry<Integer, Boolean>> iterator = soundMap.entrySet().iterator();
    while (iterator.hasNext()){
        Map.Entry<Integer, Boolean> entry = iterator.next();
        int soundId = entry.getKey().intValue();
        soundPlayer.deleteSound(soundId);
        iterator.remove();
    }
    soundPlayer.release();
}


tone音的生成与播放

通过SoundPlayer()构造方法获取SoundPlayer类的实例化对象。

使用SoundPlayer的实例化对象,通过createSound(ToneDescriptor.ToneType, int)方法,指定tone音类型和tone音播放时长来创建tone音资源。

使用SoundPlayer的实例化对象,通过play、pause、release方法完成tone音播放、暂停和资源释放。

下面的样例展示tone音的生成与播放:


public void demo() {
    // 步骤1:实例化对象
    SoundPlayer soundPlayer = new SoundPlayer();
    // 步骤2:创建DTMF_0(高频1336Hz,低频941Hz)持续时间1000ms的tone音
    soundPlayer.createSound(ToneDescriptor.ToneType.DTMF_0, 1000);
    // 步骤3:tone音播放、暂停和资源释放
    soundPlayer.play();
    soundPlayer.pause();
    soundPlayer.release();
}

系统音的播放

通过SoundPlayer(String)构造方法获取SoundPlayer类的实例化对象。

使用SoundPlayer的实例化对象,通过playSound(SoundType)或playSound(SoundType, float)方法指定系统音类型和音量,并进行系统音播放。

下面的样例展示系统音的播放:

public void demo() {
    // 步骤1:实例化对象
    SoundPlayer soundPlayer = new SoundPlayer("packageName");
    // 步骤2:播放键盘敲击音,音量为1.0
    soundPlayer.playSound(SoundPlayer.SoundType.KEY_CLICK, 1.0f);
}
相关文章
|
2月前
|
缓存 API 数据安全/隐私保护
自学记录:学习HarmonyOS Location Kit构建智能定位服务
作为一名对新技术充满好奇心的开发者,我选择了HarmonyOS Next 5.0.1(API 13)作为挑战对象,深入研究其强大的定位服务API——Location Kit。从权限管理、获取当前位置、逆地理编码到地理围栏,最终成功开发了一款智能定位应用。本文将结合代码和开发过程,详细讲解如何实现这些功能,并分享遇到的挫折与兴奋时刻。希望通过我的经验,能帮助其他开发者快速上手HarmonyOS开发,共同探索更多可能性。
135 5
|
1天前
鸿蒙开发:了解@Builder装饰器
@Builder装饰是鸿蒙UI开发中,非常重要的一个装饰器,在实际的开发中,合理且正确的使用,能够让我们的代码更加的简洁,有两点需要注意,一是,是用私有还是全局,取决于当前的组件的复用机制,如果多个页面都使用了,建议以全局为主;二是传参的动态更新,有更新就使用引用参数传递,没有更新按值传递即可。
48 28
|
1月前
|
存储 人工智能 JavaScript
Harmony OS开发-ArkTS语言速成二
本文介绍了ArkTS基础语法,包括三种基本数据类型(string、number、boolean)和变量的使用。重点讲解了let、const和var的区别,涵盖作用域、变量提升、重新赋值及初始化等方面。期待与你共同进步!
106 47
Harmony OS开发-ArkTS语言速成二
|
2月前
|
前端开发 API 数据库
鸿蒙开发:异步并发操作
在结合async/await进行使用的时候,有一点需要注意,await关键字必须结合async,这两个是搭配使用的,缺一不可,同步风格在使用的时候,如何获取到错误呢,毕竟没有catch方法,其实,我们可以自己创建try/catch来捕获异常。
105 3
鸿蒙开发:异步并发操作
|
2月前
|
API
鸿蒙开发:实现popup弹窗
目前提供了两种方式实现popup弹窗,主推系统实现的方式,几乎能满足我们常见的所有场景,当然了,文章毕竟有限,尽量还是以官网为主。
106 2
鸿蒙开发:实现popup弹窗
|
1月前
|
存储 JSON 区块链
【HarmonyOS NEXT开发——ArkTS语言】购物商城的实现【合集】
HarmonyOS应用开发使用@Component装饰器将Home结构体标记为一个组件,意味着它可以在界面构建中被当作一个独立的UI单元来使用,并且按照其内部定义的build方法来渲染具体的界面内容。txt:string定义了一个名为Data的接口,用于规范表示产品数据的结构。src:类型为,推测是用于引用资源(可能是图片资源等)的一种特定类型,用于指定产品对应的图片资源。txt:字符串类型,用于存放产品的文字描述,比如产品名称等相关信息。price:数值类型,用于表示产品的价格信息。
58 5
|
1月前
|
开发工具 开发者 容器
【HarmonyOS NEXT开发——ArkTS语言】欢迎界面(启动加载页)的实现【合集】
从ArkTS代码架构层面而言,@Entry指明入口、@Component助力复用、@Preview便于预览,只是初窥门径,为开发流程带来些许便利。尤其动画回调与Blank组件,细节粗糙,后续定当潜心钻研,力求精进。”,字体颜色为白色,字体大小等设置与之前类似,不过动画配置有所不同,时长为。,不过这里没有看到额外的动画效果添加到这个特定的图片元素上(与前面带动画的元素对比而言)。这是一个显示文本的视图,文本内容为“奇怪的知识”,设置了字体颜色为灰色(的结构体,它代表了整个界面组件的逻辑和视图结构。
53 1
|
2月前
|
开发框架 物联网 API
HarmonyOS开发:串行通信开发详解
在电子设备和智能系统的设计中,数据通信是连接各个组件和设备的核心,串行通信作为一种基础且广泛应用的数据传输方式,因其简单、高效和成本效益高而被广泛采用。HarmonyOS作为一个全场景智能终端操作系统,不仅支持多种设备和场景,还提供了强大的开发框架和API,使得开发者能够轻松实现串行通信功能。随着技术的不断进步,串行通信技术也在不断发展。在HarmonyOS中,串行通信的开发不仅涉及到基本的数据发送和接收,还包括设备配置、错误处理和性能优化等多个方面。那么本文就来深入探讨在HarmonyOS中如何开发串行通信应用,包括串行通信的基础知识、HarmonyOS提供的API、开发步骤和实际代码示例
60 2
|
移动开发 Ubuntu 网络协议
嵌入式linux/鸿蒙开发板(IMX6ULL)开发 (二)Ubuntu操作入门与Linux常用命令(中)
嵌入式linux/鸿蒙开发板(IMX6ULL)开发 (二)Ubuntu操作入门与Linux常用命令
198 1
嵌入式linux/鸿蒙开发板(IMX6ULL)开发 (二)Ubuntu操作入门与Linux常用命令(中)
|
XML Web App开发 开发框架
鸿蒙开发入门 | 开发第一个鸿蒙应用+页面跳转
准备好鸿蒙开发环境后,接下来就需要创建鸿蒙项目,掌握项目的创建过程以及配置。项目创建好后,需要把项目运行在模拟器上,鸿蒙的模拟和安卓模拟器有些不同,鸿蒙提供远程模拟器和本地模拟器,通过登录华为账号登录在线模拟器,使用DevEco Studio可将项目部署到远程模拟器中。
1319 1
鸿蒙开发入门 | 开发第一个鸿蒙应用+页面跳转

热门文章

最新文章