Dantes (обсуждение | вклад) Нет описания правки |
Dantes (обсуждение | вклад) Нет описания правки |
||
| Строка 27: | Строка 27: | ||
time.innerHTML = '0:00'; | time.innerHTML = '0:00'; | ||
// | // Громкость | ||
var volumeControl = document.createElement('input'); | var volumeControl = document.createElement('input'); | ||
volumeControl.setAttribute('type', 'range'); | volumeControl.setAttribute('type', 'range'); | ||
| Строка 35: | Строка 35: | ||
volumeControl.setAttribute('value', 1); | volumeControl.setAttribute('value', 1); | ||
volumeControl.className = 'custom-audio-volume'; | volumeControl.className = 'custom-audio-volume'; | ||
// Визуализация | |||
var visualizer = document.createElement('canvas'); | |||
visualizer.className = 'custom-audio-visualizer'; | |||
wrapper.appendChild(visualizer); | |||
wrapper.appendChild(playBtn); | wrapper.appendChild(playBtn); | ||
wrapper.appendChild(progress); | wrapper.appendChild(progress); | ||
wrapper.appendChild(time); | wrapper.appendChild(time); | ||
wrapper.appendChild(volumeControl); | wrapper.appendChild(volumeControl); | ||
container.appendChild(wrapper); | container.appendChild(wrapper); | ||
// Инициализация Web Audio API | |||
var audioContext = new (window.AudioContext || window.webkitAudioContext)(); | |||
var analyser = audioContext.createAnalyser(); | |||
var source = audioContext.createMediaElementSource(audio); | |||
source.connect(analyser); | |||
analyser.connect(audioContext.destination); | |||
// Настройки анализатора | |||
analyser.fftSize = 256; | |||
var bufferLength = analyser.frequencyBinCount; | |||
var dataArray = new Uint8Array(bufferLength); | |||
function draw() { | |||
requestAnimationFrame(draw); | |||
analyser.getByteFrequencyData(dataArray); | |||
var canvas = visualizer; | |||
var canvasContext = canvas.getContext('2d'); | |||
canvasContext.clearRect(0, 0, canvas.width, canvas.height); | |||
var barWidth = (canvas.width / bufferLength) * 2.5; | |||
var barHeight; | |||
var x = 0; | |||
for (var i = 0; i < bufferLength; i++) { | |||
barHeight = dataArray[i]; | |||
canvasContext.fillStyle = 'rgb(' + (barHeight + 100) + ',50,50)'; | |||
canvasContext.fillRect(x, canvas.height - barHeight / 2, barWidth, barHeight / 2); | |||
x += barWidth + 1; | |||
} | |||
} | |||
audio.addEventListener('play', function () { | |||
audioContext.resume().then(() => { | |||
draw(); | |||
}); | |||
}); | |||
playBtn.onclick = function () { | playBtn.onclick = function () { | ||
Версия от 20:24, 16 апреля 2025
$(function () {
var players = document.getElementsByClassName('audio-player');
for (var i = 0; i < players.length; i++) {
(function (container) {
var src = container.getAttribute('data-src');
if (!src) return;
var audio = document.createElement('audio');
audio.src = src;
var wrapper = document.createElement('div');
wrapper.className = 'custom-audio-wrapper';
var playBtn = document.createElement('button');
playBtn.className = 'custom-audio-play';
playBtn.innerHTML = '▶';
var progress = document.createElement('input');
progress.setAttribute('type', 'range');
progress.className = 'custom-audio-progress';
progress.setAttribute('min', 0);
progress.value = 0;
progress.step = 0.01;
var time = document.createElement('span');
time.className = 'custom-audio-time';
time.innerHTML = '0:00';
// Громкость
var volumeControl = document.createElement('input');
volumeControl.setAttribute('type', 'range');
volumeControl.setAttribute('min', 0);
volumeControl.setAttribute('max', 1);
volumeControl.setAttribute('step', 0.01);
volumeControl.setAttribute('value', 1);
volumeControl.className = 'custom-audio-volume';
// Визуализация
var visualizer = document.createElement('canvas');
visualizer.className = 'custom-audio-visualizer';
wrapper.appendChild(visualizer);
wrapper.appendChild(playBtn);
wrapper.appendChild(progress);
wrapper.appendChild(time);
wrapper.appendChild(volumeControl);
container.appendChild(wrapper);
// Инициализация Web Audio API
var audioContext = new (window.AudioContext || window.webkitAudioContext)();
var analyser = audioContext.createAnalyser();
var source = audioContext.createMediaElementSource(audio);
source.connect(analyser);
analyser.connect(audioContext.destination);
// Настройки анализатора
analyser.fftSize = 256;
var bufferLength = analyser.frequencyBinCount;
var dataArray = new Uint8Array(bufferLength);
function draw() {
requestAnimationFrame(draw);
analyser.getByteFrequencyData(dataArray);
var canvas = visualizer;
var canvasContext = canvas.getContext('2d');
canvasContext.clearRect(0, 0, canvas.width, canvas.height);
var barWidth = (canvas.width / bufferLength) * 2.5;
var barHeight;
var x = 0;
for (var i = 0; i < bufferLength; i++) {
barHeight = dataArray[i];
canvasContext.fillStyle = 'rgb(' + (barHeight + 100) + ',50,50)';
canvasContext.fillRect(x, canvas.height - barHeight / 2, barWidth, barHeight / 2);
x += barWidth + 1;
}
}
audio.addEventListener('play', function () {
audioContext.resume().then(() => {
draw();
});
});
playBtn.onclick = function () {
if (audio.paused) {
audio.play();
playBtn.innerHTML = '⏸';
} else {
audio.pause();
playBtn.innerHTML = '▶';
}
};
volumeControl.oninput = function () {
audio.volume = volumeControl.value;
};
audio.addEventListener('loadedmetadata', function () {
progress.max = audio.duration;
});
audio.addEventListener('timeupdate', function () {
progress.value = audio.currentTime;
time.innerHTML = formatTime(audio.currentTime);
});
progress.addEventListener('input', function () {
audio.currentTime = parseFloat(progress.value);
});
function formatTime(seconds) {
var mins = Math.floor(seconds / 60);
var secs = Math.floor(seconds % 60);
if (secs < 10) secs = '0' + secs;
return mins + ':' + secs;
}
})(players[i]);
}
});