转载:http://www.cnblogs.com/Wayou/p/3543577.html


话说HTML5的炫酷真的是让我爱不释手,即使在这个提到IE就伤心不完的年代。但话又说回来,追求卓越Web创造更美世界这样高的追求什么时候又与IE沾过边儿呢?所以当你在看本文并且我们开始讨论HTML5等前沿东西的时候,我们默认是把IE排除在外的。本文的例子可以工作在最新的Chrome及Firefox浏览器下,其他浏览器暂未测试。

若下方未出现演示页面请刷新。

你也可以点此全屏演示  或者前往GitHub进行代码下载然后本地运行。

你还可以 下载示例音乐(如果你手头没有音频文件的话)

文件列表:
bbc_sherlock_openning.mp3
Neptune Illusion Dennis Kuo .mp3
单曲Remix ┃ 爱上这个女声 放进专辑里私藏 夜电播音员.mp3
爱啦啦.mp3

最后,喜欢朋友可以去GitHub我(starme)我(forkme)。

这里将要介绍的HTML5 音频处理接口与Audio标签是不一样的。页面上的Audio标签只是HTML5更语义化的一个表现,而HTML5提供给JavaScript编程用的Audio API则让我们有能力在代码中直接操作原始的音频流数据,对其进行任意加工再造。

展示HTML5 Audio API 最典型直观的一个例子就是跟随音乐节奏变化的频谱图,也称之为可视化效果。本文便是以此为例子展示JavaScript中操作音频数据的。

文中代码仅供参考,实际代码以下载的源码为准。

了解Audio API

一段音频到达扬声器进行播放之前,半路对其进行拦截,于是我们就得到了音频数据了,这个拦截工作是由window.AudioContext来做的,我们所有对音频的操作都基于这个对象。通过AudioContext可以创建不同各类的AudioNode,即音频节点,不同节点作用不同,有的对音频加上滤镜比如提高音色(比如BiquadFilterNode),改变单调,有的音频进行分割,比如将音源中的声道分割出来得到左右声道的声音(ChannelSplitterNode),有的对音频数据进行频谱分析即本文要用到的(AnalyserNode)。

浏览器中的Audio API

统一前缀

JavaScript中处理音频首先需要实例化一个音频上下文类型window.AudioContext。目前Chrome和Firefox对其提供了支持,但需要相应前缀,Chrome中为window.webkitAudioContext,Firefox中为mozAudioContext。所以为了让代码更通用,能够同时工作在两种浏览器中,只需要一句代码将前缀进行统一即可。

window.AudioContext = window.AudioContext || window.webkitAudioContext || window.mozAudioContext || window.msAudioContext;

这是一种常见的用法,或者操作符'||' 连接起来的表达式中,遇到真值即返回。比如在Chrome中,window.AudioContext为undefined,接着往下走,碰到window.webkitAudioContext不为undefined,表达式在此判断为真值,所以将其返回,于是此时window.AudioContext =window.webkitAudioContext ,所以代码中我们就可以直接使用window.AudioContext 而不用担心具体Chrome还是Firefox了。

var audioContext=new window.AudioContext();

考虑浏览器不支持的情况

但这还只是保证了在支持AudioContext的浏览器中能正常工作,如果是在IE中,上面实例化对象的操作会失败,所以有必要加个try catch语句来避免报错。

try {var audioContext = new window.AudioContext();
} catch (e) {Console.log('!Your browser does not support AudioContext');
}

这样就安全多啦,妈妈再不担心浏览器报错了。

组织代码

为了更好地进行编码,我们创建一个Visualizer对象,把所有相关属性及方法写到其中。按照惯例,对象的属性直接写在构造器里面,对象的方法写到原型中。对象内部使用的私有方法以短横线开头,不是必要但是种好的命名习惯。

其中设置了一些基本的属性将在后续代码中使用,详细的还请参见源码,这里只简单展示。

