我想为在视频元素中播放的音频创建一个分贝计。视频元素正在播放 WebRTC 流。
目前 WebRTC 流无法传递到 Web 音频分析器。(尽管这可能很快就会改变……)(请参阅Web 音频 API 分析器节点 getByteFrequencyData 返回空白数组)
目前是否有另一种方法可以从远程媒体流中获取分贝信息?
我想为在视频元素中播放的音频创建一个分贝计。视频元素正在播放 WebRTC 流。
目前 WebRTC 流无法传递到 Web 音频分析器。(尽管这可能很快就会改变……)(请参阅Web 音频 API 分析器节点 getByteFrequencyData 返回空白数组)
目前是否有另一种方法可以从远程媒体流中获取分贝信息?
Chrome 50 已发布:截至 2016 年 4 月 13 日,使用带有 MediaStreamAudioSourceNode 的分析器节点可以正常获取音频电平。结果audioLevels
值可以动画或简单地传递给 htmlmeter
元素。
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);
_audioSource.connect(_audioGain1);
_audioGain1.connect(_audioChannelSplitter);
_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
}
这是一个很好的例子:
https://webrtc.github.io/samples/src/content/getusermedia/volume/
这是源代码:
https://github.com/webrtc/samples/tree/gh-pages/src/content/getusermedia/volume
这是一个示例:
function recordAudio() {
try {
window.AudioContext = window.AudioContext || window.webkitAudioContext;
window.audioContext = new AudioContext();
const instantMeter = document.querySelector('#sound-meter');
const constraints = {'video': false, 'audio': true};
const stream = await navigator.mediaDevices.getUserMedia(constraints);
window.stream = stream;
const soundMeter = window.soundMeter = new SoundMeter(window.audioContext);
soundMeter.connectToSource(stream, function(e) {
if (e) {
alert(e);
return;
}
setInterval(() => {
instantMeter.value = soundMeter.instant.toFixed(2);
}, 200);
});
$('#sound-meter').show();
$('#audio-icon').hide()
} catch(error) {
console.error('Error recording audio.', error);
}
}