HarmonyOS 5.0.0 或以上:实现本地音频播放功能(含播放/暂停/进度控制)

好的,以下是第 21 篇内容:


📌 场景介绍

本地音频播放是音乐播放器、语言学习、播客等 App 的核心能力。本篇将实现:

  • 播放本地音频文件

  • 播放 / 暂停控制

  • 展示播放进度百分比

注意:音频文件需事先放入资源目录或通过文件系统动态访问。


🧱 页面结构

/entry/src/main/ets
  └── pages/
       └── AudioPlayerDemo.ets     // 本地音频播放页

🧱 放置音频资源

resources/rawfile/ 下放置音频文件:

resources/
  └── rawfile/
       └── demo.mp3

🧩 AudioPlayerDemo.ets 示例页面

import media from '@ohos.multimedia.media'

@Entry
@Component
struct AudioPlayerDemo {
  @State isPlaying: boolean = false
  @State progress: number = 0
  private player: media.AudioPlayer | undefined
  private intervalId: number = -1

  async aboutToAppear() {
    try {
      this.player = await media.createAudioPlayer()
      await this.player.setSource(__rawfile__ + 'demo.mp3')
      await this.player.prepare()
    } catch (err) {
      console.error('音频初始化失败:', JSON.stringify(err))
    }
  }

  private async play() {
    if (!this.player) return
    await this.player.play()
    this.isPlaying = true

    this.intervalId = setInterval(async () => {
      const pos = await this.player!.getCurrentTime()
      const dur = await this.player!.getDuration()
      this.progress = Number(((pos / dur) * 100).toFixed(1))
    }, 500)
  }

  private async pause() {
    if (!this.player) return
    await this.player.pause()
    this.isPlaying = false
    clearInterval(this.intervalId)
  }

  build() {
    Column() {
      Text("🎵 本地音频播放").fontSize(22).margin(20)

      Button(this.isPlaying ? "暂停" : "播放")
        .onClick(() => this.isPlaying ? this.pause() : this.play())
        .margin(20)

      Progress({ value: this.progress }).width(250).height(6)
      Text(`${this.progress.toFixed(1)}%`).fontSize(14).margin(10)
    }
    .padding(30)
    .height('100%')
    .alignItems(HorizontalAlign.Center)
  }
}

✅ 效果说明

  • 点击“播放”按钮即可播放 demo.mp3 音频

  • 可暂停/恢复播放

  • 显示播放进度百分比,自动更新


🔧 拓展建议

  • 添加进度条拖动调整播放位置

  • 支持播放网络音频(如 .m3u8, .mp3 URL)

  • 显示音频总时长 / 当前播放时间

  • 播放完成回调 setOnPlayCompletedListener

<think>好的,用户想知道如何在鸿蒙系统实现音频播放,特别是API文档和示例代码。我需要根据提供的引用资料来组织回答。首先,引用1提到AudioRenderer用于播放PCM数据,适合有经验的开发者。引用2提到AVVolumePanel组件控制音量。引用3和4涉及音频数据的写入和解码。用户可能需要分步骤的指导,包括初始化、配置参数、数据写入、播放控制等。 首先,我应该介绍AudioRenderer的基本使用流程,然后提供示例代码。同时,要提到音量控制的方法,比如使用AVVolumePanel。可能还需要解释音频解码的步骤,因为处理PCM数据可能需要解码。需要确保代码示例符合鸿蒙的ArkTS语法,并且步骤清晰。此外,用户可能对性能优化错误处理感兴趣,所以相关问题部分可以包括这些方面。还要注意引用标记的正确添加,如引用1到4对应的内容。最后,检查是否所有数学公式都正确使用了$...$$$...$$格式,虽然这个问题可能不涉及数学公式,但如果有参数设置计算的话需要注意。现在需要将这些内容结构化,确保符合用户的系统级指令和可见层的要求。</think>### 鸿蒙系统音频播放实现指南 #### 1. **核心API与组件** 鸿蒙系统提供`AudioRenderer`和`AVVolumePanel`组件实现音频播放与音量控制: - **`AudioRenderer`**:用于播放PCM音频数据,支持实时数据输入与处理[^1]。 - **`AVVolumePanel`**:系统级音量控制面板,支持界面集成[^2]。 --- #### 2. **实现步骤与示例代码** **步骤1:初始化`AudioRenderer`** ```typescript import audio from '@ohos.multimedia.audio'; // 创建音频参数配置 let audioOptions: audio.AudioRendererOptions = { streamInfo: { samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_44100, // 采样率 channels: audio.AudioChannel.CHANNEL_2, // 双声道 sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE, // 16位小端格式 encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW // 原始PCM数据 }, rendererInfo: { usage: audio.StreamUsage.STREAM_USAGE_MUSIC, // 音频流类型 rendererFlags: 0 // 默认标志 } }; // 创建AudioRenderer实例 let audioRenderer: audio.AudioRenderer; audio.createAudioRenderer(audioOptions, (err, renderer) => { if (!err) { audioRenderer = renderer; } }); ``` **步骤2:监听数据写入并填充音频流** ```typescript // 注册数据写入监听 audioRenderer.on('writeData', (buffer: ArrayBuffer) => { // 从文件网络读取PCM数据并填充buffer let pcmData = ...; // 假设已获取PCM数据 buffer.set(pcmData); }); // 开始播放 audioRenderer.start((err) => { if (!err) { console.log('音频播放已启动'); } }); ``` **步骤3:音量控制集成** ```typescript // 添加系统音量面板组件 AVVolumePanel.create({ position: 'right', // 面板位置 sliderStyle: { width: '80%' } // 样式配置 }); ``` **步骤4:停止与资源释放** ```typescript audioRenderer.stop((err) => { if (!err) { audioRenderer.release(); // 释放资源 } }); ``` --- #### 3. **音频解码规范(针对压缩格式)** 若播放非PCM音频(如MP3/AAC),需先解码为PCM: ```cpp // 使用OH_AudioCodec接口解码(C++示例) OH_AVCodec* audioDec = OH_AudioCodec_CreateByMime("audio/mp4a-latm"); OH_AudioCodec_Configure(audioDec, format); // 配置格式 OH_AudioCodec_Prepare(audioDec); // 准备解码器 // 输入待解码数据并获取PCM输出[^4] ``` --- #### 4. **关键注意事项** - **权限声明**:需在`module.json5`中添加`ohos.permission.MICROPHONE`和`ohos.permission.WRITE_AUDIO`权限。 - **性能优化**:使用`bufferSize`调整缓冲区大小避免卡顿。 - **异常处理**:监听`stateChange`事件处理播放中断错误。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值