复制代码
var Visualizer = function() {this.file = null, //要处理的文件,后面会讲解如何获取文件this.fileName = null, //要处理的文件的名,文件名this.audioContext = null, //进行音频处理的上下文,稍后会进行初始化this.source = null, //保存音频
};
Visualizer.prototype = {_prepareAPI: function() {//统一前缀,方便调用window.AudioContext = window.AudioContext || window.webkitAudioContext || window.mozAudioContext || window.msAudioContext;//这里顺便也将requestAnimationFrame也打个补丁,后面用来写动画要用window.requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.msRequestAnimationFrame;//安全地实例化一个AudioContext并赋值到Visualizer的audioContext属性上,方便后面处理音频使用try {this.audioContext = new AudioContext();} catch (e) {console.log('!妳的浏览器不支持AudioContext:(');console.log(e);}},
}
复制代码

加载音频文件

不用说,你肯定得先在代码中获取到音频文件,才能够对其进一步加工。

文件获取的方法

读取文件到JavaScript可以有以下三种方法:

1.新开一个Ajax异步请求来获取文件,如果是本地测试需要关掉浏览器的同源安全策略才能获取成功,不然只能把网页放到服务器上才能正常工作。

具体说来,就是先开一个XMLHttpRequest请求,将文件路径作为请求的URL,并且设置请求返回类型为'ArrayBuffer',这种格式方便我们后续的处理。下面是一个例子。

复制代码
loadSound("sample.mp3"); //调用
// 定义加载音频文件的函数
function loadSound(url) {var request = new XMLHttpRequest(); //建立一个请求request.open('GET', url, true); //配置好请求类型,文件路径等request.responseType = 'arraybuffer'; //配置数据返回类型// 一旦获取完成,对音频进行进一步操作,比如解码request.onload = function() {var arraybuffer = request.response;}request.send();
}
复制代码

2.通过文件类型的input来进行文件选择,监听input的onchnage事件,一担文件选中便开始在代码中进行获取处理,此法方便,且不需要工作在服务器上

3.通过拖拽的形式把文件拖放到页面进行获取,比前面一种方法稍微繁杂一点(要监听'dragenter','dragover','drop'等事件)但同样可以很好地在本地环境下工作,无需服务器支持。

更多在JavaScript中获取及处理文件的方法可以见这里

不用说,方法2和3方便本地开发与测试,所以我们两种方法都实现,既支持选择文件,也支持文件拖拽。

通过选择获取

在页面放一个file类型的input。然后在JavaScript中监听它的onchange事件。此事件在input的值发生变化时触发。

对于onchange事件,在Chrome与Firefox中还有一点小的区别,如果你已经选择了一个文件,此时Input就有值了,如果你再次选择同一文件,onchange事件不会触发,但在Firefox中该事件会触发。这里只是提及一下,关系不大。

<label for="uploadedFile">Drag&drop or select a file to play:</label>
<input type="file" id="uploadedFile"></input>

当然,这里同时也把最后我们要画图用的canvas也一起放上去吧,后面就不用多话了。所以下面就是最终的HTML了,页面基本不会变,大量的工作是在JavaScript的编写上。

复制代码
<div id="wrapper"><div id="fileWrapper" class="file_wrapper"><div id="info">HTML5 Audio API showcase | An Audio Viusalizer</div><label for="uploadedFile">Drag&drop or select a file to play:</label><input type="file" id="uploadedFile"></input></div><div id="visualizer_wrapper"><canvas id='canvas' width="800" height="350"></canvas></div>
</div>
复制代码

再稍微写一点样式

复制代码
#fileWrapper {transition: all 0.5s ease;
}
#fileWrapper: hover {opacity: 1!important;
}
#visualizer_wrapper {text-align: center;
}
复制代码

向Visualizer对象的原型中新加一个方法,用于监听文件选择既前面讨论的onchange事件,并在事件中获取选择的文件。

复制代码
_addEventListner: function() {var that = this,audioInput = document.getElementById('uploadedFile'),dropContainer = document.getElementsByTagName("canvas")[0];//监听是否有文件被选中audioInput.onchange = function() {//这里判断一下文件长度可以确定用户是否真的选择了文件,如果点了取消则文件长度为0if (audioInput.files.length !== 0) {that.file = audioInput.files[0]; //将文件赋值到Visualizer对象的属性上that.fileName = that.file.name;that._start(); //获取到文件后,开始程序,这个方法会在后面定义并实现
        };};
}
复制代码

上面代码中,我们假设已经写好了一个进一步处理文件的方法_start(),在获取到文件后赋值给Visualizer对象的file属性,之后在_start()方法里我们就可以通过访问this.file来得到该文件了,当然你也可以直接让_start()方法接收一个file参数,但将文件赋值到Visualizer的属性上的好处之一是我们可以在对象的任何方法中都能获取该文件 ,不用想怎么用参数传来传去。同样,将文件名赋值到Visualizer的fileName属性当中进行保存,也是为了方便之后在音乐播放过程中显示当前播放的文件。

通过拖拽获取

我们把页面中的canvas作为放置文件的目标,在它身上监听拖拽事件'dragenter','dragover','drop'等。

还是在上面已经添加好的_ addEventListner方法里,接着写三个事件监听的代码。

