google-chrome - Web RTC 流的音频电平表

标签 google-chrome webrtc web-audio-api mediastreamsource

我想为视频元素中播放的音频创建一个分贝表。视频元素正在播放 WebRTC 流。

目前 WebRTC 流无法传递到 Web 音频分析器。 (尽管这可能很快就会改变……)(参见 Web Audio API analyser node getByteFrequencyData returning blank array)

目前是否有其他方法可以从远程媒体流中获取分贝信息?

最佳答案

Chrome 50 已发布:截至 2016 年 4 月 13 日,使用带有 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);

_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
}

关于google-chrome - Web RTC 流的音频电平表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36581380/

相关文章:

javascript - Webaudio API ScriptProcessorNode如何输出信号

javascript - 我尝试在 p5.js 中保存 27 个图像,但只有 10 个保存到我的下载文件夹中。为什么所有文件都没有保存?

javascript - 如何允许 Chrome 以编程方式使用我的麦克风?

webrtc 视频流停止共享

ubuntu - 在 Ubuntu 16.04.3 x64 TLS 上安装 CoTurn 4.5.0.6 不起作用

javascript - 附加mediaElementSource时,Web音频将被静音

css - Chrome 的站点可视化问题

google-chrome - 如何在没有所有浏览器控件(选项卡、地址行、按钮)的情况下运行 Chrome?

javascript - 在 Javascript 中读取 Firefox 的 media.navigator.enabled 的值

javascript - JS AudioContext 振荡器 - 同时播放多个音符(复调)