react怎么控制audio

基于react的audio组件

样式请自己定义哦~

需要其他功能请自行添加!

// 组件调用
<Audio src={src地址} id={srcID}/>

audio属性

src 歌曲的路径

preload 是否在页面加载后立即加载(设置autoplay后无效)

controls 显示audio自带的播放控件

loop 音频循环

autoplay 音频加载后自动播放

currentTime 音频当前播放时间

duration 音频总长度

ended 音频是否结束

muted 音频静音为true

volume 当前音频音量

readyState 音频当前的就绪状态

audio事件

abort 当音频/视频的加载已放弃时

canplay 当浏览器可以播放音频/视频时

canplaythrough 当浏览器可在不因缓冲而停顿的情况下进行播放时

durationchange 当音频/视频的时长已更改时

emptied 当目前的播放列表为空时

ended 当目前的播放列表已结束时

error 当在音频/视频加载期间发生错误时

loadeddata 当浏览器已加载音频/视频的当前帧时

loadedmetadata 当浏览器已加载音频/视频的元数据时

loadstart 当浏览器开始查找音频/视频时

pause 当音频/视频已暂停时

play 当音频/视频已开始或不再暂停时

playing 当音频/视频在已因缓冲而暂停或停止后已就绪时

progress 当浏览器正在下载音频/视频时

ratechange 当音频/视频的播放速度已更改时

seeked 当用户已移动/跳跃到音频/视频中的新位置时

seeking 当用户开始移动/跳跃到音频/视频中的新位置时

stalled 当浏览器尝试获取媒体数据,但数据不可用时

suspend 当浏览器刻意不获取媒体数据时

timeupdate 当目前的播放位置已更改时

volumechange 当音量已更改时

waiting 当视频由于需要缓冲下一帧而停止

组件结构

 <div className="audioBox">
  <audio 
    id={`audio${id}`}
    src={src}
    preload={true}
    onCanPlay={() => this.controlAudio('allTime')}
    onTimeUpdate={(e) => this.controlAudio('getCurrentTime')}
  >
    您的浏览器不支持 audio 标签。
  </audio>  
  <i 
    className={isPlay ? 'pause' : 'play'} 
    onClick={() => this.controlAudio(isPlay ? 'pause' : 'play')}
  />
  <span className="current">
    {this.millisecondToDate(currentTime)+'/'+this.millisecondToDate(allTime)}
  </span>
  <input 
    type="range" 
    className="time" 
    step="0.01" 
    max={allTime}     
    value={currentTime}  
    onChange={(value) => this.controlAudio('changeCurrentTime',value)} 
  />
  <i 
    className={isMuted ? 'mute' : 'nomute'} 
    onClick={() => this.controlAudio('muted')}
  />
  <input 
    type="range" 
    className="volume"
    onChange={(value) => this.controlAudio('changeVolume',value)} 
    value={isMuted ? 0 : volume} 
  />
</div>

组件javascript

  constructor(props) {
    super(props)
    this.state = {
      isPlay: false,
      isMuted: false,
      volume: 100,
      allTime: 0,
      currentTime: 0
    }
  }
  
  millisecondToDate(time) {
    const second = Math.floor(time 
    let minite = Math.floor(time / 60)
    // let hour
    // if(minite > 60) {
    //   hour = minite / 60
    //   minite = minite     //   return `${Math.floor(hour)}:${Math.floor(minite)}:${Math.floor(second)}`
    // }
    return `${minite}:${second >= 10 ? second : `0${second}`}`
  }
  controlAudio(type,value) {
    const { id,src } = this.props
    const audio = document.getElementById(`audio${id}`)
    switch(type) {
      case 'allTime':
        this.setState({
          allTime: audio.duration
        })
        break
      case 'play':
        audio.play()
        this.setState({
          isPlay: true
        })
        break
      case 'pause':
        audio.pause()
        this.setState({
          isPlay: false
        })
        break
      case 'muted':
        this.setState({
          isMuted: !audio.muted
        })
        audio.muted = !audio.muted
        break
      case 'changeCurrentTime':
        this.setState({
          currentTime: value
        })
        audio.currentTime = value
        if(value == audio.duration) {
          this.setState({
            isPlay: false
          })
        }
        break
      case 'getCurrentTime':
        this.setState({
          currentTime: audio.currentTime
        })
        if(audio.currentTime == audio.duration) {
          this.setState({
            isPlay: false
          })
        }
        break
      case 'changeVolume':
        audio.volume = value / 100
        this.setState({
          volume: value,
          isMuted: !value
        })
        break  
    }
  }

更多相关技术文章,请访问HTML中文网

以上就是react怎么控制audio的详细内容,更多请关注易知道|edz.cc其它相关文章!

推荐阅读