Определить, воспроизводится ли звук в браузере Javascript

Есть ли глобальный способ определить, когда звук воспроизводится или начинает воспроизводиться в браузере.

что-то вроде по идее if(window.mediaPlaying()){...

без привязки кода к конкретному элементу?

РЕДАКТИРОВАТЬ: здесь важно иметь возможность обнаруживать ЛЮБОЙ звук независимо от того, откуда он исходит. Будь то iframe, видео, API веб-аудио и т. д.


person Chris    schedule 14.04.2015    source источник


Ответы (4)


Никто не должен использовать это, но это работает.

По сути, единственный найденный мной способ получить доступ к звуку всего окна — использовать MediaDevices.getDisplayMedia().

Оттуда MediaStream можно передать в AnyalizerNode, который можно использовать для проверки того, превышает ли громкость звука ноль.

Работает только в Chrome и, возможно, в Edge (проверено только в Chrome 80 в Linux)

JSFiddle с <video>, <audio> и YouTube!

Важные фрагменты кода (невозможно опубликовать в рабочем фрагменте из-за политики функций во фрагменте iframe):

var audioCtx = new AudioContext();
var analyser = audioCtx.createAnalyser();

var bufferLength = analyser.fftSize;
var dataArray = new Float32Array(bufferLength);

window.isAudioPlaying = () => {
  analyser.getFloatTimeDomainData(dataArray);
  for (var i = 0; i < bufferLength; i++) {
    if (dataArray[i] != 0) return true;

  }
  return false;
}

navigator.mediaDevices.getDisplayMedia({
     video: true,
     audio: true
   })
   .then(stream => {
      if (stream.getAudioTracks().length > 0) {
        var source = audioCtx.createMediaStreamSource(stream);
        source.connect(analyser);

        document.body.classList.add('ready');
      } else {
        console.log('Failed to get stream. Audio not shared or browser not supported');
      }

   }).catch(err => console.log("Unable to open capture: ", err));
person Trobol    schedule 16.03.2020
comment
Хорошее решение, но, к сожалению, это не всегда работает. Я попробовал это в Google Meet, чтобы определить, говорит ли кто-то, но в сообщении говорится, что звук воспроизводится, даже когда никто не говорит. - person Aurasphere; 23.05.2021
comment
Кажется, что от вкладки исходит немного статического электричества, даже если все отключены. Я сделал обновленную скрипку, которая показывает график звука. jsfiddle - person Trobol; 23.05.2021

Действительно, я много ищу и читаю всю документацию MDN о Web Audio API, но не могу найти какой-либо глобальный флаг в окне, который показывает воспроизведение звука, но у меня есть хитрый способ, который показывает воспроизведение ЛЮБОГО звука, независимо от iframe или видео, но насчет Web Audio API я не уверен, сложный способ:

const allAudio = Array.from( document.querySelectorAll('audio') );
const allVideo = Array.from( document.querySelectorAll('video') );
const isPlaying = [...allAudio, ...allVideo].some(item => !item.paused);

Теперь купите флаг isPlaying, который мы можем обнаружить в браузере.

person AmerllicA    schedule 18.03.2020
comment
Почти положительно это зависит от того, что аудио/видео элементы являются частью DOM. Я почти уверен, что вы можете создать звуковой элемент с помощью JS и очень легко воспроизвести его, даже не добавляя его в DOM; так что это не сработает для этого сценария. - person Lovethenakedgun; 13.12.2020

Я искал решение в Google, но пока ничего не нашел. Возможно, вы могли бы проверить некоторые данные, которые имеют значение X, только во время воспроизведения звука. Если у вас есть кнопка, которая запускает воспроизведение аудиофайла, возможно, вы можете быть уверены, что звук воспроизводится, добавив прослушиватель событий в файл rep. кнопка...

Может быть, что-то вроде добавления прослушивателя событий в тег «аудио»? Если я правильно помню, аудиотег имеет атрибут "пауза"... И теперь я просто помню, что звук имеет атрибут "пауза"...

Кроме того, вы можете проверить эту тему проверить HTML5, воспроизводится ли звук?

я просто нашел это пять секунд назад jaja

person Emilio    schedule 14.04.2015

Существует свойство playbackState (https://developer.mozilla.org/en-US/docs/Web/API/MediaSession/playbackState), но не все браузеры его поддерживают.

if(navigator.mediaSession.playbackState === "playing"){...
person NinaW    schedule 14.03.2020
comment
без привязки кода к конкретному элементу является важным аспектом вопроса. (По крайней мере для меня.) - person brillout; 15.03.2020
comment
Правда, в этом случае для элемента сначала должен быть установлен playbackState (по умолчанию "none"), но его можно установить для любого медиа-источника. - person NinaW; 15.03.2020
comment
Если у вас нет контроля над исходным элементом, вы можете следовать логике Эда и искать медиа-элементы в вашем документе (аудио, видео, iframe) и проверять, воспроизводит ли какой-либо из них звук. - person NinaW; 15.03.2020
comment
Мне придется потратить некоторое время на изучение этого. Есть несколько вариантов доступа к документу iframe и его внутренней модели DOM, например contentWindow (developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/) и frames (developer.mozilla.org/en-US/docs/Web/API/Window/frames). Я также нашел связанный вопрос по адресу stackoverflow.com/questions/43745161/ может оказаться полезным. - person NinaW; 15.03.2020