苏锦广 發表於 2020-5-26 14:29:00

基于React 的audio音频播放组件

<p>基于React 的audio音频播放组件, 自定义播放/暂停按钮、进度条调节、音量调节、倍速播放。</p>
<h4 id="组件代码">组件代码:</h4>
<p>AudioPlay.js</p>
<pre><code>import React, { Component } from "react";

class App extends Component {
constructor(props) {
    super(props);
    this.state = {
      rateList: ,
      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 &gt;= 10 ? second : `0${second}`}`;
}

// 该视频已准备好开始播放
onCanPlay = () =&gt; {
    const { id } = this.props;
    const audio = document.getElementById(`audio${id}`);
    this.setState({
      allTime: audio.duration,
    });
};

playAudio = () =&gt; {
    const { id } = this.props;
    const audio = document.getElementById(`audio${id}`);
    audio.play();
    this.setState({
      isPlay: true,
    });
};

pauseAudio = () =&gt; {
    const { id } = this.props;
    const audio = document.getElementById(`audio${id}`);
    audio.pause();
    this.setState({
      isPlay: false,
    });
};

onMuteAudio = () =&gt; {
    const { id } = this.props;
    const audio = document.getElementById(`audio${id}`);
    this.setState({
      isMuted: !audio.muted,
    });
    audio.muted = !audio.muted;
};

changeTime = (e) =&gt; {
    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 = () =&gt; {
    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) =&gt; {
    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) =&gt; {
    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 (
      &lt;div&gt;
      &lt;audio
          id={`audio${id}`}
          src={src}
          ref={(audio) =&gt; {
            this.audioDom = audio;
          }}
          preload={"auto"}
          onCanPlay={this.onCanPlay}
          onTimeUpdate={this.onTimeUpdate}
      &gt;
          &lt;track src={src} kind="captions" /&gt;
      &lt;/audio&gt;

      {isPlay ? (
          &lt;div onClick={this.pauseAudio}&gt;暂停&lt;/div&gt;
      ) : (
          &lt;div onClick={this.playAudio}&gt;播放&lt;/div&gt;
      )}

      &lt;div&gt;
          &lt;span&gt;
            {this.formatSecond(currentTime) + "/" + this.formatSecond(allTime)}
          &lt;/span&gt;
          &lt;input
            type="range"
            step="0.01"
            max={allTime}
            value={currentTime}
            onChange={this.changeTime}
          /&gt;
      &lt;/div&gt;

      &lt;div onClick={this.onMuteAudio}&gt;静音&lt;/div&gt;

      &lt;div&gt;
          &lt;span&gt;音量调节:&lt;/span&gt;
          &lt;input
            type="range"
            onChange={this.changeVolume}
            value={isMuted ? 0 : volume}
          /&gt;
      &lt;/div&gt;

      &lt;div&gt;
          &lt;span&gt;倍速播放:&lt;/span&gt;
          {rateList &amp;&amp;
            rateList.length &gt; 0 &amp;&amp;
            rateList.map((item) =&gt; (
            &lt;button
                key={item}
                style={
                  playRate === item
                  ? {
                        border: "1px solid #188eff",
                        color: "#188eff",
                      }
                  : null
                }
                onClick={() =&gt; this.changePlayRate(item)}
            &gt;
                {item}
            &lt;/button&gt;
            ))}
      &lt;/div&gt;
      &lt;/div&gt;
    );
}
}

export default App;

</code></pre>
<h4 id="组件引用">组件引用</h4>
<pre><code>import Audio from "./AudioPlay";

&lt;Audio
src={
    "https://xxx.mp3"
}
id={123}
/&gt;
</code></pre><br><br>
来源:https://www.cnblogs.com/cckui/p/12965404.html
頁: [1]
查看完整版本: 基于React 的audio音频播放组件