Html5 audio player

Материал из rrv-wiki
Перейти к навигации Перейти к поиску

Для потокового вещания на Icecast не нашел нормальных плееров, написал свои. Они поддерживают полноценный стоп, при котором прекращается кэширование.

Минимальный скрипт плеера на голом js с поддержкой stop

  <!DOCTYPE html>
   <html>
    <head>
     <meta charset="utf-8">
    </head>
    <body>
     <div class="player-via">
         <audio id="player">
             <source id="s1" src="">
             <source id="s2" src="" type="audio/mpeg">
       </audio>
     </div>
   <div>
      <button onclick="play()">Воспроизведение</button>
      <button onclick="pause()">Пауза</button>
   </div> 
    </body>
 
   <script type="text/javascript">
      var sourceElement1 = document.getElementById("s1");
      var sourceElement2 = document.getElementById("s2");
 
      var originalSourceUrl1 = "http://online.uniton.ru:8300/RadioUniton32.pls";
      var originalSourceUrl2 = "http://online.uniton.ru:8300/RadioUniton32";
 
      var audioElement = document.querySelector("audio");
 
      function pause() {
          sourceElement1.setAttribute("src", "");
          sourceElement2.setAttribute("src", "");
          audioElement.pause();
          // settimeout, otherwise pause event is not raised normally
          setTimeout(function () { 
              audioElement.load(); // This stops the stream from downloading
          });
      }
 
      function play() {
          if (!sourceElement1.getAttribute("src") && !sourceElement2.getAttribute("src")) {
              var date = new Date();
              sourceElement1.setAttribute("src", originalSourceUrl1+"?"+date.getTime());
              sourceElement2.setAttribute("src", originalSourceUrl2+"?"+date.getTime());
              audioElement.load(); // This restarts the stream download
          }
          audioElement.play();
      }
   </script>
   </html>

Файл RadioUniton32.pls:

[playlist]
 numberofentries=1
 File1=http://online.uniton.ru:8300/RadioUniton32
 Title1=Radio Uniton
 Length1=-1
 version=2

Полнофункциональный плеер на jQuery с поддержкой stop

<!DOCTYPE html>
   <html>
    <head>
     <meta charset="utf-8">
    </head>
    <body>
     <div class="player-rrv">
         <audio class="player" preload="none">
         <!--Для того что бы при перезагрузке страницы не играли артефакты, при загрузке src должен быть пустым-->
         <!--По этому помещаем url потока в data-src -->
             <source class="src-stream" src="" data-src="http://online.uniton.ru:8300/RadioUniton32.pls"> <!--Для телефонов, по сути ссылка на файл плей листа потока ниже-->
             <source class="src-stream" src="" data-src="http://online.uniton.ru:8300/RadioUniton32" type="audio/mpeg"> <!--Для компьютеров-->
       </audio>
      <button class="play">Play</button>
      <button class="quieter">Vol-</button>
      <button class="louder">Vol+</button>
     </div>
    </body>
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
      <script type="text/javascript">
         jQuery(document).ready(function(){
            jQuery('.player-rrv').each(function(){
               var audioElement = jQuery(this).find('.player').first();
               // Play - Stop
               jQuery(this).find('.play').on('click', function() {
                  // если src не задан, значит можно включить player
                   if (!jQuery(this).siblings('.player').find('.src-stream').first().attr('src')) {
                       var date = new Date();
                       // Для того что бы браузер корректно отрабатывал, добавляем к потоку соль в виде кол-ва секунд с начала эпохи
                       jQuery(this).siblings('.player').find('.src-stream').each(function(){
                          jQuery(this).attr('src', jQuery(this).data('src')+'?'+date.getTime());
                       });
                       jQuery(this).siblings('.player').trigger('load'); // Загрузим поток
                       jQuery(this).text('stop'); // Сменим надпись кнопки
                       jQuery(this).attr('class',"stop"); // Сменим стиль кнопки
                       jQuery(this).siblings('.player').trigger('play'); // Запустим плеер
                   } else {
                       jQuery(this).siblings('.player').trigger('pause'); // Включим паузу
                       // Отчистим src потоков
                       jQuery(this).siblings('.player').find('.src-stream').each(function(){
                          jQuery(this).attr('src', ''); 
                       });
                       jQuery(this).siblings('.player').trigger('load'); // Рестартанем загрузку (уже с пустыми src)
                       jQuery(this).text('start'); // Сменим надпись кнопки
                       jQuery(this).attr('class',"play"); // Сменим стиль кнопки
                   }
               });
               // Уменьшить громкость
               jQuery(this).find('.quieter').on('click', function() {
                  var vol = jQuery(this).siblings('.player').prop('volume');
                  vol = (vol-0.1 > 0) ? vol-0.1 : 0;
                  jQuery(this).siblings('.player').prop('volume', vol);
               });
               // Увеличить громкость
               jQuery(this).find('.louder').on('click', function() {
                  var vol = jQuery(this).siblings('.player').prop('volume');
                  vol = (vol+0.1 < 1) ? vol+0.1 : 1;
                  jQuery(this).siblings('.player').prop('volume', vol);
               });
            });
           // Если нужен автозапуск первого плеера, раскомментируем следующую строчку 
           //jQuery('.player-rrv').find('.play').first().trigger( 'click' )
         });
      </script>
 </html>