好的,以下是第 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