有没有HarmonyOS鸿蒙Next录音转MP3的demo

有没有HarmonyOS鸿蒙Next录音转MP3的demo 有没有哪位可以提供一个录音转MP3的demo

3 回复
import { media } from '@kit.MediaKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { abilityAccessCtrl, common, Permissions } from '@kit.AbilityKit';
import { LengthMetrics, promptAction } from '@kit.ArkUI';
import fs from '@ohos.file.fs';

let avRecorder: media.AVRecorder;
let file: fs.File | undefined = undefined
media.createAVRecorder().then((recorder: media.AVRecorder) => {
  avRecorder = recorder;
  promptAction.showToast({
    message: "创建成功"
  })
  // 状态上报回调函数
  avRecorder.on('stateChange', (state: media.AVRecorderState, reason: media.StateChangeReason) => {
    console.log(`current state is ${state}`);
    // 用户可以在此补充状态发生切换后想要进行的动作
  })
  // 错误上报回调函数
  avRecorder.on('error', (err: BusinessError) => {
    console.error(`avRecorder failed, code is ${err.code}, message is ${err.message}`);
  })
}, (error: BusinessError) => {
  console.error(`createAVRecorder failed`);
})

function reqPermissionsFromUser(permissions: Array<Permissions>, context: common.UIAbilityContext): Promise<boolean> {
  let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
  return new Promise((resolve, reject) => {
    // requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗
    atManager.requestPermissionsFromUser(context, permissions).then((data) => {
      let grantStatus: Array<number> = data.authResults;
      let length: number = grantStatus.length;
      for (let i = 0; i < length; i++) {
        if (grantStatus[i] === 0) {
          // 用户授权,可以继续访问目标操作
          resolve(true)
          return
        } else {
          // 用户拒绝授权,提示用户必须授权才能访问当前页面的功能,并引导用户到系统设置中打开相应的权限
          resolve(false)
          return;
        }
      }
      // 授权成功
    }).catch((err: BusinessError) => {
      console.error(`Failed to request permissions from user. Code is ${err.code}, message is ${err.message}`);
      reject(false)
      return
    })
  })
}

@Component
export struct AudioCaptureToMp3 {
  async aboutToAppear() {
    const permissions: Array<Permissions> = ['ohos.permission.MICROPHONE'];
    // 授权
    const context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
    let result = await reqPermissionsFromUser(permissions, context);
    if (!result) {
      console.error('result is null')
      return
    }
  }

  build() {
    Flex({ wrap: FlexWrap.Wrap, space: { main: LengthMetrics.vp(5), cross: LengthMetrics.vp(5) } }) {
      Button("prepare").onClick(async (event: ClickEvent) => {
        // 新建并打开文件
        let path = `${getContext().cacheDir}/${Math.random()}.mp3`
        file = fs.openSync(path, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);

        let avProfile: media.AVRecorderProfile = {
          audioBitrate: 100000, // 音频比特率
          audioChannels: 2, // 音频声道数
          audioCodec: media.CodecMimeType.AUDIO_MP3, // 音频编码格式,当前只支持aac
          audioSampleRate: 48000, // 音频采样率
          fileFormat: media.ContainerFormatType.CFT_MP3, // 封装格式,当前只支持m4a
        }
        let avConfig: media.AVRecorderConfig = {
          audioSourceType: media.AudioSourceType.AUDIO_SOURCE_TYPE_MIC, // 音频输入源,这里设置为麦克风
          profile: avProfile,
          url: `fd://${file.fd}`, // 参考应用文件访问与管理中的开发示例获取创建的音频文件fd填入此处
        }
        avRecorder.prepare(avConfig).then(() => {
          console.log('Invoke prepare succeeded.');
          promptAction.showToast({
            message: "prepare成功"
          })
        }, (err: BusinessError) => {
          console.error(`Invoke prepare failed, code is ${err.code}, message is ${err.message}`);
        })
      })

      Button("start").onClick((event: ClickEvent) => {
        avRecorder.start().then(() => {
          console.log('start succeeded.');
          promptAction.showToast({
            message: "start成功"
          })
        })
      })
      Button("stop").onClick((event: ClickEvent) => {
        avRecorder.stop().then(() => {
          console.log('stop succeeded.');
          promptAction.showToast({
            message: "stop成功"
          })
          fs.closeSync(file)
        })
      })
    }
  }
}

更多关于有没有HarmonyOS鸿蒙Next录音转MP3的demo的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


目前HarmonyOS鸿蒙Next提供了丰富的多媒体处理能力,支持音频录制和格式转换。要实现录音转MP3的功能,可以通过调用AudioCapturer进行音频录制,然后使用AudioEncoder将录制的音频数据编码为MP3格式。以下是一个简单的示例代码框架:

import audio from '@ohos.multimedia.audio';
import media from '@ohos.multimedia.media';

// 创建AudioCapturer实例
let audioCapturer = audio.createAudioCapturer();

// 配置音频参数
let audioCapturerOptions = {
    streamType: audio.StreamType.STREAM_TYPE_MUSIC,
    sampleRate: 44100,
    channels: audio.AudioChannel.CHANNEL_2,
    format: audio.AudioFormat.FORMAT_PCM_16BIT
};

// 初始化AudioCapturer
audioCapturer.init(audioCapturerOptions);

// 创建AudioEncoder实例
let audioEncoder = media.createAudioEncoder();

// 配置编码器参数
let audioEncoderOptions = {
    codec: media.CodecMimeType.AUDIO_MPEG, // 指定编码格式为MP3
    sampleRate: 44100,
    channelCount: 2,
    bitRate: 128000,
    format: media.AudioFormat.AUDIO_MP3
};

// 初始化AudioEncoder
audioEncoder.init(audioEncoderOptions);

// 开始录制和编码
audioCapturer.start();
audioEncoder.start();

// 处理录制的音频数据
audioCapturer.on('dataAvailable', (buffer) => {
    audioEncoder.pushBuffer(buffer);
});

// 停止录制和编码
audioCapturer.stop();
audioEncoder.stop();

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

这个示例展示了如何使用HarmonyOS的API实现录音并转换为MP3格式。具体实现时,需要根据实际需求调整参数和处理逻辑。

目前HarmonyOS(鸿蒙Next)尚未提供官方的录音转MP3的Demo。但你可以通过以下步骤实现录音并转换为MP3:

  1. 使用AudioCapturer进行录音:通过HarmonyOS的AudioCapturer API捕获音频数据。
  2. 编码为MP3格式:使用第三方音频编码库(如LAME)将PCM格式的音频数据编码为MP3。
  3. 保存文件:将编码后的MP3数据写入文件。

由于HarmonyOS的生态仍在发展,建议关注官方文档或社区获取最新支持。

回到顶部