鸿蒙(HarmonyOS)实战开发篇——基于AudioRenderer音频播放

往期知识点整理

方案选择

如何选择音频播放开发方式

  • AudioRenderer :用于音频输出的ArkTS/JS API,仅支持PCM格式,需要应用持续写入音频数据进行工作。应用可以在输入前添加数据预处理,如设定音频文件的采样率、位宽等,要求开发者具备音频处理的基础知识,适用于更专业、更多样化的媒体播放应用开发。
  • AVPlayer :用于音频播放的ArkTS/JS API,集成了流媒体和本地资源解析、媒体资源解封装、音频解码和音频输出功能。可用于直接播放wav、mp3、m4a等格式的音频文件。

在播放音频方面用的最多的就是系统提供的AudioRenderer和AVPlayer。AudioRenderer是音频渲染器,用于播放PCM(Pulse Code Modulation)音频数据,相比AVPlayer而言,可以在输入前添加数据预处理,更适合有音频开发经验的开发者,以实现更灵活的播放功能。使用AudioRenderer播放音频涉及到AudioRenderer实例的创建、音频渲染参数的配置、渲染的开始与停止、资源的释放等。

方案描述

使用AudioRenderer播放音频

配置音频渲染参数并创建AudioRenderer实例。在创建AudioRenderer实例之前可以先设置音频流信息AudioStreamInfo,音频流信息如下:

名称类型必填说明
samplingRateAudioSamplingRate音频文件的采样率。
channelsAudioChannel音频文件的通道数。
sampleFormatAudioSampleFormat音频采样格式。
encodingTypeAudioEncodingType音频编码类型。

其中编码模式只支持PCM编码,所以代码里默认是ENCODING_TYPE_RAW。

然后是设置音频渲染器信息,音频渲染器信息如下:

| 名称 | 类型 | 必填 | 说明 |
| usage | StreamUsage | 是 | 音频流使用类型。 |
| rendererFlags | number | 是 | 音频文件的通道数。 |

其中rendererFlags,0代表普通音频渲染器,1代表低时延音频渲染器。ArkTS接口暂不支持低时延音频渲染器,所以默认为0。

     let  audioStreamInfo: audio.AudioStreamInfo = {
      samplingRate: audio.AudioSamplingRate[this.samplingRate], // 采样率
      channels: audio.AudioChannel[this.channels], // 通道
      sampleFormat: audio.AudioSampleFormat[this.sampleFormat], // 采样格式
      encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW // 编码格式
    }
    let  audioRendererInfo: audio.AudioRendererInfo = {
      usage: audio.StreamUsage[this.usage], // 音频流使用类型
      rendererFlags: 0 // 音频渲染器标志
    }
    let  audioRendererOptions: audio.AudioRendererOptions = {
      streamInfo: audioStreamInfo,
      rendererInfo: audioRendererInfo
    }

select提供下拉选择菜单,可以让用户在多个选项之间选择,和text组件一起使用就可以实现让用户自由选择配置信息的能力,这里以采样率下拉菜单为例子。

Text('采样率')
        .fontSize(16)
        .fontWeight(FontWeight.Bold)
        .textAlign(TextAlign.End)
        .margin({ right: 4 })

      Select([{ value: 'SAMPLE_RATE_8000' },
        { value: 'SAMPLE_RATE_11025' },
        { value: 'SAMPLE_RATE_12000' },
        { value: 'SAMPLE_RATE_16000' },
        { value: 'SAMPLE_RATE_22050' },
        { value: 'SAMPLE_RATE_24000' },
        { value: 'SAMPLE_RATE_32000' },
        { value: 'SAMPLE_RATE_44100' },
        { value: 'SAMPLE_RATE_48000' },
        { value: 'SAMPLE_RATE_64000' },
        { value: 'SAMPLE_RATE_88200' },
        { value: 'SAMPLE_RATE_96000' },
        { value: 'SAMPLE_RATE_176400' },
        { value: 'SAMPLE_RATE_192000' },])
        .selected(this.index)
        .value(this.samplingRate)
        .font({ size: 16, weight: 500 })
        .fontColor('#182431')
        .selectedOptionFont({ size: 16, weight: 400 })
        .optionFont({ size: 16, weight: 400 })
        .space(this.space)
        .arrowPosition(this.arrowPosition)
        .menuAlign(MenuAlignType.START, { dx: 0, dy: 0 })
        .optionWidth(200)
        .optionHeight(300)
        .onSelect((index: number, text?: string | undefined) => {
          console.info('Select:' + index)
          this.index = index;
          if (text) {
            this.samplingRate = text;
            if (samplingRateData.get(this.samplingRate)) {
              this.samplingRate1 = samplingRateData.get(this.samplingRate)
            }
          }
        })
  • 调用on(‘writeData’)方法,订阅监听音频数据写入回调。
import { BusinessError } from '@ohos.base';
import fs from '@ohos.file.fs';

let bufferSize: number = 0;
class Options {
  offset?: number;
  length?: number;
}

let path = getContext().cacheDir;
//确保该路径下存在该资源
let filePath = path + '/result_48000_1.pcm';
let file: fs.File = fs.openSync(filePath, fs.OpenMode.READ_ONLY);
let writeDataCallback = (buffer: ArrayBuffer) => {
  let options: Options = {
    offset: bufferSize,
    length: buffer.byteLength
  }
  fs.readSync(file.fd, buffer, options);
  bufferSize += buffer.byteLength;
}

audioRenderer.on('writeData', writeDataCallback);
  • 调用start()方法进入running状态,开始渲染音频。
import { BusinessError } from '@ohos.base';

audioRenderer.start((err: BusinessError) => {
  if (err) {
    console.error(`Renderer start failed, code is ${err.code}, message is ${err.message}`);
  } else {
    console.info('Renderer start success.');
  }
});
  • 调用stop()方法停止渲染。
import { BusinessError } from '@ohos.base';

audioRenderer.stop((err: BusinessError) => {
  if (err) {
    console.error(`Renderer stop failed, code is ${err.code}, message is ${err.message}`);
  } else {
    console.info('Renderer stopped.');
  }
});
  • 调用release()方法销毁实例,释放资源。
import { BusinessError } from '@ohos.base';

audioRenderer.release((err: BusinessError) => {
  if (err) {
    console.error(`Renderer release failed, code is ${err.code}, message is ${err.message}`);
  } else {
    console.info('Renderer released.');
  } 
});

select下拉菜单的展示效果图

最后

经常有很多小伙伴抱怨说:不知道学习鸿蒙开发哪些技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?

为了能够帮助到大家能够有规划的学习,这里特别整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、WebGL、元服务、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植等等)鸿蒙(HarmonyOS NEXT)技术知识点。

在这里插入图片描述

《鸿蒙 (Harmony OS)开发学习手册》(共计892页):https://gitcode.com/HarmonyOS_MN/733GH/overview

如何快速入门?

1.基本概念
2.构建第一个ArkTS应用
3.……

鸿蒙开发面试真题(含参考答案):

在这里插入图片描述

《OpenHarmony源码解析》:

  • 搭建开发环境
  • Windows 开发环境的搭建
  • Ubuntu 开发环境搭建
  • Linux 与 Windows 之间的文件共享
  • ……
  • 系统架构分析
  • 构建子系统
  • 启动流程
  • 子系统
  • 分布式任务调度子系统
  • 分布式通信子系统
  • 驱动子系统
  • ……

图片

OpenHarmony 设备开发学习手册:https://gitcode.com/HarmonyOS_MN/733GH/overview

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值