基于React 的audio音频播放组件
基于React 的audio音频播放组件, 自定义播放/暂停按钮、进度条调节、音量调节、倍速播放。
组件代码:
AudioPlay.js
import React, { Component } from "react";
class App extends Component {
constructor(props) {
super(props);
this.state = {
rateList: [1.0, 1.25, 1.5, 2.0],
playRate: 1.0,
isPlay: false,
isMuted: false,
volume: 100,
allTime: 0,
currentTime: 0,
};
}
componentDidMount() {}
formatSecond(time) {
const second = Math.floor(time % 60);
let minite = Math.floor(time / 60);
return `${minite}:${second >= 10 ? second : `0${second}`}`;
}
// 该视频已准备好开始播放
onCanPlay = () => {
const { id } = this.props;
const audio = document.getElementById(`audio${id}`);
this.setState({
allTime: audio.duration,
});
};
playAudio = () => {
const { id } = this.props;
const audio = document.getElementById(`audio${id}`);
audio.play();
this.setState({
isPlay: true,
});
};
pauseAudio = () => {
const { id } = this.props;
const audio = document.getElementById(`audio${id}`);
audio.pause();
this.setState({
isPlay: false,
});
};
onMuteAudio = () => {
const { id } = this.props;
const audio = document.getElementById(`audio${id}`);
this.setState({
isMuted: !audio.muted,
});
audio.muted = !audio.muted;
};
changeTime = (e) => {
const { value } = e.target;
const { id } = this.props;
const audio = document.getElementById(`audio${id}`);
this.setState({
currentTime: value,
});
audio.currentTime = value;
if (value === audio.duration) {
this.setState({
isPlay: false,
});
}
};
// 当前播放位置改变时执行
onTimeUpdate = () => {
const { id } = this.props;
const audio = document.getElementById(`audio${id}`);
this.setState({
currentTime: audio.currentTime,
});
if (audio.currentTime === audio.duration) {
this.setState({
isPlay: false,
});
}
};
changeVolume = (e) => {
const { value } = e.target;
const { id } = this.props;
const audio = document.getElementById(`audio${id}`);
audio.volume = value / 100;
this.setState({
volume: value,
isMuted: !value,
});
};
// 倍速播放
changePlayRate = (num) => {
this.audioDom.playbackRate = num;
this.setState({
playRate: num,
});
};
render() {
const { src, id } = this.props;
const {
isPlay,
isMuted,
volume,
allTime,
currentTime,
rateList,
playRate,
} = this.state;
return (
<div>
<audio
id={`audio${id}`}
src={src}
ref={(audio) => {
this.audioDom = audio;
}}
preload={"auto"}
onCanPlay={this.onCanPlay}
onTimeUpdate={this.onTimeUpdate}
>
<track src={src} kind="captions" />
</audio>
{isPlay ? (
<div onClick={this.pauseAudio}>暂停</div>
) : (
<div onClick={this.playAudio}>播放</div>
)}
<div>
<span>
{this.formatSecond(currentTime) + "/" + this.formatSecond(allTime)}
</span>
<input
type="range"
step="0.01"
max={allTime}
value={currentTime}
onChange={this.changeTime}
/>
</div>
<div onClick={this.onMuteAudio}>静音</div>
<div>
<span>音量调节:</span>
<input
type="range"
onChange={this.changeVolume}
value={isMuted ? 0 : volume}
/>
</div>
<div>
<span>倍速播放:</span>
{rateList &&
rateList.length > 0 &&
rateList.map((item) => (
<button
key={item}
style={
playRate === item
? {
border: "1px solid #188eff",
color: "#188eff",
}
: null
}
onClick={() => this.changePlayRate(item)}
>
{item}
</button>
))}
</div>
</div>
);
}
}
export default App;
组件引用
import Audio from "./AudioPlay";
<Audio
src={
"https://xxx.mp3"
}
id={123}
/>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构