复制代码
dropContainer.addEventListener("dragenter", function() {that._updateInfo('Drop it on the page', true);
}, false);
dropContainer.addEventListener("dragover", function(e) {e.stopPropagation();e.preventDefault();e.dataTransfer.dropEffect = 'copy'; //设置文件放置类型为拷贝
}, false);
dropContainer.addEventListener("dragleave", function() {that._updateInfo(that.info, false);
}, false);
dropContainer.addEventListener("drop", function(e) {e.stopPropagation();e.preventDefault();that.file = e.dataTransfer.files[0]; //获取文件并赋值到Visualizer对象that.fileName = that.file.name;that._start();
}, false);
复制代码

注意到上面代码中我们在'dragover'时设置文件拖放模式为'copy',既以复制的形式获取文件,如果不进行设置无法正确获取文件

然后在'drop'事件里,我们获得文件以进行一下步操作。

用FileReader读取文件为ArrayBuffer

下面来看这个_start()方法,现在文件得到 了,但首先需要将获取的文件转换为ArrayBuffer格式,才能够传递给AudioContext进行解码,所以接下来_start()方法中要干的事情就是实例化一个FileReader来将文件读取为ArrayBuffer格式。

复制代码
_start: function() {//read and decode the file into audio array buffervar that = this, //当前this指代Visualizer对象,赋值给that以以便在其他地方使用file = this.file, //从Visualizer对象上获取前面得到的文件fr = new FileReader(); //实例化一个FileReader用于读取文件fr.onload = function(e) { //文件读取完后调用此函数var fileResult = e.target.result; //这是读取成功得到的结果ArrayBuffer数据var audioContext = that.audioContext; //从Visualizer得到最开始实例化的AudioContext用来做解码ArrayBufferaudioContext.decodeAudioData(fileResult, function(buffer) { //解码成功则调用此函数,参数buffer为解码后得到的结果that._visualize(audioContext, buffer); //调用_visualize进行下一步处理,此方法在后面定义并实现}, function(e) { //这个是解码失败会调用的函数console.log("!哎玛,文件解码失败:(");});};//将上一步获取的文件传递给FileReader从而将其读取为ArrayBuffer格式
    fr.readAsArrayBuffer(file);
}
复制代码

注意这里我们把this赋值给了that,然后再 audioContext.decodeAudioData的回调函数中使用that来指代我们的Visualizer对象。这是因为作用域的原因。我们知道JavaScript中无法通过花括号来创建代码块级作用域,而唯一可以创建作用域的便是函数。一个函数就是一个作用域。函数内部的this指向的对象要视情况而定,就上面的代码来说,它是audioContext。所以如果想要在这个回调函数中调用Visualizer身上方法或属性,则需要通过另一个变量来传递,这里是that,我们通过将外层this(指向的是我们的Viusalizer对象)赋值给新建的局部变量that,此时that便可以传递到内层作用域中,而不会与内层作用域里面原来的this相冲突。像这样的用法在源码的其他地方也有使用,细心的你可以下载本文的源码慢慢研究。

所以,在 audioContext.decodeAudioData的回调函数里,当解码完成得到audiobuffer文件(buffer参数)后,再把audioContext和buffer传递给Visualizer的_visualize()方法进一步处理:播放音乐和绘制频谱图。当然此时_visualize()方法还没有下,下面便开始实现它。

创建Analyser分析器及播放音频

上面已经将获取的文件进行解码,得到了audio buffer数据。接下来是设置我们的AudioContext以及获取频谱能量信息的Analyser节点。向Visualizer对象添加_visualize方法,我们在这个方法里完成这些工作。

播放音频

首先将buffer赋值给audioContext。AudioContext只相当于一个容器,要让它真正丰富起来需要将实际的音乐信息传递给它的。也就是将audio buffer数据传递给它的BufferSource属性。

其实到了这里你应该有点晕了,不过没关系,看代码就会更明白一些,程序员是理解代码优于文字的一种生物。

var audioBufferSouceNode = audioContext.createBufferSource();
audioBufferSouceNode.buffer = buffer;

就这么两名,把音频文件的内容装进了AudioContext。

这时已经可以开始播放我们的音频了。

audioBufferSouceNode.start(0);

这里参数是时间,表示从这段音频的哪个时刻开始播放。

注意:在旧版本的浏览器里是使用onteOn()来进行播放的,参数一样,指开始时刻。

但此时是听不到声音的,因为还差一步,需要将audioBufferSouceNode连接到audioContext.destination,这个AudioContext的destination也就相关于speaker(扬声器)。

audioBufferSouceNode.connect(audioContext.destination);
audioBufferSouceNode.start(0);

此刻就能够听到扬声器传过来动听的声音了。

_visualize: function(audioContext, buffer) {var audioBufferSouceNode = audioContext.createBufferSource();audioBufferSouceNode.connect(audioContext.destination);audioBufferSouceNode.buffer = buffer;audioBufferSouceNode.start(0);
}

创建分析器

创建获取频谱能量值的analyser节点。

var analyser = audioContext.createAnalyser();

