预加载队列中的 mp3 文件,以避免播放队列中下一个文件时出现任何延迟

2024-07-04

我正在编写一个脚本,其中我正在播放多个 mp3,并且每个文件都在队列中。播放下一个 .mp3 文件会出现轻微延迟,因为缓冲/加载文件需要时间。

我如何缓冲队列中的下一个 .mp3 文件,以便所有文件顺利运行而没有任何延迟。

 getData(1);

 function getData(id) {
   //Emty div
   $("#surah-wrapper").empty();

   $.ajaxSetup({
 cache: true,
 jsonpCallback: 'quranData'
   }); // define ajax setup 
   // Quran Text Type quran-uthmani | quran-simple | quran-simple-clean | quran-wordbyword
   $.getJSON("http://api.globalquran.com/surah/" + id + "/quran-uthmani?key=api_key&jsoncallback=?", {
 format: "jsonp"
   }, function(data) {
 if (id > 1) {
   $("<span class='qspan qspan-bsm'>").html("بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ").appendTo("#surah-wrapper");
 }
 $.each(data.quran, function(i, by) {
   $.each(by, function(verseNo, line) {
     //$("<p>").html('('+ line.surah+':'+line.ayah+') '+line.verse).appendTo("#surah-wrapper");
     $("<span class='qspan' id='" + verseNo + "'>").html(line.verse + '<span class="qspan-ayahno">(' + line.surah + ':' + line.ayah + ')</span>').appendTo("#surah-wrapper");
   });
 });
   });
 }

 //Play Script & highlight script
 var audioIndex = 0;
 var countSpan = 0;
 countSpan = $('#surah-wrapper').children().length;

 var surahNo = 1;

 var strCat = "http://download.quranicaudio.com/verses/Sudais/mp3/001001.mp3,http://download.quranicaudio.com/verses/Sudais/mp3/001002.mp3,http://download.quranicaudio.com/verses/Sudais/mp3/001003.mp3,http://download.quranicaudio.com/verses/Sudais/mp3/001004.mp3,http://download.quranicaudio.com/verses/Sudais/mp3/001005.mp3,http://download.quranicaudio.com/verses/Sudais/mp3/001006.mp3,http://download.quranicaudio.com/verses/Sudais/mp3/001007.mp3";

 setPlayer();

 $('.customSurah').change(function() {

   $('.play-btn').css('display', 'none');
   $aud.pause();

   surahNo = $('#surah option:selected').val();

   setTimeout(function() {

 countSpan = $('#surah-wrapper').children().length;

 var i = 0;
 strCat = '';

 for (i = 0; i <= countSpan; i++) {

   if (i == 0) {
     strCat = "http://download.quranicaudio.com/verses/Sudais/mp3/001001.mp3,";
     i += 1
   }

   if (i == countSpan) {

     if (surahNo == 1) {

     } else {


       if (i < 10) {
         strCat += "http://download.quranicaudio.com/verses/Sudais/mp3/00" + surahNo + "00" + i + ".mp3,";
       }
      
     }
   } else {
     if (i < 10) {
       strCat += "http://download.quranicaudio.com/verses/Sudais/mp3/00" + surahNo + "00" + i + ".mp3,";
     }


     
   }
 }
 if (surahNo == 1) {
   strCat = null;
   strCat = "http://download.quranicaudio.com/verses/Sudais/mp3/001001.mp3,http://download.quranicaudio.com/verses/Sudais/mp3/001002.mp3,http://download.quranicaudio.com/verses/Sudais/mp3/001003.mp3,http://download.quranicaudio.com/verses/Sudais/mp3/001004.mp3,http://download.quranicaudio.com/verses/Sudais/mp3/001005.mp3,http://download.quranicaudio.com/verses/Sudais/mp3/001006.mp3,http://download.quranicaudio.com/verses/Sudais/mp3/001007.mp3";

 }


 setPlayer();
 $('.play-btn').css('display', 'block');

   }, 3000);

 });

 function setPlayer() {

   //reset values
   audioIndex = 0;
   countSpan = 0;
   countSpan = $('#surah-wrapper').children().length;

   strCat = strCat.trim();
   var audioTracks = strCat;

   var audioAddress = audioTracks.split(',');

   var playing = false;

   $(function() {

 $aud = $("#myAudio")[0];
 $btn = $(".play-btn");

 function setAudio(index) {
   $("#surah-wrapper > .qspan").removeClass("qplaying");
   $aud.preload = 'auto';
   $aud.src = audioAddress[index];
 }

 setAudio(audioIndex);

 $btn.click(function() {
   if (playing) {
     playing = false;
     $aud.pause();
   } else
     $aud.play();
 });

 $aud.onended = function() {
   if (audioIndex < audioAddress.length - 1) {
     audioIndex++;
     setAudio(audioIndex);
     $aud.play();
   } else {
     audioIndex = 0;
     setAudio(audioIndex);
     playing = false;
     $btn.text("Play");
   }
 };

 $aud.onpause = function() {
   if (!playing) $btn.text("Play");
   $(".play-btn").css("background-image", "url(https://cdn0.iconfinder.com/data/icons/cosmo-player/40/button_play_1-64.png)");
 };

 $aud.onplay = function() {
   $btn.text("Pause");
   $(".play-btn").css("background-image", "url(https://cdn0.iconfinder.com/data/icons/cosmo-player/40/button_pause_1-64.png)");
   playing = true;
   $("#surah-wrapper > .qspan:nth-child(" + (audioIndex + 1) + ")").addClass("qplaying");
   var wHeight = $(window).height();
   var wHalfHeight = wHeight;
   var x = $(".qplaying").offset();
   var curentSpanPosition = x.top;
   wHalfHeight = wHalfHeight / 2;
   if (curentSpanPosition > wHalfHeight) {
     $('html, body').animate({
       scrollTop: curentSpanPosition - 50
     }, 1000);
   }

 };
   });

 }
