Maison >interface Web >Tutoriel H5 >Recommandations de ressources pour les didacticiels vidéo de visualisation musicale HTML5
Que le simple fait de jouer de la musique soit trop monotone, si vous pouvez également voir la musique tout en l'écoutant, sera-ce plus intéressant ? Ce cours vous amènera à utiliser webAudio et Canvas pour visualiser votre musique sous la forme que vous aimez et faire bouger votre musique.
Adresse de lecture du cours : http://www.php.cn/course/327.html
Le Style d'enseignement de l'enseignant :
Les cours de l'enseignant sont simples et approfondis, de structure claire, analysés couche par couche, imbriqués, rigoureux dans l'argumentation et rigoureux dans la structure. Il utilise le pouvoir logique de la pensée. pour attirer l'attention des étudiants et contrôler le processus d'enseignement en classe. En écoutant les cours du professeur, les étudiants acquièrent non seulement des connaissances, mais reçoivent également une formation à la réflexion, et sont également influencés et influencés par l'attitude académique rigoureuse de l'enseignant
Le point le plus difficile de cette vidéo est la musique HTML5 visualisation :
Acquisition et lecture de musique
Construction du front-end et du back-end de l'application
1. Créez un nouveau dossier de données multimédia, public/media, mettez-y les données audio
2, construisez le framework CSS de la page, /public/stylesheets/index.css
3, lisez le contenu de la page, vues/index.ejs
4, contrôle de routage en arrière-plan, routes/index.js, récupérez la liste de musique et renvoyez-la à la section précédente
ajax demande des données audio côté serveur
Créez un nouveau fichier index.js sous javascripts, référencez-le et créez-le dans vues/index.ejs Editez et créez des fichiers
<script type="text/javascript" src="/javascripts/index.js"></script>
pour obtenir des effets de clic
<ul id="list"> <% music.forEach(function(name){ %> <li title="<%= name %>"><%= name %></li> #设置title属性 <% }) %> </ul>
Décoder et lire l'audio
AudioContext
Un objet contenant des objets AudioNode individuels et leurs connexions, c'est-à-dire l'objet de contexte audio. Il n'y a qu'un seul AudioContext créé dans un document : var ac = new window.AudioContext();
Attributs :
destination, objet AudioDestinationNode, où se rassemblent toutes les sorties audio, équivalent au matériel audio, Tous les AudioNodes sont connectés directement ou indirectement ici.
currentTime, le temps (secondes) entre la création d'AudioContext et l'heure actuelle.
Méthode :
decodeAudioData(arrayBuffer,succ(buffer),err), décoder de manière asynchrone les données audio contenues dans arrayBuffer
createBufferSource(), créer un objet autoBufferSourceNode
createAnalyser(), créer un objet AnalyserNode
createGain()/createGainNode(), créer un objet GainNode
AudioBufferSourceNode
représente une ressource audio en mémoire, ses données audio sont stocké dans AudioBuffer (son attribut buffer)
Création : var buffersource = ac.createBufferSource();
Propriétés :
buffer, objet AudioBuffer, représente les données de la ressource audio à lire
——Sous-attribut : durée, la durée de la ressource audio (secondes)
boucle, s'il faut lire en boucle, faux par défaut
onended, peut être lié à l'heure appelée lorsque la lecture audio est terminée Méthode du gestionnaire
:
start/noteOn(when=ac.currentTime,offset=0,buration=buffer.duration-offset), commencez la lecture audio.
quand : quand commencer la lecture ;
offset : combien de secondes pour commencer la lecture de l'audio ;
durée : combien de secondes pour jouer
stop/noteOff(when=ac.currentTime) , terminer Lire l'audio
Ajouter un contrôle du volume
GainNode
Un objet qui modifie le volume audio et la force du signal de toutes les images d'échantillon transmettant ses données audio
Créer : var gainNode = ac.createGain()/ac.createGainNode();
gain, objet AudioParam, la force du signal audio peut être modifiée en modifiant sa valeur. La valeur par défaut de l'attribut est 1 et la valeur de l'attribut de valeur par défaut est 1. la valeur minimale est 0. La valeur maximale est 1, et sa valeur peut également être supérieure à 1 et inférieure à 0
Correction d'un bug de lecture
Problème : lors de la lecture de la deuxième chanson, la première chanson est toujours en cours de lecture. La raison principale est que chaque fois que vous cliquez sur la liste de musique, load("/media/"+this.title) est appelé, les données sont décodées et lues :
xhr.onload = function(){ ac.decodeAudioData(xhr.response, function(buffer){ var bufferSource = ac.createBufferSource(); bufferSource.buffer = buffer; bufferSource.connect(gainNode); bufferSource[bufferSource.start?"start":"noteOn"](0); }, function(err){ console.log(err); }); }
Solution :
Attribuez une valeur nulle aux données audio var source = null ;, enregistrez les données décodées de la chanson précédente source = bufferSource;, jugez l'exécution pour arrêter la lecture source && source[source.stop "stop" : "noteoff ? "](0);
Visualisation des données musicales
AnalyserNode
音频分析对象,它能实时的分析音频资源的频域和时域信息,但不会对音频流做任何处理
创建:var analyser = ac.createAnalyser();
fftSize,设置FFT(FFT是离散傅里叶变换的快速算法,用于将一个信号变换到频域)值得大小,用于分析得到频域,为32 - 2048之间2的整数倍,默认为2048。实时得到的音频频域的数据个数为FFTSize的一半
frequencyBinCount,FFT值得一半,即实时得到的音频频域的数据个数
getByteFrequencyData(Uint8Array),复制音频当前的频域数据(数量是FrequencyBinCount)到Uint8Array(8位无符号整型类型化数组)中
创建Analyser对象:
var analyser = ac.createAnalyser(); analyser.fftSize = 512; analyser.connect(gainNode);
连接到分
析对象获取数据:bufferSource.connect(analyser);
实现可视化功能函数:
function visualizer(){ var arr = new Uint8Array(analyser.frequencyBinCount); analyser.getByteFrequencyData(arr); console.log(arr); }
调用visualizer函数:
利用canvas将音乐数据可视化(柱状图)
在views下加入id
控制高度变化:
var box = $("#box")[0]; var height, width; var canvas = document.createElement("canvas"); box.appendChild(canvas); function resize(){ height = box.clientHeight; width = box.clientWidth; canvas.height = height; canvas.width = width; } resize(); #调用触发函数 window.onresize = resize;
利用canvas将音乐数据可视化(圆点图)
应用优化
webAudio API
webAudio核心功能封装为对象
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!