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);
}
相关文章
|
1天前
|
API 索引
鸿蒙开发:实现一个超简单的网格拖拽
实现拖拽,最重要的三个方法就是,打开编辑状态editMode,实现onItemDragStart和onItemDrop,设置拖拽移动动画和交换数据,如果想到开启补位动画,还需要实现supportAnimation方法。
24 13
鸿蒙开发:实现一个超简单的网格拖拽
|
1天前
|
存储 JSON 数据库
鸿蒙元服务项目实战:备忘录内容编辑开发
富文本内容编辑我们直接使用RichEditor组件即可,最重要的就是参数,value: RichEditorOptions,通过它,我们可以用来设置样式,和获取最后的富文本内容,这一点是很重要的。
鸿蒙元服务项目实战:备忘录内容编辑开发
|
1天前
|
开发框架 JavaScript 前端开发
Harmony OS开发-ArkT语言速成一
本文介绍ArkTS语言,它是鸿蒙生态的应用开发语言,基于TypeScript,具有静态类型检查、声明式UI、组件化架构、响应式编程等特性,支持跨平台开发和高效性能优化。ArkTS通过强化静态检查和分析,提升代码健壮性和运行性能,适用于Web、移动端和桌面端应用开发。关注我,带你轻松掌握HarmonyOS开发。
23 5
Harmony OS开发-ArkT语言速成一
|
1天前
鸿蒙开发:简单了解属性动画
无论是是使用animateTo还是animation,其实最终要改变的都是组件的可执行属性,最终的效果是一致的,animateTo是闭包内改变属性引起的界面变化,一般作用于出现消失转场,而animation则是组件通过属性接口绑定的属性变化引起的界面变化,一般使用场景为,animateTo适用对多个可动画属性配置相同动画参数的动画,需要嵌套使用动画的场景;animation适用于对多个可动画属性配置不同参数动画的场景。
|
1天前
鸿蒙开发:了解显式动画animateTo
在实际的开发中,应该遵循规范,正确的使用属性动画animateTo,切莫在轮询中使用,否则就会造成本不属当前的动画进行执行,造成UI错误,还有一点需要注意,那就是直接使用animateTo可能导致实例不明确的问题,建议使用getUIContext获取UIContext实例,并使用animateTo调用绑定实例的animateTo。
鸿蒙开发:了解显式动画animateTo
|
1天前
|
SQL 关系型数据库 API
HarmonyOs开发:关系型数据库封装之增删改查
每个方法都预留了多种调用方式,比如使用callback异步回调或者使用Promise异步回调,亦或者同步执行,大家在使用的过程中,可以根据自身业务需要进行选择性调用,也分别暴露了成功和失败的方法,可以针对性的判断在执行的过程中是否执行成功。
25 13
|
1天前
|
前端开发 中间件 索引
鸿蒙开发:Navigation路由组件使用由繁入简
使用了插件和路由库之后,在每个Module下都会生成一个路由配置文件,以Module名字+RouterConfig为文件命名,此路由配置文件,也会在AbilityStage中,通过routerInitConfig方法进行自动配置。
|
3天前
|
JSON 前端开发 网络架构
鸿蒙开发:一文探究Navigation路由组件
如果你还在使用router做为页面跳转,建议切换Navigation组件作为应用路由框架,不为别的,因为官方目前针对router已不在推荐。
132 101
鸿蒙开发:一文探究Navigation路由组件
|
3天前
|
缓存 前端开发 容器
HarmonyOs开发:轮播图Banner组件封装与使用
目前的轮播图,仅仅对Swiper做了简单的封装,另外增加了一个线条指示器,这远远是不够的,毕竟日常的轮播图形式多种多样,指示器也是千奇百怪,后续也会在此基础之上进行不断的扩展。
114 81
HarmonyOs开发:轮播图Banner组件封装与使用
|
6天前
|
API 数据安全/隐私保护 UED
探索鸿蒙的蓝牙A2DP与访问API:从学习到实现的开发之旅
在掌握了鸿蒙系统的开发基础后,我挑战了蓝牙功能的开发。通过Bluetooth A2DP和Access API,实现了蓝牙音频流传输、设备连接和权限管理。具体步骤包括:理解API作用、配置环境与权限、扫描并连接设备、实现音频流控制及动态切换设备。最终,我构建了一个简单的蓝牙音频播放器,具备设备扫描、连接、音频播放与停止、切换输出设备等功能。这次开发让我对蓝牙技术有了更深的理解,也为未来的复杂项目打下了坚实的基础。
92 58
探索鸿蒙的蓝牙A2DP与访问API:从学习到实现的开发之旅

热门文章

最新文章