上面一步我们是直接将audioBufferSouceNode与audioContext.destination相连的,音频就直接输出到扬声器开始播放了,现在为了将音频在播放前截取,所以要把analyser插在audioBufferSouceNode与audioContext.destination之间。明白了这个道理,代码也就很简单了,audioBufferSouceNode连接到analyser,analyser连接destination。

audioBufferSouceNode.connect(analyser);
analyser.connect(audioContext.destination);

然后再开始播放,此刻所有音频数据都会经过analyser,我们再从analyser中获取频谱的能量信息,将其画出到Canvas即可。

假设我们已经写好了画频谱图的方法_drawSpectrum(analyser);

复制代码
_visualize: function(audioContext, buffer) {var audioBufferSouceNode = audioContext.createBufferSource(),analyser = audioContext.createAnalyser();//将source与分析器连接
    audioBufferSouceNode.connect(analyser);//将分析器与destination连接,这样才能形成到达扬声器的通路
    analyser.connect(audioContext.destination);//将上一步解码得到的buffer数据赋值给sourceaudioBufferSouceNode.buffer = buffer;//播放audioBufferSouceNode.start(0);//音乐响起后,把analyser传递到另一个方法开始绘制频谱图了,因为绘图需要的信息要从analyser里面获取this._drawSpectrum(analyser);
}
复制代码

绘制精美的频谱图

接下来的工作,也是最后一步,也就是实现_drawSpectrum()方法,将跟随音乐而灵动的柱状频谱图画出到页面。

绘制柱状能量槽

首先你要对数字信号处理有一定了解,吓人的,不了解也没多大关系。频谱反应的是声音各频率上能量的分布,所以叫能量槽也没有硬要跟游戏联系起来的嫌疑,是将输入的信号经过傅里叶变化得到的(大学里的知识终于还是可以派得上用场了)。但特么我知道这些又怎样呢,仅仅为了装逼显摆而以。真实的频谱图是频率上连续的,不是我们看到的最终效果那样均匀分开锯齿状的。

通过下面的代码我们可以从analyser中得到此刻的音频中各频率的能量值。

var array = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteFrequencyData(array);

此刻array中存储了从低频0Hz到高频~Hz的所有数据。频率做为X轴,能量值做为Y轴,我们可以得到类似下面的图形。

你也可以上传文件自己看一下效果 http://sandbox.runjs.cn/show/1kn8nr4l 

所以,比如array[0]=100,我们就知道在x=0处画一个高为100单位长度的长条,array[1]=50,然后在x=1画一个高为50单位长度的柱条,从此类推,如果用一个for循环遍历array将其全部画出的话,便是你看到的上图。

采样

但我们要的不是那样的效果,我们只需在所有数据中进行抽样,比如设定一个步长100,进度抽取,来画出整个频谱图中的部分柱状条。

或者先根据画面的大小,设计好每根柱条的宽度,以及他们的间隔,从而计算出画面中一共需要共多少根,再来推算出这个采样步长该取多少,本例便是这样实现的。说来还是有点晕,下面看简单的代码:

var canvas = document.getElementById('canvas'),meterWidth = 10, //能量条的宽度gap = 2, //能量条间的间距meterNum = 800 / (10 + 2); //计算当前画布上能画多少条
var step = Math.round(array.length / meterNum); //计算从analyser中的采样步长

我们的画布即Canvas宽800px,同时我们设定柱条宽10px , 柱与柱间间隔为2px,所以得到meterNum为总共可以画的柱条数。再用数组总长度除以这个数目就得到采样的步长,即在遍历array时每隔step这么长一段我们从数组中取一个值出来画,这个值为array[i*step]。这样就均匀地取出meterNum个值,从而正确地反应了原来频谱图的形状。

复制代码
var canvas = document.getElementById('canvas'),cwidth = canvas.width,cheight = canvas.height - 2,meterWidth = 10, //能量条的宽度gap = 2, //能量条间的间距meterNum = 800 / (10 + 2), //计算当前画布上能画多少条ctx = canvas.getContext('2d'),array = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteFrequencyData(array);
var step = Math.round(array.length / meterNum);计算从
analyser中的采样步长
ctx.clearRect(0, 0, cwidth, cheight); //清理画布准备画画
//定义一个渐变样式用于画图
gradient = ctx.createLinearGradient(0, 0, 0, 300);
gradient.addColorStop(1, '#0f0');
gradient.addColorStop(0.5, '#ff0');
gradient.addColorStop(0, '#f00');
ctx.fillStyle = gradient;
//对信源数组进行抽样遍历,画出每个频谱条
for (var i = 0; i < meterNum; i++) {var value = array[i * step];ctx.fillRect(i * 12 /*频谱条的宽度+条间间距*/ , cheight - value + capHeight, meterWidth, cheight);
}
复制代码

