当前位置:   article > 正文

基于AudioRenderer音频播放_audiorendereronwritedata

audiorendereronwritedata

方案选择

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

  • 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,音频流信息如下:

名称

类型

必填

说明

samplingRate

AudioSamplingRate

音频文件的采样率。

channels

AudioChannel

音频文件的通道数。

sampleFormat

AudioSampleFormat

音频采样格式。

encodingType

AudioEncodingType

音频编码类型。

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

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

名称

类型

必填

说明

usage

StreamUsage

音频流使用类型。

rendererFlags

number

音频文件的通道数。

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

  1.      let  audioStreamInfo: audio.AudioStreamInfo = {
  2.       samplingRate: audio.AudioSamplingRate[this.samplingRate], // 采样率
  3.       channels: audio.AudioChannel[this.channels], // 通道
  4.       sampleFormat: audio.AudioSampleFormat[this.sampleFormat], // 采样格式
  5.       encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW // 编码格式
  6.     }
  7.     let  audioRendererInfo: audio.AudioRendererInfo = {
  8.       usage: audio.StreamUsage[this.usage], // 音频流使用类型
  9.       rendererFlags: 0 // 音频渲染器标志
  10.     }
  11.     let  audioRendererOptions: audio.AudioRendererOptions = {
  12.       streamInfo: audioStreamInfo,
  13.       rendererInfo: audioRendererInfo
  14.     }

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

  1. Text('采样率')
  2.         .fontSize(16)
  3.         .fontWeight(FontWeight.Bold)
  4.         .textAlign(TextAlign.End)
  5.         .margin({ right: 4 })
  6.  
  7.       Select([{ value: 'SAMPLE_RATE_8000' },
  8.         { value: 'SAMPLE_RATE_11025' },
  9.         { value: 'SAMPLE_RATE_12000' },
  10.         { value: 'SAMPLE_RATE_16000' },
  11.         { value: 'SAMPLE_RATE_22050' },
  12.         { value: 'SAMPLE_RATE_24000' },
  13.         { value: 'SAMPLE_RATE_32000' },
  14.         { value: 'SAMPLE_RATE_44100' },
  15.         { value: 'SAMPLE_RATE_48000' },
  16.         { value: 'SAMPLE_RATE_64000' },
  17.         { value: 'SAMPLE_RATE_88200' },
  18.         { value: 'SAMPLE_RATE_96000' },
  19.         { value: 'SAMPLE_RATE_176400' },
  20.         { value: 'SAMPLE_RATE_192000' },])
  21.         .selected(this.index)
  22.         .value(this.samplingRate)
  23.         .font({ size: 16, weight: 500 })
  24.         .fontColor('#182431')
  25.         .selectedOptionFont({ size: 16, weight: 400 })
  26.         .optionFont({ size: 16, weight: 400 })
  27.         .space(this.space)
  28.         .arrowPosition(this.arrowPosition)
  29.         .menuAlign(MenuAlignType.START, { dx: 0, dy: 0 })
  30.         .optionWidth(200)
  31.         .optionHeight(300)
  32.         .onSelect((index: number, text?: string | undefined) => {
  33.           console.info('Select:' + index)
  34.           this.index = index;
  35.           if (text) {
  36.             this.samplingRate = text;
  37.             if (samplingRateData.get(this.samplingRate)) {
  38.               this.samplingRate1 = samplingRateData.get(this.samplingRate)
  39.             }
  40.           }
  41.         })
  • 调用on('writeData')方法,订阅监听音频数据写入回调。
  1. import { BusinessError } from '@ohos.base';
  2. import fs from '@ohos.file.fs';
  3.  
  4. let bufferSize: number = 0;
  5. class Options {
  6.   offset?: number;
  7.   length?: number;
  8. }
  9.  
  10.  
  11. let path = getContext().cacheDir;
  12. //确保该路径下存在该资源
  13. let filePath = path + '/result_48000_1.pcm';
  14. let file: fs.File = fs.openSync(filePath, fs.OpenMode.READ_ONLY);
  15. let writeDataCallback = (buffer: ArrayBuffer) => {
  16.   let options: Options = {
  17.     offset: bufferSize,
  18.     length: buffer.byteLength
  19.   }
  20.   fs.readSync(file.fd, buffer, options);
  21.   bufferSize += buffer.byteLength;
  22. }
  23.  
  24. audioRenderer.on('writeData', writeDataCallback);
  • 调用start()方法进入running状态,开始渲染音频。
  1. import { BusinessError } from '@ohos.base';
  2.  
  3. audioRenderer.start((err: BusinessError) => {
  4.   if (err) {
  5.     console.error(`Renderer start failed, code is ${err.code}, message is ${err.message}`);
  6.   } else {
  7.     console.info('Renderer start success.');
  8.   }
  9. });
  • 调用stop()方法停止渲染。
  1. import { BusinessError } from '@ohos.base';
  2.  
  3. audioRenderer.stop((err: BusinessError) => {
  4.   if (err) {
  5.     console.error(`Renderer stop failed, code is ${err.code}, message is ${err.message}`);
  6.   } else {
  7.     console.info('Renderer stopped.');
  8.   }
  9. });
  • 调用release()方法销毁实例,释放资源。
  1. import { BusinessError } from '@ohos.base';
  2.  
  3. audioRenderer.release((err: BusinessError) => {
  4.   if (err) {
  5.     console.error(`Renderer release failed, code is ${err.code}, message is ${err.message}`);
  6.   } else {
  7.     console.info('Renderer released.');
  8.   } 
  9. });

select下拉菜单的展示效果图

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/773967
推荐阅读
相关标签
  

闽ICP备14008679号