当前位置:   article > 正文

微信小程序播放音乐的方法中的两种方法

微信小程序播放音乐

微信小程序播放音乐的方法有很多种,这里总结一下其中两种的优缺点,主要是最近用到了

audio组件

这个是最简单的

<audio src="播放链接" id="music"></audio>

其他的就不多说了,说一下现在微信文档里没有的action属性

action属性可以选择组件对应的动作,比如播放或暂停,具体如下

<audio src="播放链接" action="play" id="music"></audio>

或者

  1. data{
  2. action:{ method:'play' }
  3. }
<audio src="播放链接" action="{{action}}" id="music"></audio>

不过这样的话要考虑渲染延时问题,具体在这里:audio组件渲染层错误

audio组件操作简单,但是有些功能不好实现,或者说功能太单调了,比如想要一个自定义的音乐进度条,或者显示音乐时长和已播放时间,那么该怎么得到组件中音乐的时长?又怎么跳到对应的进度?

之前还有个audioContext,可以和组件的id绑定,从而操作组件的行为,但是现在audioContext不维护了,不过还有个innerAudioContext

innerAudioContext

可以在page外定义一个innerAudioContext,这样可以在其他方法中对同一个innerAudioContext进行操作,也不需要重复定义

  1. const innerAudioContext = wx.createInnerAudioContext()
  2. page{
  3. onload(){
  4. innerAudioContext.autoplay = true
  5. innerAudioContext.src = '播放链接'
  6. var duration = innerAudioContext.duration //获取总时长
  7. innerAudioContext.seek(666) //跳至对应的时间,单位为秒
  8. }
  9. }

利用slider实现进度条

  1. <view class="timebox">
  2. <view>{{passTime}}</view>
  3. <slider block-size="12" bindchange="sliderChange" value="{{sliderSeek}}"></slider>
  4. <view>{{musicEndTime}}</view>
  5. </view>
  1. const innerAudioContext = wx.createInnerAudioContext()
  2. Page({
  3. data: {
  4. musicId: "",
  5. musicDuration: <any>[],
  6. musicEndTime: "",
  7. passTime: "00:00",
  8. sliderSeek: <number>{},
  9. },
  10. getMusicEndTime: function () { //拿到时长
  11. var duration: number
  12. innerAudioContext.onCanplay(() => {
  13. innerAudioContext.duration
  14. setTimeout(() => {
  15. duration = innerAudioContext.duration
  16. this.setData({ musicDuration: duration })
  17. var min = parseInt(duration / 60)
  18. var sec = parseInt(duration % 60)
  19. if (min < 10) {
  20. min = `0${min}` //以00:00的格式保存
  21. }
  22. if (sec < 10) {
  23. sec = `0${sec}`
  24. }
  25. this.setData({ musicEndTime: `${min}:${sec}` })
  26. }, 10);
  27. })
  28. },
  29. updataSlider: function () { //自动更新进度条
  30. var duration: number
  31. var value = 0
  32. let that = this
  33. var timeSeek
  34. var interval: number | null = null
  35. innerAudioContext.onPlay(() => {
  36. innerAudioContext.duration
  37. setTimeout(function () { //setTimeout fuction 是个闭包
  38. duration = innerAudioContext.duration;
  39. if (interval != null) { //检查定时器是否重置
  40. clearInterval(interval)
  41. console.log("interval!=null")
  42. } else {
  43. interval = setInterval(function () { //设置定时器
  44. value += 1
  45. timeSeek = parseInt(100 * value / duration)
  46. // console.log(that.data.sliderSeek)
  47. var min = parseInt(value / 60)
  48. var sec = parseInt(value % 60)
  49. if (min < 10) {
  50. min = `0${min}` //改为两位数格式
  51. }
  52. if (sec < 10) {
  53. sec = `0${sec}`
  54. }
  55. console.log(min + ":" + sec)
  56. that.setData({ passTime: `${min}:${sec}` })
  57. if (timeSeek >= 100) { //进度条进度达到一百重置
  58. clearInterval(interval)
  59. timeSeek = 0
  60. console.log("进度条百分比大于一百")
  61. }
  62. that.setData({ sliderSeek: timeSeek })
  63. }, 1000)
  64. }
  65. }, 10)
  66. })
  67. },
  68. onLoad() {
  69. this.getMusicEndTime()
  70. this.updataSlider()
  71. let id = this.data.musicId
  72. innerAudioContext.autoplay = true
  73. innerAudioContext.src = 'http://music.163.com/song/media/outer/url?id=' + id
  74. },
  75. })

 需要注意的duration得这样拿,不然会拿到0或者undefined

  1. getMusicEndTime: function () {
  2. var duration: number
  3. innerAudioContext.onCanplay(() => {
  4. innerAudioContext.duration //先初始化
  5. setTimeout(() => { //再timeout延时
  6. duration = innerAudioContext.duration //duration才不为0,缺一不可
  7. }, 10);
  8. })
  9. }

有时间再更新一下滑动进度条更改歌曲进度的实现

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/473983
推荐阅读
相关标签
  

闽ICP备14008679号