使用requestAnimationFrame让柱条动起来

但上面绘制的仅仅是某一刻的频谱,要让整个画面动起来,我们需要不断更新画面,window.requestAnimationFrame()正好提供了更新画面得到动画效果的功能,关于requestAnimationFrame的使用及更多信息可以从我的上一篇博文<requestAnimationFrame,Web中写动画的另一种选择>中了解,这里直接给出简单改造后的代码,即得到我们要的效果了:跟随音乐而灵动的频谱柱状图。

复制代码
var canvas = document.getElementById('canvas'),cwidth = canvas.width,cheight = canvas.height - 2,meterWidth = 10, //能量条的宽度gap = 2, //能量条间的间距meterNum = 800 / (10 + 2), //计算当前画布上能画多少条ctx = canvas.getContext('2d');
//定义一个渐变样式用于画图
gradient = ctx.createLinearGradient(0, 0, 0, 300);
gradient.addColorStop(1, '#0f0');
gradient.addColorStop(0.5, '#ff0');
gradient.addColorStop(0, '#f00');
ctx.fillStyle = gradient;
var drawMeter = function() {var array = new Uint8Array(analyser.frequencyBinCount);analyser.getByteFrequencyData(array);var step = Math.round(array.length / meterNum); //计算采样步长ctx.clearRect(0, 0, cwidth, cheight); //清理画布准备画画for (var i = 0; i < meterNum; i++) {var value = array[i * step];ctx.fillRect(i * 12 /*频谱条的宽度+条间间距*/ , cheight - value + capHeight, meterWidth, cheight);}requestAnimationFrame(drawMeter);
}
requestAnimationFrame(drawMeter);
复制代码

查看效果 http://sandbox.runjs.cn/show/q1ng0jgp

绘制缓慢降落的帽头

到上面一步,主要工作已经完成。最后为了美观,再实现一下柱条上方缓慢降落的帽头。

原理也很简单,就是在绘制柱条的同时在同一X轴的位置再绘制一个短的柱条,并且其开始和结束位置都要比频谱中的柱条高。难的地方便是如何实现缓慢降落。

首先要搞清楚的一点是,我们拿一根柱条来说明问题,当此刻柱条高度高于前一时刻时,我们看到的是往上冲的一根频谱,所以这时帽头是紧贴着正文柱条的,这个好画。考虑相反的情况,当此刻高度要低于前一时刻的高度时,下方柱条是立即缩下去的,同时我们需要记住上一时刻帽头的高度位置,此刻画的时候就按照前一时刻的位置将Y-1来画。如果下一时刻频谱柱条还是没有超过帽头的位置,继续让它下降,Y-1画出帽头。

通过上面的分析,所以我们在每次画频谱的时刻,需要将此刻频谱及帽头的Y值(即垂直方向的位置)记到一个循环外的变量中,在下次绘制的时刻从这个变量中读取,将此刻的值与变量中保存的上一刻的值进行比较,然后按照上面的分析作图。

最后给出实现的代码:

复制代码
_drawSpectrum: function(analyser) {var canvas = document.getElementById('canvas'),cwidth = canvas.width,cheight = canvas.height - 2,meterWidth = 10, //频谱条宽度gap = 2, //频谱条间距capHeight = 2,capStyle = '#fff',meterNum = 800 / (10 + 2), //频谱条数量capYPositionArray = []; //将上一画面各帽头的位置保存到这个数组ctx = canvas.getContext('2d'),gradient = ctx.createLinearGradient(0, 0, 0, 300);gradient.addColorStop(1, '#0f0');gradient.addColorStop(0.5, '#ff0');gradient.addColorStop(0, '#f00');var drawMeter = function() {var array = new Uint8Array(analyser.frequencyBinCount);analyser.getByteFrequencyData(array);var step = Math.round(array.length / meterNum); //计算采样步长ctx.clearRect(0, 0, cwidth, cheight);for (var i = 0; i < meterNum; i++) {var value = array[i * step]; //获取当前能量值if (capYPositionArray.length < Math.round(meterNum)) {capYPositionArray.push(value); //初始化保存帽头位置的数组,将第一个画面的数据压入其中
            };ctx.fillStyle = capStyle;//开始绘制帽头if (value < capYPositionArray[i]) { //如果当前值小于之前值ctx.fillRect(i * 12, cheight - (--capYPositionArray[i]), meterWidth, capHeight); //则使用前一次保存的值来绘制帽头} else {ctx.fillRect(i * 12, cheight - value, meterWidth, capHeight); //否则使用当前值直接绘制capYPositionArray[i] = value;};//开始绘制频谱条ctx.fillStyle = gradient;ctx.fillRect(i * 12, cheight - value + capHeight, meterWidth, cheight);}requestAnimationFrame(drawMeter);}requestAnimationFrame(drawMeter);
}
复制代码

