2016-04-12 3 views
2

Я хотел бы создать счетчик децибел для звука, воспроизводимого в видеоэлементе. Элемент видео воспроизводит поток WebRTC.Измеритель уровня звука для веб-RTC-потока

В настоящий момент потоки WebRTC не могут быть переданы в Web Audio Analyzer. (Хотя это может скоро измениться ...) (см. Web Audio API analyser node getByteFrequencyData returning blank array)

Есть ли в настоящее время другой способ получить информацию о децибелах с удаленного медиапотока?

ответ

3

Хром 50 был выпущен: с 13 апреля 2016 года с использованием узла анализатора с MediaStreamAudioSourceNode отлично работает, чтобы получить уровни звука. Полученное значение audioLevels может быть анимировано или просто передано в элемент html meter.

var _mediaStream = SOME_LOCAL_OR_RTP_MEDIASTREAM; 
var _audioContext = new AudioContext(); 
var _audioAnalyser = []; 
var _freqs   = []; 
var audioLevels  = [0]; 

var _audioSource   = _audioContext.createMediaStreamSource(_mediaStream); 
var _audioGain1   = _audioContext.createGain(); 
var _audioChannelSplitter = _audioContext.createChannelSplitter(_audioSource.channelCount); 

var _audioSource.connect(_audioGain1); 
var _audioGain1.connect(_audioChannelSplitter); 
var _audioGain1.connect(_audioContext.destination); 

for (let i = 0; i < _audioSource.channelCount; i++) { 
    _audioAnalyser[i]      = _audioContext.createAnalyser(); 
    _audioAnalyser[i].minDecibels   = -100; 
    _audioAnalyser[i].maxDecibels   = 0; 
    _audioAnalyser[i].smoothingTimeConstant = 0.8; 
    _audioAnalyser[i].fftSize    = 32; 
    _freqs[i]        = new Uint8Array(_audioAnalyser[i].frequencyBinCount); 

    _audioChannelSplitter.connect(_audioAnalyser[i], i, 0); 
} 

function calculateAudioLevels() { 
    setTimeout(() => { 
     for (let channelI = 0; channelI < _audioAnalyser.length; channelI++) { 
      _audioAnalyser[channelI].getByteFrequencyData(_freqs[channelI]); 
      let value = 0; 
      for (let freqBinI = 0; freqBinI < _audioAnalyser[channelI].frequencyBinCount; freqBinI++) { 
       value = Math.max(value, _freqs[channelI][freqBinI]); 
      } 
      audioLevels[channelI] = value/256; 
     } 
     requestAnimationFrame(calculateAudioLevels.bind(this)); 
    }, 1000/15); // Max 15fps — not more needed 
} 
+0

Это работает, но Chrome (начиная с версии 58) по-прежнему нуждается в видео/аудиоэлементе HTML5, приглушенном или нет, в качестве конечной точки для удаленного потока WebRTC. Без этого «MediaStreamAudioSourceNode», созданный 'createMediaStreamSource (stream)', будет только издавать тишину. См. Https://bugs.chromium.org/p/chromium/issues/detail?id=121673, где говорится: «Должна быть какая-то цель рендеринга не-WebAudio ... тег

0

В JavaScript это единственный способ достичь того, чего вы хотите.

 Смежные вопросы

  • Нет связанных вопросов^_^