首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >2个相互独立的音频播放器

2个相互独立的音频播放器
EN

Stack Overflow用户
提问于 2021-08-29 12:38:29
回答 1查看 216关注 0票数 0

我正在尝试改编来自codepen.io的代码,它制作了这个漂亮的可视音频播放器播放列表。我想要实现的目标是在一个页面上有多个这样的页面,因为原始代码只支持一个。我正在试图弄清楚如何让这些音频播放器自动运行,而不是当我在一个播放器上按下播放时,它会暂停前一个播放器,反之亦然。目前,问题是它们都共享相同的音频控制,而我正在试图找出一种方法来唯一地针对每个音频播放器。

我在这方面已经尝试了几天了,所以我正在寻求帮助。我最初的想法是将音频播放器的每个div封装在其独特的div中,您将在下面的codepen.io中看到这个想法。然后在JS中,调用div数组,并使用forEach为每个div上的音频播放列表迭代JS函数。我知道我的功能或者我的方法总体上有问题,我希望得到一些反馈和指导。

目前,我只有两个音频播放器,所以我甚至可以看到我的想法是否有效。现在他们都访问相同的歌曲/专辑封面,然而我只是想弄清楚如何让他们先播放不同的音乐,然后再弄清楚其他的东西哈哈。所以,如果你也注意到了这个问题,很抱歉。

2 Audio Players Independently -- Codepen.io

最后,我使用了一些AHK脚本& Edge/IE来实现这一点,所以我不得不暂时使用Legacy JS。

谢谢。干杯!

这是JS的代码,以防您不想访问codepen.io。

代码语言:javascript
复制
let musicPlayers = [
  {
    audioPlayer: ".audio-1",
    trackInfo: [
      {
        song: "https://raw.githubusercontent.com/himalayasingh/music-player-1/master/music/1.mp3",
        title: "Dawn",
        album: "Skylike - Dawn",
        art: "https://raw.githubusercontent.com/himalayasingh/music-player-1/master/img/_1.jpg",
      },
      {
        song: "https://raw.githubusercontent.com/himalayasingh/music-player-1/master/music/2.mp3",
        title: "Me & You",
        album: "Alex Skrindo - Me & You",
        art: "https://raw.githubusercontent.com/himalayasingh/music-player-1/master/img/_2.jpg",
      },
    ],
  },
  {
    audioPlayer: ".audio-2",
    trackInfo: [
      {
        song: "https://raw.githubusercontent.com/himalayasingh/music-player-1/master/music/3.mp3",
        title: "Electro Boy",
        album: "Kaaze - Electro Boy",
        art: "https://raw.githubusercontent.com/himalayasingh/music-player-1/master/img/_3.jpg",
      },
      {
        song: "https://raw.githubusercontent.com/himalayasingh/music-player-1/master/music/4.mp3",
        title: "Home",
        album: "Martin Garrix - Home",
        art: "https://raw.githubusercontent.com/himalayasingh/music-player-1/master/img/_5.jpg",
      },
    ],
  },
]

