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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值