Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.01.2026, 18:19
Аватар для cupoma58
Аспирант
Отправить личное сообщение для cupoma58 Посмотреть профиль Найти все сообщения от cupoma58
 
Регистрация: 10.11.2016
Сообщений: 34

графический эквалайзер
Привет. Пытаюсь приделать графический эквалайзер к аудио-плееру, на jQuery:
<ul class="playlist"> 
    <li audiourl="file.mp3" cover="file.jpg" artist="Name">Song</li>
    .....
</ul>

Плеер, под каждый трек:
jQuery

function initAudio(elem) {
    var url = elem.attr('audiourl'),
        song = new Audio('data/' + url);
.....
}

Графический эквалайзер, в head:
window.onload = function() {
    // инициализация аудиоконтекста и элементов
    var audioContext = new (window.AudioContext || window.webkitAudioContext)(), 
	    el = document.getElementsByTagName('li'),
	    url = el.getAttribute('audiourl'),
        audioElement =  new Audio('data/' + url),
        canvas = document.getElementById('canvas'),
        canvasContext = canvas.getContext('2d');
    .....
};

Как результат: Uncaught TypeError: el.getAttribute is not a function
Почему?
При этом - плеер работает - без эквалайзера.
Ответить с цитированием
  #2 (permalink)  
Старый 10.01.2026, 18:28
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,618

document.getElementsByTagName('li')
У тебя в el коллекция всех li на странице, а не какой-то конкретный.

Сделай так
el = document.getElementsByTagName('li')[0],
или так
el = document.querySelector('li'),
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 15.01.2026, 15:00
Аватар для cupoma58
Аспирант
Отправить личное сообщение для cupoma58 Посмотреть профиль Найти все сообщения от cupoma58
 
Регистрация: 10.11.2016
Сообщений: 34

Сообщение от enoperating Посмотреть сообщение
Исправить можно так:
var el = document.getElementsByTagName('li')[0]
В скрипте плеера - нет элемента audio
<audio></audio>

Каждый раз(по click), функция initAudio(elem), создаёт новый плеер. Трек [0] запускается только в начале, если небыло выбора по плей-листу.
Пробовал через each() - не пошло.
Ответить с цитированием
  #4 (permalink)  
Старый Сегодня, 12:10
Аватар для Опан1
Аспирант
Отправить личное сообщение для Опан1 Посмотреть профиль Найти все сообщения от Опан1
 
Регистрация: 10.09.2019
Сообщений: 36

Попробуйте такое решение, как его приделать:
<head>
<title>Графический эквалайзер</title>
<meta charset="utf-8" />
<meta name="viewport" content="height=device-height,width=device-width, user-scalable=no, initial-scale=1">
<style>
canvas{
	background: blue;
}
ul{
	cursor: pointer;
}
li:hover{
	background: gold;
	width: 100px;
}
</style>
</head>
<body>
<canvas id=canvas></canvas><br /><br />
<ul class="playlist"> 
    <li onclick="audio.src='stekla.mp3';audio.play()">Sound1</li>
	<li onclick="audio.src='naetoy1.mp3';audio.play()">Sound2</li>
	<li onclick="audio.src='dlalekcii.mp3';audio.play()">Sound3</li>
</ul>
</body>

canvas.width = 1024;
canvas.height = 256;
const audio = new Audio();
audio.controls = true;
document.body.append(audio);
audio.onplay = function(){
	audioCtx = new AudioContext();
	let source = audioCtx.createMediaElementSource(audio);
	let analyser = audioCtx.createAnalyser();
	source.connect(analyser); // Подключаем анализатор к элементу audio
	analyser.connect(audioCtx.destination); // Без этой строки нет звука, но анализатор работает.
	let frequencyData = new Uint8Array(analyser.frequencyBinCount);
	let ctx = canvas.getContext('2d');
	setInterval(function(){
		analyser.getByteFrequencyData(frequencyData); // Записываем в массив данные уровней частот
		ctx.fillStyle = "black"; // Задаём цвет фона
		ctx.globalAlpha = 0.05; // Это для получения эффекта плавного погасания полос
		ctx.fillRect (0, 0, canvas.width, canvas.height); // Полупрозрачно чистим экран
		ctx.globalAlpha = 1;
		for(i = 0; i < canvas.width; i ++){
			let ii = Math.floor(i / canvas.width * 1024);
			let dd = frequencyData[ii] / 256 * canvas.height;
			ctx.fillStyle = "rgb(" + (128 + 128 * Math.sin((ii + 200 / canvas.width * 1024) / 43)) + ", " + (128 + 128 * Math.sin(ii / 73)) + ", " + (128 + 128 * Math.sin(ii / 35)) + ")";
			ctx.fillRect(i, canvas.height - dd - 1, 1, dd); // рисуем полосу
		}
	}, 20);
}

Живая ссылка: https://mysynthesizer.github.io/inde.../analiser.html
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Графический ключ ovchinnickov Элементы интерфейса 0 16.03.2017 14:09
Эквалайзер на js KupueIIIKo Общие вопросы Javascript 2 12.04.2013 16:21
Графический редактор??? Elf1k Библиотеки/Тулкиты/Фреймворки 8 07.11.2010 19:34
Простой графический движок: SVG vs Canvas stryaponoff Общие вопросы Javascript 5 29.06.2010 16:59
Графический таймер обратного отсчета bobri4 Элементы интерфейса 4 24.08.2009 22:50