鸿蒙音视频开发初体验

鸿蒙音视频开发初体验

首先是音频初始化,新建一个AudioRender.ArkTs文件,然后创建AudioStreamInfo和AudioRendererOptions对象

  //streamInfo
  static audioStreamInfo: audio.AudioStreamInfo = {
    //频道
    samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_44100,
    //单声道
    channels: audio.AudioChannel.CHANNEL_1,
    sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE,
    encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW
  }
  //renderInfo
  static audioRenderInfo: audio.AudioRendererInfo = {
    usage: audio.StreamUsage.STREAM_USAGE_VOICE_ASSISTANT,
    rendererFlags: 0
  }

创建AudioRendererOptions对象

  static audioRenderOptions: audio.AudioRendererOptions = {
    streamInfo: AudioRender.audioStreamInfo,
    rendererInfo: AudioRender.audioRenderInfo
  }

再写一个初始化的方法

static async init() {
    AudioRender.renderModel = await audio.createAudioRenderer(AudioRender.audioRenderOptions)
    AudioRender.renderModel.on('writeData', (buffer: ArrayBuffer) => {

      //校验文件是否存在
      if (AudioRender.renderFile) {
        //播放逻辑
        fileIo.readSync(AudioRender.renderFile.fd, buffer, {
          offset: AudioRender.renderSize,
          length: buffer.byteLength
        })
        //更新已经渲染的尺寸
        AudioRender.renderSize += buffer.byteLength
      }
      //自己判断是否结束
      if (AudioRender.renderSize >= AudioRender.maxSize) {
        //停止读取文件
        fileIo.closeSync(AudioRender.renderFile.fd)
        //停止播放文件
        AudioRender.stop()
      }
    })
  }

下来就是定义几个静态方法如开始录音、停止录音、和释放资源

  //开始播放
  static async start(filePath: string, callback1?: () => void, callback2?: () => void) {
    //每次播放前必须清空上一次的
    AudioRender.stop()
    //文件读取
    AudioRender.renderFile = fileIo.openSync(filePath, fileIo.OpenMode.READ_WRITE)
    //通过文件获取最大size
    AudioRender.maxSize = fileIo.statSync(AudioRender.renderFile.fd).size
    callback1 && callback1()
    if (callback2) {
      AudioRender.callBack = callback2
    }
    AudioRender.renderModel.start()
  }

  //停止播放
  static async stop() {
    //校验一下是否是第一次播放  遵循状态机,只有runing的时候才可以
    if (AudioRender.renderModel && AudioRender.renderModel.state === audio.AudioState.STATE_RUNNING) {
      await AudioRender.renderModel.stop()
      AudioRender.callBack && AudioRender.callBack()
      // //释放资源
      // await AudioRender.renderModel.release()
      //重置变量值
      AudioRender.renderSize = 0
      AudioRender.maxSize = 0

    }
  }

这里是需要定义的几个变量

//要进行播放的文件
  static renderFile: fileIo.File
  //播放文件的大小
  static maxSize: number = 0
  //已经播放的大小
  static renderSize: number = 0
  //结束回调函数
  static callBack: () => void
  //播放器
  static renderModel: audio.AudioRenderer

整体代码在这里

import { audio } from '@kit.AudioKit'
import { fileIo } from '@kit.CoreFileKit'

export class AudioRender {
  //播放器
  static renderModel: audio.AudioRenderer
  //streamInfo
  static audioStreamInfo: audio.AudioStreamInfo = {
    //频道
    samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_44100,
    //单声道
    channels: audio.AudioChannel.CHANNEL_1,
    sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE,
    encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW
  }
  //renderInfo
  static audioRenderInfo: audio.AudioRendererInfo = {
    usage: audio.StreamUsage.STREAM_USAGE_VOICE_ASSISTANT,
    rendererFlags: 0
  }
  static audioRenderOptions: audio.AudioRendererOptions = {
    streamInfo: AudioRender.audioStreamInfo,
    rendererInfo: AudioRender.audioRenderInfo
  }
  //要进行播放的文件
  static renderFile: fileIo.File
  //播放文件的大小
  static maxSize: number = 0
  //已经播放的大小
  static renderSize: number = 0
  //结束回调函数
  static callBack: () => void

  //监听
  static async init() {
    AudioRender.renderModel = await audio.createAudioRenderer(AudioRender.audioRenderOptions)
    AudioRender.renderModel.on('writeData', (buffer: ArrayBuffer) => {

      //校验文件是否存在
      if (AudioRender.renderFile) {
        //播放逻辑
        fileIo.readSync(AudioRender.renderFile.fd, buffer, {
          offset: AudioRender.renderSize,
          length: buffer.byteLength
        })
        //更新已经渲染的尺寸
        AudioRender.renderSize += buffer.byteLength
      }
      //自己判断是否结束
      if (AudioRender.renderSize >= AudioRender.maxSize) {
        //停止读取文件
        fileIo.closeSync(AudioRender.renderFile.fd)
        //停止播放文件
        AudioRender.stop()
      }
    })
  }

  //开始播放
  static async start(filePath: string, callback1?: () => void, callback2?: () => void) {
    //每次播放前必须清空上一次的
    AudioRender.stop()
    //文件读取
    AudioRender.renderFile = fileIo.openSync(filePath, fileIo.OpenMode.READ_WRITE)
    //通过文件获取最大size
    AudioRender.maxSize = fileIo.statSync(AudioRender.renderFile.fd).size
    callback1 && callback1()
    if (callback2) {
      AudioRender.callBack = callback2
    }
    AudioRender.renderModel.start()
  }

  //停止播放
  static async stop() {
    //校验一下是否是第一次播放  遵循状态机,只有runing的时候才可以
    if (AudioRender.renderModel && AudioRender.renderModel.state === audio.AudioState.STATE_RUNNING) {
      await AudioRender.renderModel.stop()
      AudioRender.callBack && AudioRender.callBack()
      // //释放资源
      // await AudioRender.renderModel.release()
      //重置变量值
      AudioRender.renderSize = 0
      AudioRender.maxSize = 0

    }
  }
}

然后就可以在页面中使用,记得写在aboutToAppear()中进行初始化操作然后就可以正常使用了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值