Skip to content

Instantly share code, notes, and snippets.

@robwalch
Last active January 7, 2016 21:03
Show Gist options
  • Save robwalch/9e554d9a4874a33cf262 to your computer and use it in GitHub Desktop.
Save robwalch/9e554d9a4874a33cf262 to your computer and use it in GitHub Desktop.
Print out audio levels for all video / audio elements on the page
// audio-levels.js
// https://github.com/bgrins/devtools-snippets
// Print out audio levels for all video / audio elements on the page.
// Watch out for: "MediaElementAudioSource outputs zeroes due to CORS access restrictions" ...for x-origin media urls
(function() {
[].forEach.call(document.querySelectorAll("video,audio"), function(media) {
var splitPath = media.src.split('/');
var srcName = media.id +'_'+ splitPath[splitPath.length-1];
var context = window.__webkitAudioContext = window.__webkitAudioContext || new webkitAudioContext();
var jsProcessor;
var source;
var frameBufferSize = 4096;
var bufferSize = frameBufferSize/4;
var signal = new Float32Array(bufferSize);
var processTotal = 5;
var processCount = processTotal;
//connect html5 media element to web audio context
try {
source = media.__elementSource = media.__elementSource || context.createMediaElementSource(media);
}
catch(e) {
console.error("Cannot create Media Element Source for element", media, e);
return;
}
console.group('Audio Levels for '+ srcName);
var sum = 0;
//amplitude js processor
try {
jsProcessor = context.createScriptProcessor(2048);
}
catch(e) {
console.error("Cannot create Script Processor for Audio Context", context, e);
return;
}
jsProcessor.onaudioprocess = function audioAvailable(event) {
// Copy input arrays to output arrays to play sound
var inputArrayL = event.inputBuffer.getChannelData(0);
var inputArrayR = event.inputBuffer.getChannelData(1);
var outputArrayL = event.outputBuffer.getChannelData(0);
var outputArrayR = event.outputBuffer.getChannelData(1);
var value = 0;
var max = 0;
var n = inputArrayL.length;
for (var i = 0; i < n; ++i) {
outputArrayL[i] = inputArrayL[i];
outputArrayR[i] = inputArrayR[i];
// create data frame for fft - deinterleave and mix down to mono
value = (inputArrayL[i] + inputArrayR[i]) / 2;
signal[i] = value;
max = Math.max(Math.abs(value));
}
console.log('samples:', n, 'max signal strength:', max, 'at position:', context.currentTime);
sum += max;
// tear down
if (--processCount === 0) {
jsProcessor.onaudioprocess = null;
jsProcessor.disconnect(0);
//source.disconnect(0);
//source.connect(context.destination);
console.log('Level 0-100:', (sum * 100 / processTotal).toFixed(2));
console.groupEnd('Audio Levels for '+ srcName);
}
};
//connect graph
source.connect(jsProcessor);
source.connect(context.destination);
jsProcessor.connect(context.destination);
});
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment