Воспроизведение аудио HTML 5 на основе идентификатора из SQL


Я пытаюсь воспроизвести музыку из своей папки на основе местоположения sql и отлично работаю, но только с первым звуком.. и мне нужно воспроизвести все аудио на основе идентификатора или чего-то еще. Нужна была какая-то помощь. Спасибо!

PHP +HTML код для этого плеера:

<?php
  $q = mysqli_query($db,"SELECT * FROM music ");
   while ($row = mysqli_fetch_assoc($q)) {
        $id = $row['id'];
        $location = $row['location'];
        $name = $row['name'];
        $trackname = $row['trackname'];

?>
<div class="player paused">
   <div class="album">
    <div class="cover">
      <div><img src="https://www.liveout.ro/media/events/cover_picture/140763_4269419504711467855267480452363124163978086831790255925789106330.jpg" /></div>
    </div>
  </div>

  <div class="info">
    <div class="time">
      <span class="current-time">0:00</span>
      <span class="progress"><span></span></span>
      <span class="duration">0:00</span>
    </div>

    <h2><?php echo $name;?></h2>
    <h3><?php echo $trackname;?></h3>
   </div>

  <div class="actions">
     <button class="buttn rw">
      <div class="arrow"></div>
      <div class="arrow"></div>
    </button>
    <button class="buttn play-pause">
      <div class="arrow"></div>
    </button>
    <button class="buttn ff">
      <div class="arrow"></div>
      <div class="arrow"></div>
    </button>
   </div>

  <audio preload src="<?php echo $location;?>" id="music" track="<?php echo $id;?>"></audio>
</div>
<?php } ?>

Это код JAVASCRIPT для этого плеера:

Я думаю, что здесь должны быть некоторые изменения в работе..

var player = $('.player'),
    audio = player.find('audio'),
    duration = $('.duration'),
    currentTime = $('.current-time'),
    progressBar = $('.progress span'),
    mouseDown = false,
    rewind, showCurrentTime;

function secsToMins(time) {
  var int = Math.floor(time),
      mins = Math.floor(int / 60),
      secs = int % 60,
      newTime = mins + ':' + ('0' + secs).slice(-2);

  return newTime;
}

function getCurrentTime() {
  var currentTimeFormatted = secsToMins(audio[0].currentTime),
      currentTimePercentage = audio[0].currentTime / audio[0].duration * 100;

  currentTime.text(currentTimeFormatted);
  progressBar.css('width', currentTimePercentage + '%');

  if (player.hasClass('playing')) {
    showCurrentTime = requestAnimationFrame(getCurrentTime);
  } else {
    cancelAnimationFrame(showCurrentTime);
  }
}

audio.on('loadedmetadata', function() {
  var durationFormatted = secsToMins(audio[0].duration);
  duration.text(durationFormatted);
}).on('ended', function() {
  if ($('.repeat').hasClass('active')) {
    audio[0].currentTime = 0;
    audio[0].play();
  } else {
    player.removeClass('playing').addClass('paused');
    audio[0].currentTime = 0;
  }
});

$('button').on('click', function() {
  var self = $(this);

  if (self.hasClass('play-pause') && player.hasClass('paused')) {
    player.removeClass('paused').addClass('playing');
    audio[0].play();
    getCurrentTime();
  } else if (self.hasClass('play-pause') && player.hasClass('playing')) {
    player.removeClass('playing').addClass('paused');
    audio[0].pause();
  }

  if (self.hasClass('shuffle') || self.hasClass('repeat')) {
    self.toggleClass('active');
  }
}).on('mousedown', function() {
  var self = $(this);

  if (self.hasClass('ff')) {
    player.addClass('ffing');
    audio[0].playbackRate = 2;
  }

  if (self.hasClass('rw')) {
    player.addClass('rwing');
    rewind = setInterval(function() { audio[0].currentTime -= .3; }, 100);
  }
}).on('mouseup', function() {
  var self = $(this);

  if (self.hasClass('ff')) {
    player.removeClass('ffing');
    audio[0].playbackRate = 1;
  }

  if (self.hasClass('rw')) {
    player.removeClass('rwing');
    clearInterval(rewind);
  }
});

player.on('mousedown mouseup', function() {
  mouseDown = !mouseDown;
});

progressBar.parent().on('click mousemove', function(e) {
  var self = $(this),
      totalWidth = self.width(),
      offsetX = e.offsetX,
      offsetPercentage = offsetX / totalWidth;

  if (mouseDown || e.type === 'click') {
    audio[0].currentTime = audio[0].duration * offsetPercentage;
    if (player.hasClass('paused')) {
      progressBar.css('width', offsetPercentage * 100 + '%');
    }
  }
});
Author: Alex, 2018-02-07