console.log("number of audio players:", musicPlayers.length)
musicPlayers.forEach(function (musicPlayer, index) {
  let tracksObj = { song: [], title: [], album: [], art: [] }
  musicPlayer.trackInfo.forEach(function (track) {
    tracksObj.song.push(track.song)
    tracksObj.title.push(track.title)
    tracksObj.album.push(track.album)
    tracksObj.art.push(track.art)
  })
  console.log(tracksObj.art)
  // console.log(index, musicPlayer.trackInfo[0].song)
  $(function () {
    let playerTrack = $(
        musicPlayer.audioPlayer + " > #app-cover > #player > #player-track"
      ),
      bgArtwork = $(musicPlayer.audioPlayer + " > #app-cover > #bg-artwork"),
      bgArtworkUrl,
      albumName = playerTrack.children("#album-name"),
      trackName = playerTrack.children("#track-name"),
      trackTime = playerTrack.children("#track-time"),
      tProgress = trackTime.children("#current-time"),
      tTime = trackTime.children("#track-length"),
      sArea = playerTrack.children("#s-area"),
      insTime = sArea.children("#ins-time"),
      sHover = sArea.children("#s-hover"),
      seekBar = sArea.children("#seek-bar"),
      playerContent = $(
        musicPlayer.audioPlayer + " > #app-cover > #player > #player-content"
      ),
      albumArt = playerContent.children("#album-art"),
      playerControls = playerContent.children("#player-controls"),
      playPauseButton = playerControls
        .children(".control")
        .children("#play-pause-button"),
      i = playPauseButton.find("i"),
      seekT,
      seekLoc,
      seekBarPos,
      cM,
      ctMinutes,
      ctSeconds,
      curMinutes,
      curSeconds,
      durMinutes,
      durSeconds,
      playProgress,
      bTime,
      nTime = 0,
      buffInterval = null,
      tFlag = false,
      albums = tracksObj.album,
      trackNames = tracksObj.title,
      albumArtworks = tracksObj.art,
      trackUrl = tracksObj.song,
      playPreviousTrackButton = playerControls
        .children(".control")
        .children("#play-previous"),
      playNextTrackButton = playerControls
        .children(".control")
        .children("#play-next"),
      currIndex = -1

    function playPause() {
      setTimeout(function () {
        if (audio.paused) {
          playerTrack.addClass("active")
          albumArt.addClass("active")
          checkBuffering()
          i.attr("class", "fas fa-pause")
          audio.play()
          console.log(currIndex)
        } else {
          playerTrack.removeClass("active")
          albumArt.removeClass("active")
          clearInterval(buffInterval)
          albumArt.removeClass("buffering")
          i.attr("class", "fas fa-play")
          audio.pause()
        }
      }, 300)
    }

    function showHover(event) {
      seekBarPos = sArea.offset()
      seekT = event.clientX - seekBarPos.left
      seekLoc = audio.duration * (seekT / sArea.outerWidth())

      sHover.width(seekT)

      cM = seekLoc / 60

      ctMinutes = Math.floor(cM)
      ctSeconds = Math.floor(seekLoc - ctMinutes * 60)

      if (ctMinutes < 0 || ctSeconds < 0) return

      if (ctMinutes < 0 || ctSeconds < 0) return

      if (ctMinutes < 10) ctMinutes = "0" + ctMinutes
      if (ctSeconds < 10) ctSeconds = "0" + ctSeconds

      if (isNaN(ctMinutes) || isNaN(ctSeconds)) insTime.text("--:--")
      else insTime.text(ctMinutes + ":" + ctSeconds)

      insTime.css({ left: seekT, "margin-left": "-21px" }).fadeIn(0)
    }

    function hideHover() {
      sHover.width(0)
      insTime
        .text("00:00")
        .css({ left: "0px", "margin-left": "0px" })
        .fadeOut(0)
    }

    function playFromClickedPos() {
      audio.currentTime = seekLoc
      seekBar.width(seekT)
      hideHover()
    }

    function updateCurrTime() {
      nTime = new Date()
      nTime = nTime.getTime()

      if (!tFlag) {
        tFlag = true
        trackTime.addClass("active")
      }

      curMinutes = Math.floor(audio.currentTime / 60)
      curSeconds = Math.floor(audio.currentTime - curMinutes * 60)

      durMinutes = Math.floor(audio.duration / 60)
      durSeconds = Math.floor(audio.duration - durMinutes * 60)

      playProgress = (audio.currentTime / audio.duration) * 100

      if (curMinutes < 10) curMinutes = "0" + curMinutes
      if (curSeconds < 10) curSeconds = "0" + curSeconds

      if (durMinutes < 10) durMinutes = "0" + durMinutes
      if (durSeconds < 10) durSeconds = "0" + durSeconds

      if (isNaN(curMinutes) || isNaN(curSeconds)) tProgress.text("00:00")
      else tProgress.text(curMinutes + ":" + curSeconds)

      if (isNaN(durMinutes) || isNaN(durSeconds)) tTime.text("00:00")
      else tTime.text(durMinutes + ":" + durSeconds)

      if (
        isNaN(curMinutes) ||
        isNaN(curSeconds) ||
        isNaN(durMinutes) ||
        isNaN(durSeconds)
      )
        trackTime.removeClass("active")
      else trackTime.addClass("active")

      seekBar.width(playProgress + "%")

      if (playProgress == 100) {
        i.attr("class", "fa fa-play")
        seekBar.width(0)
        tProgress.text("00:00")
        albumArt.removeClass("buffering").removeClass("active")
        clearInterval(buffInterval)
      }
    }

    function checkBuffering() {
      clearInterval(buffInterval)
      buffInterval = setInterval(function () {
        if (nTime == 0 || bTime - nTime > 1000) albumArt.addClass("buffering")
        else albumArt.removeClass("buffering")

        bTime = new Date()
        bTime = bTime.getTime()
      }, 100)
    }

    function selectTrack(flag) {
      // console.log("flag = ", flag)
      if (flag == 0 || flag == 1) ++currIndex
      else --currIndex

      if (currIndex > -1 && currIndex < albumArtworks.length) {
        if (flag == 0) i.attr("class", "fa fa-play")
        else {
          albumArt.removeClass("buffering")
          i.attr("class", "fa fa-pause")
        }

        seekBar.width(0)
        trackTime.removeClass("active")
        tProgress.text("00:00")
        tTime.text("00:00")

        currAlbum = albums[currIndex]
        currTrackName = trackNames[currIndex]
        currArtwork = albumArtworks[currIndex]

        audio.src = trackUrl[currIndex]

        nTime = 0
        bTime = new Date()
        bTime = bTime.getTime()

        if (flag != 0) {
          audio.play()
          playerTrack.addClass("active")
          albumArt.addClass("active")

          clearInterval(buffInterval)
          checkBuffering()
        }

        albumName.text(currAlbum)
        trackName.text(currTrackName)
        albumArt.find("img.active").removeClass("active")
        albumArt.find("#current-album-art").addClass("active")
        albumArt.find("img.active").attr("src", currArtwork)

        bgArtworkUrl = albumArt.find("img.active").attr("src")

        bgArtwork.css({ "background-image": "url(" + bgArtworkUrl + ")" })
      } else {
        if (flag == 0 || flag == 1) --currIndex
        else ++currIndex
      }
    }

    function initPlayer() {
      // audio = new Audio()
      audio = document.createElement("audio")

      selectTrack(0)

      audio.loop = false

      playPauseButton.on("click", playPause)

      sArea.mousemove(function (event) {
        showHover(event)
      })

      sArea.mouseout(hideHover)

      sArea.on("click", playFromClickedPos)

      $(audio).on("timeupdate", updateCurrTime)

      playPreviousTrackButton.on("click", function () {
        selectTrack(-1)
        console.log(currIndex)
      })
      playNextTrackButton.on("click", function () {
        selectTrack(1)
      })
    }

    initPlayer()
  })
})
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-31 14:45:25

好了,我已经弄明白了为什么播放器不能独立运行,这似乎与某种JS作用域问题有关,以及在init函数中如何分配audio变量。我仍然不确定为什么,但似乎每个创建的音频播放器都引用了相同的音频实例。

如果你改变了两件事,那么它对你来说应该是有效的。

首先,在直接调用的函数表达式的最开始处,声明一个音频变量,设置为空。

代码语言:javascript
复制
 $(function () {
    let audio, playerTrack = $(
        musicPlayer.audioPlayer + " > #app-cover > #player > #player-track"
      ),
    ...rest of code

接下来,进入init函数,并将代码更改为:

代码语言:javascript
复制
// audio = new Audio()
audio = document.createElement("audio")

要这样做:

代码语言:javascript
复制
audio = new Audio()

这让我很头疼,因为从理论上讲,它看起来像是应该为每个实例分配一个新的音频实例,但显然没有。Anyways...this应该会让你朝着正确的方向前进。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68972973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档