Reference:

  1. A question about how to make an audio visualizer: http://stackoverflow.com/questions/3351147/html5-audio-visualizer
  2. Web audio API: http://www.html5rocks.com/en/tutorials/webaudio/intro/
  3. File reader in JavaScript: https://developer.mozilla.org/en-US/docs/Web/API/FileReader
  4. Local audio visualizer source code: http://cbrandolino.github.io/local-audio-visualizer/docs/local_audio_visualizer
  5. Audio context from MDN: https://developer.mozilla.org/en-US/docs/Web/API/AudioContext
  6. Window.requestAnimationFrame():https://developer.mozilla.org/en/docs/Web/API/window.requestAnimationFrame
  7. 3d visualizer with three.js : http://do.adive.in/music/
  8. A CodePen example: http://s.codepen.io/Wayou/fullpage/auCLE?
  9. Visualizer tutorial : http://www.smartjava.org/content/exploring-html5-web-audio-visualizing-sound
  10. Web audio examples from Google code : http://chromium.googlecode.com/svn/trunk/samples/audio/index.html

Feel free to repost but keep the link to this page please!


我的用法:

    //CTX = new AudioContext();var analyser = CTX.createAnalyser();var audioSrc = CTX.createMediaElementSource($.Audio);// we have to connect the MediaElementSource with the analyser audioSrc.connect(analyser);analyser.connect(CTX.destination);// we could configure the analyser: e.g. analyser.fftSize (for further infos read the spec)// analyser.fftSize = 64;// frequencyBinCount tells you how many values you'll receive from the analyservar frequencyData = new Uint8Array(analyser.frequencyBinCount);// we're ready to receive some data!var canvas = document.getElementById('canvas'),cwidth = canvas.width,cheight = canvas.height - 1,//meterWidth = 2, //width of the meters in the spectrumgap = 1, //gap between meterscapHeight = 1,capStyle = '#fff',//meterNum = cwidth / (meterWidth+gap), //count of the metersmeterNum = 40,meterWidth = (cwidth-meterNum*gap) / meterNum;capYPositionArray = []; ////store the vertical position of hte caps for the preivous frameCTX = canvas.getContext('2d'),gradient = CTX.createLinearGradient(0, 0, 0, cheight);gradient.addColorStop(1, '#0f0');gradient.addColorStop(0.5, '#ff0');gradient.addColorStop(0, '#f00');// loopfunction renderFrame() {var array = new Uint8Array(analyser.frequencyBinCount);analyser.getByteFrequencyData(array);/*var text = array.length;for(var j = 0; j < array.length; j++){text = text + ", " + array[j];}console.log(text);//  分析日志,共1024个数据,其中后面385个数据为0,无效*/var validDataLength = array.length - 385;var step = Math.round(validDataLength / meterNum); //sample limited data from the total arrayCTX.clearRect(0, 0, cwidth, cheight);var value = 0,flag =0;for (var i = 0; i < validDataLength; i++) {value += array[i];if(((i+1)%step) != 0) continue;value = value/step;var maxData = 230;//0 < value < maxData,if(value > maxData) console.log(value);value = value/(maxData/cheight);//console.log(step+", "+i+", "+value);if (capYPositionArray.length < Math.round(meterNum)) {capYPositionArray.push(value);};CTX.fillStyle = capStyle;//draw the cap, with transition effectif (value < capYPositionArray[flag]) {CTX.fillRect(flag * (meterWidth+gap), cheight - (--capYPositionArray[flag]), meterWidth, 0);} else {CTX.fillRect(flag * (meterWidth+gap), cheight - value, meterWidth, capHeight);capYPositionArray[flag] = value;};//set the filllStyle to gradient for a better lookCTX.fillStyle = gradient;//the meterCTX.fillRect(flag * (meterWidth+gap) , cheight - value + capHeight, meterWidth, cheight);value = 0;flag++;}if(isPlay) requestAnimationFrame(renderFrame);}$.Audio.addEventListener("play",function() {renderFrame();},false);


