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);
}
相关文章
|
6月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1116 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
6月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
881 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
6月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1024 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
7月前
|
存储 缓存 5G
鸿蒙 HarmonyOS NEXT端云一体化开发-云存储篇
本文介绍用户登录后获取昵称、头像的方法,包括通过云端API和AppStorage两种方式,并实现上传头像至云存储及更新用户信息。同时解决图片缓存问题,添加上传进度提示,支持自动登录判断,提升用户体验。
298 1
|
7月前
|
存储 负载均衡 数据库
鸿蒙 HarmonyOS NEXT端云一体化开发-云函数篇
本文介绍基于华为AGC的端云一体化开发流程,涵盖项目创建、云函数开通、应用配置及DevEco集成。重点讲解云函数的编写、部署、调用与传参,并涉及环境变量设置、负载均衡、重试机制与熔断策略等高阶特性,助力开发者高效构建稳定云端服务。
684 1
鸿蒙 HarmonyOS NEXT端云一体化开发-云函数篇
|
6月前
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
326 0
|
7月前
|
传感器 监控 安全
HarmonyOS NEXT 5.0 的星闪(NearLink)开发应用案例
V哥分享HarmonyOS NEXT 5.0星闪开发实战,涵盖智能车钥匙无感解锁与工业传感器监控。低延迟、高可靠,代码完整,速来学习!
981 0
|
10月前
|
容器
HarmonyOS NEXT仓颉开发语言实战案例:外卖App
仓颉语言实战分享,教你如何用仓颉开发外卖App界面。内容包括页面布局、导航栏自定义、搜索框实现、列表模块构建等,附完整代码示例。轻松掌握Scroll、List等组件使用技巧,提升HarmonyOS应用开发能力。
|
9月前
|
安全 JavaScript API
鸿蒙开发核心要素
鸿蒙开发核心要素
|
10月前
|
存储 IDE 定位技术
【HarmonyOS 5】鸿蒙组件&模板服务详解 - 助力高效开发的利器
在移动应用开发领域,效率与质量始终是开发者追求的核心目标。鸿蒙系统作为新兴的操作系统,为开发者提供了丰富且强大的开发资源,其中鸿蒙组件&模板服务更是成为开发者快速构建高质量应用的得力助手。
348 0

热门文章

最新文章

下一篇
开通oss服务