index.tsx 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import { Icon } from 'vant'
  2. import { defineComponent, onUnmounted, reactive, watch } from 'vue'
  3. import styles from './index.module.less'
  4. import { Howl } from 'howler'
  5. import iconAudio from './images/icon-audio.png'
  6. import iconPlay from './images/icon-play.png'
  7. import iconPause from './images/icon-pause.png'
  8. import { eventUnit } from '../../unit'
  9. // 音频播放
  10. export default defineComponent({
  11. name: 'unit-audio',
  12. props: {
  13. src: {
  14. type: String,
  15. default: ''
  16. }
  17. },
  18. setup(props) {
  19. const state = reactive({
  20. audioStatus: 'stopped',
  21. duration: 0
  22. })
  23. // https://github.com/Tonejs/Tone.js/issues/784 部分ios上可能存在问题
  24. const htick: any = new Howl({
  25. src: props.src + '?t=' + +new Date(),
  26. format: ['mp3']
  27. // sprite: {
  28. // blast: [0, 3000],
  29. // laser: [4000, 1000],
  30. // winner: [6000, 5000]
  31. // }
  32. })
  33. // console.log(htick)
  34. htick.on('load', (val: any) => {
  35. console.log(htick.duration())
  36. state.duration = Math.ceil(htick.duration())
  37. })
  38. eventUnit.on('unitAudioStop', () => {
  39. htick.stop()
  40. state.audioStatus = 'stopped'
  41. })
  42. onUnmounted(() => {
  43. htick.off('load')
  44. })
  45. return () => (
  46. <div class={styles.unitAudio}>
  47. <div class={styles.htmlAudio}>
  48. <div class={styles.htmlTimes}>
  49. <Icon class={styles.iconAudio} name={iconAudio} />
  50. <span>{state.duration}"</span>
  51. </div>
  52. {/* pause-circle */}
  53. {/* 'play-circle' : 'pause-circle' */}
  54. <Icon
  55. name={state.audioStatus === 'stopped' ? iconPause : iconPlay}
  56. class={styles.audioStatus}
  57. onClick={(e: any) => {
  58. e.stopPropagation()
  59. if (state.audioStatus === 'stopped') {
  60. eventUnit.emit('unitAudioStop')
  61. htick.play()
  62. state.audioStatus = 'paused'
  63. } else if (state.audioStatus === 'paused') {
  64. htick.pause()
  65. state.audioStatus = 'stopped'
  66. }
  67. }}
  68. />
  69. </div>
  70. {/* <audio controls class={styles.nativeAudio} id={state.id}>
  71. <source src={props.src} type="audio/mpeg" />
  72. 您的浏览器不支持该音频格式。
  73. </audio> */}
  74. </div>
  75. )
  76. }
  77. })