如何在鸿蒙系统中实现音频数据的录制和保存?

我想在鸿蒙系统中录制音频数据并将其保存到本地文件。请问,应该使用哪个API来启动音频录制?录制完成后,如何获取并保存录制的音频数据?是否有示例代码展示整个录制和保存流程?

本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。

阅读 843
avatarAI BotBETA

在鸿蒙系统中实现音频数据的录制和保存,可以使用以下API和步骤:

启动音频录制

要启动音频录制,你可以使用以下API:

  • AudioCapturer:用于音频输入的ArkTS/JS API,适用于更专业、更多样化的媒体录制应用开发。它支持PCM格式,需要应用持续读取音频数据进行工作。
  • OHAudio:提供音频输入的Native API,支持普通音频通路和低时延通路,同样仅支持PCM格式。
  • AVRecorder:用于音频录制的ArkTS/JS API,集成了音频输入录制、音频编码和媒体封装的功能。可以直接调用设备硬件如麦克风录音,并生成m4a音频文件。

获取并保存录制的音频数据

录制完成后,你可以通过相应的API获取录制的音频数据,并将其保存到本地文件。以下是一个基于AVRecorder的示例代码,展示了整个录制和保存流程:

// 引入必要的模块
import { audio } from '@kit.AudioKit';
import { fileIo } from '@kit.CoreFileKit';

// 配置音频录制参数
let audioStreamInfo: audio.AudioStreamInfo = {
    samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_48000, // 采样率
    channels: audio.AudioChannel.CHANNEL_2, // 通道
    sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE, // 采样格式
    encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW // 编码格式
};

let audioCapturerInfo: audio.AudioCapturerInfo = {
    source: audio.SourceType.SOURCE_TYPE_MIC,
    capturerFlags: 0
};

let audioCapturerOptions: audio.AudioCapturerOptions = {
    streamInfo: audioStreamInfo,
    capturerInfo: audioCapturerInfo
};

// 创建AudioCapturer实例
audio.createAudioCapturer(audioCapturerOptions, (err, data) => {
    if (err) {
        console.error(`Invoke createAudioCapturer failed, code is ${err.code}, message is ${err.message}`);
    } else {
        console.info('Invoke createAudioCapturer succeeded.');
        let audioCapturer = data;

        // 设置保存路径和文件名
        let path = getContext().cacheDir;
        let filePath = path + '/recorded_audio.pcm';
        let file: fileIo.File = fileIo.openSync(filePath, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);

        // 订阅监听音频数据读入回调
        let bufferSize: number = 0;
        let readDataCallback = (buffer: ArrayBuffer) => {
            let options = { offset: bufferSize, length: buffer.byteLength };
            fileIo.writeSync(file.fd, buffer, options);
            bufferSize += buffer.byteLength;
        };
        audioCapturer.on('readData', readDataCallback);

        // 开始录制音频
        audioCapturer.start((err: any) => {
            if (err) {
                console.error('Failed to start audio capturer:', err);
            } else {
                console.info('Audio capturer started successfully.');

                // 停止录制(这里假设录制10秒后停止,实际应用中可能需要其他触发条件)
                setTimeout(() => {
                    audioCapturer.stop((err: any) => {
                        if (err) {
                            console.error('Failed to stop audio capturer:', err);
                        } else {
                            console.info('Audio capturer stopped successfully.');

                            // 释放资源
                            audioCapturer.release();

                            // 关闭文件
                            fileIo.closeSync(file.fd);

                            console.info('Audio data saved to:', filePath);
                        }
                    });
                }, 10000); // 10秒
            }
        });
    }
});

注意

  1. 上述代码使用了AudioCapturer API进行音频录制,并将录制的PCM数据写入到本地文件。实际应用中,你可能需要根据具体需求调整录制参数和保存路径。
  2. 在调用麦克风前,需要先向用户申请权限(ohos.permission.MICROPHONE)。
  3. 如果需要持续录制或后台录制,请申请长时任务避免应用进入挂起(Suspend)状态。
  4. 录制需要在前台启动,启动后可以退后台;在后台启动录制将会失败。

另外,如果你想使用AVRecorder API进行录制,可以参考官方文档进行配置和使用。

1 个回答

据我所知,在鸿蒙系统中,你可以通过创建AudioCapturer实例来录制音频数据,并通过文件系统API将其保存到本地文件。首先,通过audio.createAudioCapturer方法创建AudioCapturer实例,并启动录制。然后,在readData事件的回调函数中处理录制的音频数据,并将其写入文件。示例代码如下:

javascript
let filePath = '/path/to/your/audiofile.pcm';
let file = fs.openSync(filePath, fs.OpenMode.WRITE_ONLY | fs.OpenMode.CREATE);
 
audioCapturer.on('readData', (buffer) => {
  fs.writeSync(file.fd, buffer);
});
 
audioCapturer.start().then(() => {
  console.info('Audio capturing started');
  // ... 在适当的时候停止录制并关闭文件
  audioCapturer.stop().then(() => {
    fs.closeSync(file.fd);
    console.info('Audio capturing stopped and file saved');
  });
});

本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题