赞
踩
方案选择
如何选择音频播放开发方式
在播放音频方面用的最多的就是系统提供的AudioRenderer和AVPlayer。AudioRenderer是音频渲染器,用于播放PCM(Pulse Code Modulation)音频数据,相比AVPlayer而言,可以在输入前添加数据预处理,更适合有音频开发经验的开发者,以实现更灵活的播放功能。使用AudioRenderer播放音频涉及到AudioRenderer实例的创建、音频渲染参数的配置、渲染的开始与停止、资源的释放等。
方案描述
使用AudioRenderer播放音频
配置音频渲染参数并创建AudioRenderer实例。在创建AudioRenderer实例之前可以先设置音频流信息AudioStreamInfo,音频流信息如下:
名称 | 类型 | 必填 | 说明 |
samplingRate | 是 | 音频文件的采样率。 | |
channels | 是 | 音频文件的通道数。 | |
sampleFormat | 是 | 音频采样格式。 | |
encodingType | 是 | 音频编码类型。 |
其中编码模式只支持PCM编码,所以代码里默认是ENCODING_TYPE_RAW。
然后是设置音频渲染器信息,音频渲染器信息如下:
名称 | 类型 | 必填 | 说明 |
usage | 是 | 音频流使用类型。 | |
rendererFlags | 是 | 音频文件的通道数。 |
其中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)
- }
- }
- })
- 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);
- 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.');
- }
- });
- 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.');
- }
- });
- 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下拉菜单的展示效果图
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。