.play-btn {
  background-image: url("https://cdn0.iconfinder.com/data/icons/cosmo-player/40/button_play_1-64.png");
  float: none;
  font-size: 0 !important;
  height: 50px;
  margin: 15px auto;
  padding: 5px 10px;
  text-align: center;
  width: 50px;
}
body{float:right; direction:rtl;}
span{padding:5px 10px; direction:rtl; text-align:right;
  margin:5px 1px;
font-size:20px}
.qplaying {
  background: #f00 none repeat scroll 0 0;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
         <audio id="myAudio" >
	        <source src="" type="audio/mpeg">
        </audio>

       
         <div class="play-btn-wrapper">
            <select class="customSurah form-control ddCountry styled-select" id="surah" name="surah" onchange="getData($('#surah option:selected').val())"><option value="1">Al-Faatiha</option><option value="2">Al-Baqara</option><option value="3">Aal-i-Imraan</option><option value="4">An-Nisaa</option><option value="5">Al-Maaida</option><option value="6">Al-An'aam</option><option value="7">Al-A'raaf</option><option value="8">Al-Anfaal</option><option value="9">At-Tawba</option><option value="10">Yunus</option><option value="11">Hud</option><option value="12">Yusuf</option><option value="13">Ar-Ra'd</option><option value="14">Ibrahim</option><option value="15">Al-Hijr</option><option value="16">An-Nahl</option><option value="17">Al-Israa</option><option value="18">Al-Kahf</option><option value="19">Maryam</option><option value="20">Taa-Haa</option><option value="21">Al-Anbiyaa</option><option value="22">Al-Hajj</option><option value="23">Al-Muminoon</option><option value="24">An-Noor</option><option value="25">Al-Furqaan</option><option value="26">Ash-Shu'araa</option><option value="27">An-Naml</option><option value="28">Al-Qasas</option><option value="29">Al-Ankaboot</option><option value="30">Ar-Room</option><option value="31">Luqman</option><option value="32">As-Sajda</option><option value="33">Al-Ahzaab</option><option value="34">Saba</option><option value="35">Faatir</option><option value="36">Yaseen</option><option value="37">As-Saaffaat</option><option value="38">Saad</option><option value="39">Az-Zumar</option><option value="40">Al-Ghaafir</option><option value="41">Fussilat</option><option value="42">Ash-Shura</option><option value="43">Az-Zukhruf</option><option value="44">Ad-Dukhaan</option><option value="45">Al-Jaathiya</option><option value="46">Al-Ahqaf</option><option value="47">Muhammad</option><option value="48">Al-Fath</option><option value="49">Al-Hujuraat</option><option value="50">Qaaf</option><option value="51">Adh-Dhaariyat</option><option value="52">At-Tur</option><option value="53">An-Najm</option><option value="54">Al-Qamar</option><option value="55">Ar-Rahmaan</option><option value="56">Al-Waaqia</option><option value="57">Al-Hadid</option><option value="58">Al-Mujaadila</option><option value="59">Al-Hashr</option><option value="60">Al-Mumtahana</option><option value="61">As-Saff</option><option value="62">Al-Jumu'a</option><option value="63">Al-Munaafiqoon</option><option value="64">At-Taghaabun</option><option value="65">At-Talaaq</option><option value="66">At-Tahrim</option><option value="67">Al-Mulk</option><option value="68">Al-Qalam</option><option value="69">Al-Haaqqa</option><option value="70">Al-Ma'aarij</option><option value="71">Nooh</option><option value="72">Al-Jinn</option><option value="73">Al-Muzzammil</option><option value="74">Al-Muddaththir</option><option value="75">Al-Qiyaama</option><option value="76">Al-Insaan</option><option value="77">Al-Mursalaat</option><option value="78">An-Naba</option><option value="79">An-Naazi'aat</option><option value="80">Abasa</option><option value="81">At-Takwir</option><option value="82">Al-Infitaar</option><option value="83">Al-Mutaffifin</option><option value="84">Al-Inshiqaaq</option><option value="85">Al-Burooj</option><option value="86">At-Taariq</option><option value="87">Al-A'laa</option><option value="88">Al-Ghaashiya</option><option value="89">Al-Fajr</option><option value="90">Al-Balad</option><option value="91">Ash-Shams</option><option value="92">Al-Lail</option><option value="93">Ad-Dhuhaa</option><option value="94">Ash-Sharh</option><option value="95">At-Tin</option><option value="96">Al-Alaq</option><option value="97">Al-Qadr</option><option value="98">Al-Bayyina</option><option value="99">Az-Zalzala</option><option value="100">Al-Aadiyaat</option><option value="101">Al-Qaari'a</option><option value="102">At-Takaathur</option><option value="103">Al-Asr</option><option value="104">Al-Humaza</option><option value="105">Al-Fil</option><option value="106">Quraish</option><option value="107">Al-Maa'un</option><option value="108">Al-Kawthar</option><option value="109">Al-Kaafiroon</option><option value="110">An-Nasr</option><option value="111">Al-Masad</option><option value="112">Al-Ikhlaas</option><option value="113">Al-Falaq</option><option value="114">An-Naas</option></select>
             <div class="play-btn"></div>
        </div>

        <div id="surah-wrapper"></div>

这是我想要实现的实际脚本:我希望在小提琴中提到的脚本上下文中提供解决方案。

http://codepen.io/anon/pen/pRKreo http://codepen.io/anon/pen/pRKreo


就这样吧。我遇到的最大挑战是处理的值this在处理程序内 https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#The_value_of_this_within_the_handler。设置你的<audio>元素到preload="none"。我的脚本会在您播放前一首歌曲时立即加载下一首歌曲,并在第一首歌曲结束后自动播放下一首歌曲。

如果您担心全局作用域,只需将其放入 IIFE 中即可。享受!

var files = document.getElementsByTagName('audio');
var songs = [];
var index = 0;

var Song = function(element) {

this.index = index;
this.playing = function(event) {
	try {
		files[this.index].preload = "auto";
	}
	catch (e) {

	}
};
this.ended = function(event) {
	try {
		files[this.index].play();
	}
	catch (e) {

	}
};
element.addEventListener('playing', this.playing.bind(this), false);
element.addEventListener('ended', this.ended.bind(this), false); // Trick
};

for (var len = files.length, i = 0; i < len; ++i) {
index++;
songs.push(new Song(files[i]));
}
ul{
  list-style: none;
}
<!DOCTYPE html>
<html lang="en">
    <meta name="description" content="HTML5 Media Auto Player Skeleton" />
    <title>HTML5 Media Auto Player Skeleton</title>
    <style>

    </style>
</head>

<body>
        
    <main>
<ul>
	<li class="album">
		<h3 class="album-title">HTML5 Media Player w Auto Next</h3>
	</li>
	<li>
		<audio controls="controls" class="full-width" preload="metadata">
			<source src="//rack.international/samples/AttritionDantesKitchenwWHellmixSAMPLE.mp3" type="audio/mpeg">
			<source src="//rack.international/samples/AttritionDantesKitchenwWHellmixSAMPLE.ogg" type="audio/ogg">
			Your browser does not support the audio element.
		</audio>
	</li>
	<li>
		<audio controls="controls" class="full-width" preload="metadata">
			<source src="//rack.international/samples/AttritionDantesKitchenRascalKlonermxSAMPLE3.mp3" type="audio/mpeg">
			<source src="//rack.international/samples/AttritionDantesKitchenRascalKlonermxSAMPLE3.ogg" type="audio/ogg">
			Your browser does not support the audio element.
		</audio>		
	</li>
	<li>
		<audio controls="controls" class="full-width" preload="metadata">
			<source src="//rack.international/samples/crankRingtone.mp3" type="audio/mpeg">
			<source src="//rack.international/samples/crankRingtone.ogg" type="audio/ogg">
			Your browser does not support the audio element.
		</audio>		
	</li>
        
</body>

</html>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

预加载队列中的 mp3 文件,以避免播放队列中下一个文件时出现任何延迟 的相关文章

  • 计算随机生成的六边形的6个顶点

    我需要一些帮助来写方程式 我想生成仍然 完美 成比例 的随机大小的六边形 最左边的顶点将位于 0 0 我想考虑与最左边的顶点相关的其他顶点 从左顶点向上这么多 从它右边这么多 从它向下这么多 这不是那么简单的原因是因为我需要它成比例 目前
  • 无法使用 webpack 和 Laravel mix 加载 popper.js

    我在我的项目中使用 bootstrap 4 beta 和 Laravel 5 4 并使用 npm 和 laravel mix 加载我的 js 依赖项 到目前为止 一切都运行良好 除了当我尝试使用 booostrap js 方法时 它向我抛出
  • 内存模型中的词法作用域是什么样的?

    假设我们有一个函数 function foo var x 10 function bar var y 20 return x y return bar console log foo 这在内存模型中会是什么样子 到目前为止 这就是我想象的堆
  • 如何解决:console.error:“redux-persist 无法创建同步存储。回退到“noop”存储

    我正在尝试在 React Native 应用程序中设置 redux persist 但是我遇到了这个错误 console error redux persist 无法创建同步存储 下降 返回 noop 存储 我尝试将 src redux i
  • 如何将angularjs变量值分配给html元素属性,例如输入elememnt的name属性

    我对 Angular 完全陌生 我有一个 AngularJS scope 变量 scope testme inputname 我想将此变量值分配给 html 元素的 name 属性 我想 结果如下
  • 当前图像居中的 flexslider

    我正在尝试构建一个 Flexslider 轮播 它有多个图像 但当前图像居中 任一侧的下一个 上一个图像离开屏幕 就像这个网站http www ncad ie http www ncad ie 到目前为止 我已经用一张图片得到了它 http
  • 如果未选中所有复选框,则禁用按钮;如果选中至少一个复选框,则启用该按钮

    我有一个表格 每行都有一个复选框 下面有一个按钮 如果至少选中一个复选框 我想禁用该按钮 tbody tr td td tr tbody
  • Node-Webkit在不同窗口启动功能

    我的 node webkit 应用程序由一个控制窗口和一个演示窗口组成 控制窗口收集数据并最终通过window open功能 演示文稿窗口现在可以访问global多变的 现在我想通过创建 SVG 元素等来呈现该信息的图形表示 我已经有一个
  • 有人可以解释一下如何实现 jQuery 文件上传插件吗?

    编辑 2019 年 10 月 6 年过去了 jQuery 文件上传显然仍然让人抓狂 如果您在此处的答案中找不到任何安慰 请尝试搜索NPM https www npmjs com search q file 20upload一个现代的替代方案
  • jQuery - 我可以验证禁用的字段吗?

    我有一个表单 用户需要单击链接 通过弹出窗口选择用户 然后使用 ID 填充隐藏字段 使用用户名填充显示字段 显示字段设置为disabled disabled 以强制用户使用弹出窗口而不是在字段中键入值 我需要确保用户选择一个名称 我正在使用
  • redux fetch body 不能在无 cors 模式下使用

    我有一个调用函数的操作 dispatch Api url my url method POST data data 这里我将数组作为数据传递 import fetch from isomorphic fetch export default
  • 如何安装并开始使用 Vuetify 和 Vue.js 3

    我在哪里可以找到新的 Vuetify 版本与 Vue js 3 兼容的文档以及如何使用 Vue cli 安装和设置它 在 vue 2 中我们这样做 vue create project name then vue add vuetify 我
  • angularjs表单重置错误

    我正在尝试使用 angularjs 制作一个带有验证的表单 到目前为止我做得很好 但是 当我提交重置按钮时 除了从验证部分收到的错误消息之外 所有字段都会重置 当我重置表单时 如何删除所有字段和错误消息 这就是我按下重置按钮时的情况 这是我
  • 根据所选付款方式更改 WooCommerce 提交结帐按钮文本

    I tried 更改 WooCommerce 中特定付款方式的结帐提交按钮文本 https stackoverflow com questions 45739331 change checkout submit button text fo
  • 检查纬度和经度是否在谷歌地图圆内

    以下是我正在寻找的期望结果 我想知道的是 我使用中心点纬度和周围半径创建了圆 现在我想知道 如何检查 计算 纬度和经度是否在该区域之内或之外 如果您能给我 JavaScript 代码示例 我将不胜感激 我正在使用 Google 地图 API
  • 如何将嵌入的 YouTube 视频的帧(通过 iframe)写入画布?

    我希望能够从 YouTube 视频中的各个点 不仅仅是缩略图 提取帧 并对它们进行一些处理 我可以使用 iframe API 将视频嵌入到我的网站中 但我正在努力寻找一种将其捕获到画布上的方法 如果我被迫捕获整个屏幕 也可以 如果我必须更改
  • 获取JQuery中选定单选按钮的文本

    在 Jquery 中 如何获取所选单选按钮的文本 而不是值 如下所示
  • WEBP图像回退

    我在互联网上搜索了很多 找不到可以完整教授的正确示例或完整教程 所以请大家给我推荐一些好的例子 我已经在很多网站上尝试过 WEBP 代码 例如与现代化工具一起使用 检查浏览器支持或使用背景图像 有一篇关于 Stucox 的文章 您可以在其中
  • 如何构建我的 PHP 项目?

    我即将开始另一个大型 PHP 项目 这次 我打算让项目文件夹变得整洁 所以我有几个关于保持我的项目干净和干燥的问题 如何区分 PHP 源文件和浏览器应访问的 PHP 文件 换句话说 我如何清楚哪些 PHP 文件提供输出 哪些提供函数或类定义
  • JS:在调用文件中的每个其他函数之前调用某个函数

    我有一个关于在 JS 中更好地重用代码的问题 例如我有文件functions js具有以下功能 export const a gt export const b gt export const c gt const foo gt 我想在调用

随机推荐