查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. eclipse更新ADT插件

    原文地址为:eclipse更新ADT插件今天想更新一下Android ADK,把ICS的API和SDK都集成进去,但是更新完SDK之后发现,需要更新ADT,那好吧继续更新ADT(其实是卸载之后重新安装ADT)。 eclipse->help->install new software...点already installed链接删除已经安装的ADT和D…...

    2024/4/19 10:19:31
  2. XML中二进制数据的处理方法[转载]

    在xml中,所有的数据都是以文本的形式来显示,但是二进制数据不能直接以文本格式来表示,那xml又是怎么处理二进制数据的呢?下面就来探讨一下。为了简单和通用性,xml被设计成了以文本的格式来表示数据。在xml中,所有的数据都是以文本的格式来存储,二进制数据也不例外。在xm…...

    2024/4/19 11:01:50
  3. CSS简介代码实现表格(table)只有横线没有竖线的效果,一个简约卡片化精美的数据表格(类似Bootstrap表格)

    实现效果 简单来说先设置 table 的 border-collapse:collapse,把表格整体边框取消。然后设置 table,th,tr,td 底部边框线即可。 HTML: <table><tr><th>编号(ID)</th><th>名称(Name)</th><th>描述(Describe)</th><th>排…...

    2024/4/19 12:43:05
  4. 编译Android源码制作ROM,烧录。

    简介 Android源码编译后,在out/target/product/generic下生成的三个镜像文 件:ramdisk.img,system.img,userdata.img以及它们对应的目录树root,system,data。 ramdisk.img是根文件系统,system.img包括了主要的包、库等文件,userdata.img包括了一些用户数据,android加载…...

    2024/4/24 23:58:08
  5. 学习笔记5.5

    5.514:00—17:00做英语视听说作业弄项目19:30—21:30看Java写笔记...

    2024/4/24 23:58:06
  6. xstream生成xml格式控制

    当系统间传输xstream生成的xml格式的报文时,如果对报文进行签名认证,很可能认证失败,原因就是xstream生成的xml报文各个元素之间有空格和换行符,而接收端如果用BUfferedReader接收报文,则会自动忽略换行符,导致签名的报文和认证的报文不一致。为解决这个问题,需要改变xs…...

    2024/4/24 23:58:05
  7. 三星galaxyS9定制Rom入门教程

    2017年中旬,谷歌宣布开启Project Treble计划,希望解决安卓手机碎片化的问题,有很多的良心厂商加入了该项目组,包括日本的索尼,韩国的三星,中国的一加,华为;也就是说,我们可以在三星的任何一款机器上面定制安卓原生系统,这对于对安卓手机有定制化需求的公司来说是一件…...

    2024/4/24 23:58:11
  8. Eclipse安装ADT和SDK

    原文:https://blog.csdn.net/johnny2017/article/details/83684754 很多公司早年的项目工程都是用Eclipse开发和维护,虽然Eclipse项目能转AS项目,但是大型项目转AS不是一般的不易,而且很多情况下根本转不成功,为此Eclipse的使用还是一个很有用的辅助工具,鉴于本人先前掉入…...

    2024/4/24 23:58:03
  9. 在线office编辑 iWebOffice系列的交互操作

    需求效果实现Office在线编辑支持B/S数据实时交互然后保存成html格式如图:iWebOffice2003网络文档中间件是iWebOffice系列中的低端产品(该系列包含iWebOffice2000、2003、2006、2009、2012等几款产品)。iWebOffice2003产品支持直接在IE浏览器中在线打开服务器上的文档(Word、…...

    2024/4/24 23:58:02
  10. 关于CSS样式表,看这篇就够了!

    文章目录1 CSS 样式表1.1 CSS 规则1.2 CSS 选择器1.2.1 标记选择器1.2.2 类别选择器1.2.3 id 选择器1.3 在页面中包含 CSS1.3.1 行内样式1.3.2 内嵌式1.3.3 链接式2 CSS3 的新特性2.1 模块与模块化结构2.2 一个简单的 CSS3 实例1 CSS 样式表CSS 是 W3C 协会为弥补 HTML 在显示属…...

    2024/5/2 16:52:41
  11. dom修改css样式

    CSS-DOM: style属性是对象类型 nodeName是tring类型 如果文档的内容需要定期编辑和刷新 添加class属性的工作就会变成一种负担 如果文档内容需要一个CMS来处理 给文档内容的个别部分添加class属性或者其他样式的做法有时是不被允许的 font-size属性要用元素.style.fontSize来检…...

    2024/4/30 4:19:59
  12. HiJson(Json格式化工具)

    HiJson是一款Json格式化工具是一款电脑格式化软件。这款软件可用与32位及64位。用来格式化json ,xmlz转json,格式化xml.查找文本及文件。用树的方式展现出来。方便json字符串的查看。各种操作均可还可多标签。需要的快下载吧。java开发,基于fastjson包,用于格式化json字符,…...

    2024/5/2 15:56:54
  13. 仅为0.9兆 谷歌金山词霸1.5版本正式发布

    继2008年5月8日谷歌金山词霸正式版发布之后,谷歌金山词霸体积小巧、功能众多、与网络结合的创新应用得到了众多新老用户的认同。为了更好的满足用户需求,提升用户体验,近日,谷歌金山词霸再次发布了全新的1.5版本。 全新的谷歌金山词霸1.5版本有着较大的改动,首先体积从以往…...

    2024/4/24 23:57:58
  14. 安装eclipse+adt最新方法(18年适用)

    之前的老方法:jdk+eclipse+adt需要分别下载,jdk倒不难,对于windows用户来说,直接下载安装包安装并配置好环境变量即可;但对于需要适用adt的eclipse来说就很麻烦了,有线上安装的方法(有时还需要你搭个梯子),也有离线安装的方法;不管怎样,这些都已经过时了,最新方法如…...

    2024/5/2 8:04:55
  15. [diary]09-27-05

    昨天刚注册的blog.以后就打算每天都在这记录自己学习的历程.吃饭睡觉锻炼当时是首要必不可少的上课:专业英语讲了sth. about patent , 包括patent的格式,怎么申请,费用问题,跨国界的patent申请保护等...也算小有收获.英语视听说主要以同学上台发言为主,自己当然最怕啦. 虽然其实…...

    2024/5/2 15:37:52
  16. Android ROM DIY教程之ROM的修改

    2019独角兽企业重金招聘Python工程师标准>>> Android ROM DIY教程之ROM的修改 我们在之前的文章《ROM刷机原理及ROM制作技术初探》中阐述了定制ROM的可能性。下面我们就先从简单的入手,介绍下如何修改ROM。修改ROM大致可分为:精简、增补、美化三类,这里主要讨论的…...

    2024/5/2 16:32:19
  17. 【教程】安卓系统自己定制+修改 人人都是ROM作者(小白教程)

    本帖最后由 三星电子 于 2013-11-20 09:15 编辑想必论坛好多人都会自己做ROM或者自己diy&定制三星官方的ROM再封装后刷机吧,引用一句话“难者不会,会者不难”只要自己会了,也就觉得简单了许多。会的大神请勿黑,主要对小白!今天给大家开这个帖让大家了解一下以卡刷刷机…...

    2024/4/24 23:57:57
  18. eclipse安装ADT插件搭建安卓开发环境

    转载地址有:Eclipse中离线安装ADT插件详细教程及下载链接最新鲜最详细的Android SDK下载安装及配置教程我剪贴一部分:首先在网上下载好ADT插件包,可以在我的bd网盘上下载(http://pan.baidu.com/s/1qWspK7M),或者去这个网站上下(http://www.androiddevtools.cn/)。下载好…...

    2024/4/24 23:57:56
  19. ace editor format code

    format xmlvar Mode = require(ace/mode/xml).Mode; editor.getSession().setMode(new Mode()); format jsonvar val = editor.session.getValue() var o = JSON.parse(val) // may throw if json is malformed val = JSON.stringify(o, null, 4) // 4 is the indent size,该方…...

    2024/4/24 23:57:55
  20. 中国软件行业发展创况

    金山公司总裁雷军几乎每去一个“软件国家”考察,都会对金山的战略作出调整。 1994年初,风华正茂的雷军去了一趟美国,筹划将WPS 文字处理系统进军海外,下定决心要成为中国的微软。后来,微软进入中国发威,WPS一败涂地。 2000年,从印度返回后,雷军感慨万千:可以随地大小便…...

    2024/4/24 14:17:38

最新文章

  1. 印制板阻抗是什么意思?你对印制板阻抗了解多少?

    印制板阻抗是什么意思&#xff1f;对于印制板阻抗的了解可以帮助我们更好地控制印制电路板的特性。阻抗板是指具有优秀叠层结构&#xff0c;能够有效控制印制电路板特性阻抗的板材。通过设计走线形成易于控制和可预测的传输线结构&#xff0c;从而实现对阻抗的精准控制。 在印…...

    2024/5/2 17:05:34
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. Mockito 学习及使用

    Mockito 学习并使用 1. Mock List Test void action001() {// org.mockito.Mockito#mock()// mock creationList mockedList mock(List.class);// using mock objectmockedList.add("one");mockedList.clear();// org.mockito.Mockito#verify()// verificationver…...

    2024/5/1 22:54:24
  4. 设计模式学习笔记 - 设计模式与范式 -结构型:5.门面模式:兼顾接口的通用性和易用性

    概述 前面我们学习了代理模式、桥接模式、装饰器模式、适配器模式&#xff0c;本章再来学习一个新的结构性模式&#xff1a;门面模式。门面模式原理和实现都特别简单&#xff0c;应用场景也比较明确&#xff0c;主要在接口设计方面使用。 不知道你有没有遇到关于接口粒度的问…...

    2024/5/2 5:05:24
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/1 17:30:59
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/2 16:16:39
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/2 9:28:15
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/2 15:04:34
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/2 9:07:46
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57