H5自动播放背景音乐(IOS和安卓)

安卓与IOS播放

安卓可以直接使用audio标签进行播放

<audio
	ref="sound"
	:src="bgm.mp3"
	loop />
const audio = document.querySelector('audio')
audio.play()

IOS端需要借助微信自带的事件进行播放

const audio = document.querySelector('audio')
document.addEventListener('WeixinJSBridgeReady', () => {
	audio.play()
}, false)

其他app客户端直接同安卓端一样直接播放
浏览器app部分可能不支持自动播放

安卓与IOS兼容

有Loading页,需要在Loading页之后播放背景音乐时,IOS端依旧无法自动播放,因为自动播放音频依托于微信的WeixinJSBridgeReady的事件,WeixinJSBridgeReady通常发生很快,在Loading页结束之前已经发生,此时可以在WeixinJSBridgeReady时播放一段空音频,等待Loading结束,再播放bgm。

var _audio
var _isWeixinJSBridgeReady = false
document.addEventListener('WeixinJSBridgeReady', () => {
  _isWeixinJSBridgeReady = true
  _audio = new Audio()
  _audio.style.display = 'none'
  // 播放空音频
  _audio.src = 'empty.mp3'
  _audio.play()
}, false)

const initMusic = () => {
	var setInitMuisc = () => {
		// 播放背景音乐
		_audio.src = 'bgm.mp3'
		_audio.play()

		document.removeEventListener('click', setInitMuisc)
		document.removeEventListener('touchstart', setInitMuisc)
    }
	document.addEventListener('click', setInitMuisc)
    document.addEventListener('touchstart', setInitMuisc)
    document.body.click()
}
  
const playMusic = () => {
	if (!_isWeixinJSBridgeReady && /MicroMessenger/.test(window.navigator.userAgent)) {
		document.addEventListener('WeixinJSBridgeReady', () => {
        	initMusic()
		}, false)
    } else {
		initMusic()
    }
}

以下是自己封装好的音频播放,可以参考参考

// MusicPlayer.js
var _audio
var _isWeixinJSBridgeReady = false
document.addEventListener('WeixinJSBridgeReady', () => {
  _isWeixinJSBridgeReady = true
  _audio = new Audio()
  _audio.style.display = 'none'
  _audio.src = 'empty.mp3'
  _audio.play()
}, false)

var style = document.createElement('style')
style.setAttribute('role', 'm-sdk-MusicPlayer')
style.innerHTML = `
.m-sdk-music-player.play[mode="rotate"],
.m-sdk-music-player.play[mode="reset"] {
    animation: music-rotate 8s linear infinite;
    -webkit-animation: music-rotate 8s linear infinite;
}
.m-sdk-music-player.pause[mode="rotate"],
.m-sdk-music-player.pause[mode="reset"] {
  animation-play-state: paused;
  -webkit-animation-play-state: paused;
}
.m-sdk-music-player__play,
.m-sdk-music-player__pause {
  display: none;
  width: 100%;
  height: 100%;
}
.m-sdk-music-player.play .m-sdk-music-player__play,
.m-sdk-music-player[mode="rotate"].play .m-sdk-music-player__pause,
.m-sdk-music-player[mode="reset"] .m-sdk-music-player__pause,
.m-sdk-music-player.pause .m-sdk-music-player__pause {
  display: block;
}
.m-sdk-music-player.play[mode="replace"] .m-sdk-music-player__pause {
  display: none;
}
@keyframes music-rotate {
  0%{
    transform: rotate(0);
    -webkit-transform: rotate(0);
  }
  100%{
    transform: rotate(1turn);
    -webkit-transform: rotate(1turn);
  }
}
`
document.querySelector('head').appendChild(style)
/**
 * @param {object} options 参数表列
 * el 所要挂载的元素
 * src 链接地址
 * mode 模式 rotate旋转,reset暂停则复位,replace图标切换
 * loop 是否循环 false
 * icon 图标链接路径
 * playIcon 播放时的图标路径
 * isAutoPlay 是否默认播放 true
 */
function MusicPlayer(options) {
  this.config = Object.assign({}, options)
  this.isUserPaused = false
  if (typeof options.el === 'string') {
    this._view = document.querySelector(options.el)
  } else if (options.el instanceof HTMLElement) {
    this._view = options.el
  }
  this._view.classList.add('m-sdk-music-player', 'pause')
  // this._view.setAttribute('mode', 'rotate')
  // this._view.setAttribute('mode', 'reset')
  // this._view.setAttribute('mode', 'replace')
  this._view.setAttribute('mode', options.mode || 'rotate')

  this.src = options.src

  var _player = _audio || new Audio()
  _player.loop = options.loop || false
  _player.src = this.src

  var pauseIcon = new Image()
  pauseIcon.src = options.icon
  pauseIcon.classList.add('m-sdk-music-player__pause')
  this._view.appendChild(pauseIcon)

  if (options.mode === 'replace' && options.playIcon) {
    var playIcon = new Image()
    playIcon.src = options.playIcon
    playIcon.classList.add('m-sdk-music-player__play')
    this._view.appendChild(playIcon)
  }

  this._view.addEventListener('click', () => {
    if (this.paused) {
      this.play()
    } else {
      this.pause()
    }
    this.isUserPaused = !this.paused
  })
  _player.onplay = () => {
    this._view.classList.remove('pause')
    this._view.classList.add('play')
  }
  _player.onpause = () => {
    if (options.mode === 'reset' || options.mode === 'replace') {
      this._view.classList.remove('play')
    }
    this._view.classList.add('pause')
  }

  var initMusic = () => {
    var setInitMuisc = () => {
      _player.play()

      document.removeEventListener('click', setInitMuisc)
      document.removeEventListener('touchstart', setInitMuisc)
    }
    document.addEventListener('click', setInitMuisc)
    document.addEventListener('touchstart', setInitMuisc)

    document.body.click()
  }

  if (options.isAutoPlay === undefined || options.isAutoPlay) {
    if (!_isWeixinJSBridgeReady && /MicroMessenger/.test(window.navigator.userAgent)) {
      document.addEventListener('WeixinJSBridgeReady', () => {
        initMusic()
      }, false)
    } else {
      initMusic()
    }
  }

  this.play = function() {
    _player.play()
  }

  this.pause = function() {
    _player.pause()
  }

  this.replay = function() {
    _player.replay()
  }

  Object.defineProperty(this, 'currentTime', {
    get: function() {
      return this._audio && this._audio.currentTime || 0 
    }
  })

  Object.defineProperty(this, 'paused', {
    get: function() {
      return this._audio && this._audio.paused
    }
  })
}

MusicPlayer.prototype.create = function(opt) {
  return new MusicPlayer(opt)
}

export default MusicPlayer

使用方法

import MusicPlayer from 'MusicPlayer'
const player = new MusicPlayer({
	src: 'bgm.mp3'
})

版权声明:本文为heartcnc原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。