1 answers

Работает только первый звук, потому что вы используете audio[0] везде. Чтобы исправить ваш код для работы со всеми аудио, вам необходимо сделать следующее:

1) Замените audio[0] внутри прослушивателей событий audio (loadedmetadata, ended) с помощью this, чтобы ссылаться на текущий audio, а не на первый audio в объекте jQuery.

2) Замените audio[0] в случае, если слушатели $("button") (click, mousedown, mouseup) и progressBar.parent() (click, mousemove) со следующим:

var currentAudio = self.closest(".player").children("audio").get(0);

3) Передайте текущий audio в качестве контекста в getCurrentTime, используя:

  • getCurrentTime.bind(this) при передаче его в requestAnimationFrame.
  • getCurrentTime.call(currentAudio) внутри $("button").on("click", ...).

Код:

var player = $('.player'),
  audio = player.find('audio'),
  duration = $('.duration'),
  currentTime = $('.current-time'),
  progressBar = $('.progress span'),
  mouseDown = false,
  rewind, showCurrentTime;

function secsToMins(time) {
  var int = Math.floor(time),
    mins = Math.floor(int / 60),
    secs = int % 60,
    newTime = mins + ':' + ('0' + secs).slice(-2);

  return newTime;
}

function getCurrentTime() {   // 'this' refers to the current audio.
  var currentTimeFormatted = secsToMins(this.currentTime),
    currentTimePercentage = this.currentTime / this.duration * 100;

  currentTime.text(currentTimeFormatted);
  progressBar.css('width', currentTimePercentage + '%');

  if (player.hasClass('playing')) {
    showCurrentTime = requestAnimationFrame(getCurrentTime.bind(this));
  } else {
    cancelAnimationFrame(showCurrentTime);
  }
}

audio.on('loadedmetadata', function() {
  var durationFormatted = secsToMins(this.duration);
  duration.text(durationFormatted);
}).on('ended', function() {
  if ($('.repeat').hasClass('active')) {
    this.currentTime = 0;
    this.play();
  } else {
    player.removeClass('playing').addClass('paused');
    this.currentTime = 0;
  }
});

$('button').on('click', function() {
  var
    self = $(this),
    currentAudio = self.closest(".player").children("audio").get(0);

  if (self.hasClass('play-pause') && player.hasClass('paused')) {
    player.removeClass('paused').addClass('playing');
    currentAudio.play();
    getCurrentTime.call(currentAudio);
  } else if (self.hasClass('play-pause') && player.hasClass('playing')) {
    player.removeClass('playing').addClass('paused');
    currentAudio.pause();
  }

  if (self.hasClass('shuffle') || self.hasClass('repeat')) {
    self.toggleClass('active');
  }
}).on('mousedown', function() {
  var
    self = $(this),
    currentAudio = self.closest(".player").children("audio").get(0);

  if (self.hasClass('ff')) {
    player.addClass('ffing');
    currentAudio.playbackRate = 2;
  }

  if (self.hasClass('rw')) {
    player.addClass('rwing');
    rewind = setInterval(function() {
      currentAudio.currentTime -= .3;
    }, 100);
  }
}).on('mouseup', function() {
  var
    self = $(this),
    currentAudio = self.closest(".player").children("audio").get(0);

  if (self.hasClass('ff')) {
    player.removeClass('ffing');
    currentAudio.playbackRate = 1;
  }

  if (self.hasClass('rw')) {
    player.removeClass('rwing');
    clearInterval(rewind);
  }
});

player.on('mousedown mouseup', function() {
  mouseDown = !mouseDown;
});

progressBar.parent().on('click mousemove', function(e) {
  var
    self = $(this),
    currentAudio = self.closest(".player").children("audio").get(0),
    totalWidth = self.width(),
    offsetX = e.offsetX,
    offsetPercentage = offsetX / totalWidth;

  if (mouseDown || e.type === 'click') {
    currentAudio.currentTime = currentAudio.duration * offsetPercentage;
    if (player.hasClass('paused')) {
      progressBar.css('width', offsetPercentage * 100 + '%');
    }
  }
});

Примечание: Каждый элемент audio имеет id="music", тогда как каждый элемент id должен быть уникальным, поэтому вы можете захотеть изменить это, если вы действительно хотите, чтобы ваши аудио имели идентификаторы.

 2
Author: Angel Politis, 2018-02-07 02:00:01