返回

微信小程序音乐播放器踩过的坑!

前端

微信小程序音乐播放器开发中的坑与解决之道

对于热衷音乐的开发者而言,构建一款微信小程序音乐播放器是一个既有趣又富有挑战性的项目。然而,在这段旅程中,不可避免地会遇到各种坑洼,阻碍我们前进的步伐。本文旨在分享我在开发音乐播放器时所遇到的坎坷,以及解决这些问题的方法,希望对其他开发者有所助益。

1. 云数据库数据获取与 AudioContext 事件执行

踩过的坑

在使用 wx.cloud.database 获取云数据库中的音乐数据后,我尝试通过 innerAudioContext.onTimeUpdate 事件来监听音频播放进度。令人惊讶的是,该事件始终未能触发。

// 错误代码示例

const musicCollection = db.collection('music');

musicCollection.get().then(res => {
  this.setData({
    musicList: res.data
  });

  const innerAudioContext = wx.createInnerAudioContext();
  innerAudioContext.src = this.data.musicList[0].url;
  innerAudioContext.onTimeUpdate(() => {
    console.log('当前播放时间:', innerAudioContext.currentTime);
  });
});

解决方案

经过一番探索,我发现问题出在事件监听器添加的时机。在上面的代码中,事件监听器是在 innerAudioContext.src 属性设置之前添加的。因此,当属性设置完成后,事件监听器尚未被触发。

为了解决这个问题,我们需要将 innerAudioContext.onTimeUpdate 事件监听器添加到 onload 事件中,确保在 src 属性设置完成后再添加监听器。

// 修复后的代码示例

const musicCollection = db.collection('music');

musicCollection.get().then(res => {
  this.setData({
    musicList: res.data
  });

  const innerAudioContext = wx.createInnerAudioContext();
  innerAudioContext.onload = () => {
    innerAudioContext.src = this.data.musicList[0].url;
  };
  innerAudioContext.onTimeUpdate(() => {
    console.log('当前播放时间:', innerAudioContext.currentTime);
  });
});

2. 图片原地旋转的实现

踩过的坑

在尝试让图片原地旋转时,我使用了 CSS 动画,却发现图片只会沿着圆周运动,而不是原地旋转。

// 错误代码示例

.image {
  animation: rotate 1s linear infinite;
}

@keyframes rotate {
  from {
    transform: rotate(0deg);
  }

  to {
    transform: rotate(360deg);
  }
}

解决方案

为了实现图片原地旋转,我们需要对 CSS 动画进行一些调整。首先,在 @keyframes 规则中,将 transform: rotate(0deg); 修改为 transform: rotate(0deg) translate(-50%, -50%);,将 transform: rotate(360deg); 修改为 transform: rotate(360deg) translate(-50%, -50%);。其次,在图片的样式中添加 transform: translate(-50%, -50%);。这些修改确保了图片在动画过程中始终保持在原位。

// 修复后的代码示例

.image {
  transform: translate(-50%, -50%);
  animation: rotate 1s linear infinite;
}

@keyframes rotate {
  from {
    transform: rotate(0deg) translate(-50%, -50%);
  }

  to {
    transform: rotate(360deg) translate(-50%, -50%);
  }
}

总结

在微信小程序音乐播放器开发过程中,我遇到了这些棘手的坎坷。通过对问题的深入分析和反复试验,我找到了相应的解决方案。我希望这些分享能为其他开发者提供一些借鉴,帮助他们在自己的项目中避开类似的坑洼,更顺利地完成开发。

常见问题解答

  1. 如何在音乐播放器中实现自动播放下一曲?

innerAudioContextended 事件监听器中,获取当前播放歌曲的索引,然后播放下一首歌。

  1. 如何控制音乐播放器的播放和暂停?

可以使用 innerAudioContext.play()innerAudioContext.pause() 方法控制音乐的播放和暂停。

  1. 如何在播放列表中随机播放歌曲?

使用 Math.random() 函数生成一个随机数,然后根据随机数获取要播放的歌曲的索引。

  1. 如何制作音乐播放器的播放进度条?

使用 innerAudioContext.currentTimeinnerAudioContext.duration 获取当前播放时间和歌曲总时长,然后使用比例计算播放进度。

  1. 如何为音乐播放器添加歌词显示功能?

从云数据库或本地文件中获取歌词数据,然后使用 wx.nextTick 定时器与 innerAudioContext.currentTime 同步显示歌词。