предисловие
с прошлого разаВеселый разговор CDNПосле того, как я рассказал историю о «Чуан Дуннай», я больше никогда не писал в блоге. Может быть, некоторые друзья думали, что нас поймали, хахаха~
Давным-давно г-н Чжао Чжунсян сказал нам, что сезон дождей — хорошее время. Наступил сезон дождей, цветут весенние цветы, все восстанавливается, и это сезон программистов в прериях XX. Ну, подальше. Ведь младшие братья и сестры в команде слишком заняты, чтобы влюбляться, и им некогда писать блоги.
Получить продолжительность аудио
Есть такая необходимость загрузить аудиофайл и получить его размер и длину одновременно.
нормальный метод
Использовать эти воспоминания очень просто, напишите следующий код:
function getAudioDuration(url) {
const audio = document.createElement('audio');
audio.src = url;
audio.addEventListener("canplay", function () {
console.log(audio.duration);
});
}
const file = document.getElementById('file');
file.addEventListener('change', (e) => {
const file = e.target.files[0];
console.log(file.size);
getAudioDuration(URL.createObjectURL(file));
})
Когда я закончил приведенный выше код, я вспомнил критику главного инженера: Это решение слишком простое. Как только хризантема натянулась, я так испугалась, что быстро стала искать другие решения.
ArrayBuffer
На компьютере, когда мы выбираем файл MP3, мы обычно видим некоторую метаинформацию, такую как продолжительность воспроизведения, частота дискретизации и т. д. Можем ли мы в этом случае получить соответствующую информацию, прочитав бинарные данные?
После запроса соответствующей информации мы обнаружили, что API decodeAudioData может удовлетворить наши потребности, поэтому у нас есть следующее решение.
function getAudioDurationByAudioApi(file) {
const fileReader = new FileReader();
const audioContext = new AudioContext();
fileReader.readAsArrayBuffer(file);
fileReader.onload = () => {
audioContext.decodeAudioData(fileReader.result, (result) => {
console.log(result);
});
}
}
const file = document.getElementById('file');
file.addEventListener('change', (e) => {
const file = e.target.files[0];
console.log(file.size);
getAudioDurationByAudioApi(file);
})
Игнорируемый API веб-аудио
В ходе вышеупомянутого исследования я обнаружил, что пренебрегалWeb Audio API. В прошлом, когда речь шла о аудиозаписях, было очень просто воспроизвести фрагмент аудио с помощью тега audio. Поэтому я не обратил внимания на уже существующий Audio API.
взять каштан
Для практического применения возьмем простой пример воспроизведения аудио:
function playAudio(file) {
const fileReader = new FileReader();
const audioContext = new AudioContext();
fileReader.readAsArrayBuffer(file);
fileReader.onload = () => {
audioContext.decodeAudioData(fileReader.result, (result) => {
//创建播放源
const source = audioContext.createBufferSource();
source.buffer = result;
//连接输出终端
source.connect(audioContext.destination);
//开始播放
source.start();
});
}
};
const file = document.getElementById('file');
file.addEventListener('change', (e) => {
playAudio(e.target.files[0]);
});
В приведенном выше примере просто используется соответствующий API для воспроизведения звука и анализа кода клавиши.
AudioContext
Прямой перевод - «аудиоконтент». Подобно контексту в холсте. Он содержит ряд API для управления звуком.
В приведенном выше коде объект AudioContext создается с помощью const audioContext = new AudioContext();, поэтому мы можем выполнять различные операции.
Создайте источник воспроизведения
В приведенном выше примере мы создали источник воспроизведения с помощью AudioContext.createBufferSource(). Кроме того, мы также можем использовать другие данные в качестве источника воспроизведения:
- AudioContext.createOscillator()
- AudioContext.createBuffer()
- AudioContext.createMediaElementSource()
- AudioContext.createMediaStreamSource()
Чтобы узнать подробности, нажмите на ссылку.
Подключить вход и выход
Мы видим, что после установки источника воспроизведения выполняется операция подключения. Эта операция предназначена для привязки источника воспроизведения к терминалу воспроизведения.
AudioContextСвойство назначения возвращаетAudioDestinationNodeПредставляет конечный узел назначения всех аудио (узлов) в контексте, обычно это устройство воспроизведения звука, например динамик.
весело играть
В процессе изучения API, связанных с AudioContext, я нашел метод createAnalyser.
Способ Createanalyser может создатьAnalyserNode, который можно использовать для получения данных о времени и частоте звука, а также для визуализации данных.
Посмотрим на эффект.demo
Раньше, чтобы определить, что воспроизводится звук, мы часто помещали подпрыгивающий gif. Например:
Да это вообще не круто. Не могу не вспомнить слова главного инженера: этот план слишком прост.
В будущем, когда мы снова будем делать подобные запросы, мы сможем создать анимационный эффект, который будет следовать частоте музыки.
Суммировать
Мистер Лу сказал: «Никогда так, тогда не ты?»
Да, нам следует больше думать о существующих решениях.
Вышеизложенное — лишь верхушка айсберга API веб-аудио, и есть более продвинутые способы воспроизведения.Если вам интересно, вы можете проверить соответствующие документы.
Статьи по Теме
- Используйте HTML5 Web Audio API для добавления звука во взаимодействие JS веб-страницы
- Getting Started with Web Audio API
@Автор:TDGarden