zoukankan      html  css  js  c++  java
  • Audio Fingerprinting指纹获取核心代码

      浏览器的音频指纹识别-现在是FingerprintJS2的一部分,附上获取Audio Fingerprinting指纹获取核心代码

      

    var audioFingerprint = (function () {
    	
    	var context = null;
    	var currentTime = null;
    	var oscillator = null;
    	var compressor = null;
    	var fingerprint = null;
    	var callback = null
    	
    	function run(cb, debug = false) {
    		
    		callback = cb;
    		
    		try {
    			
    			setup();
    		
    			oscillator.connect(compressor);
    			compressor.connect(context.destination);
    		
    			oscillator.start(0);
    			context.startRendering();
    			
    			context.oncomplete = onComplete;
    		  
    		} catch (e) {
    			
    			if (debug) {
    				throw e;
    			}
    			
    		}
    	}
    	
    	function setup()
    	{
    		setContext();
    		currentTime = context.currentTime;
    		setOscillator();
    		setCompressor();
    	}
    
    	function setContext()
    	{
    		var audioContext = window.OfflineAudioContext || window.webkitOfflineAudioContext;
    		context = new audioContext(1, 44100, 44100);
    	}
    
    	function setOscillator()
    	{
    		oscillator = context.createOscillator();
    		oscillator.type = "triangle";
    		oscillator.frequency.setValueAtTime(10000, currentTime);
    	}
    
    	function setCompressor()
    	{
    		compressor = context.createDynamicsCompressor();
    		
    		setCompressorValueIfDefined('threshold', -50);
    		setCompressorValueIfDefined('knee', 40);
    		setCompressorValueIfDefined('ratio', 12);
    		setCompressorValueIfDefined('reduction', -20);
    		setCompressorValueIfDefined('attack', 0);
    		setCompressorValueIfDefined('release', .25);
    	}
    
    	function setCompressorValueIfDefined(item, value)
    	{
    		if (compressor[item] !== undefined && typeof compressor[item].setValueAtTime === 'function') {
    			compressor[item].setValueAtTime(value, context.currentTime);
    		}
    	}
    	
    	function onComplete(event)
    	{
    		generateFingerprints(event);
    	    compressor.disconnect();
    	}
    	
    	function generateFingerprints(event)
    	{
    		var output = null;
    		for (var i = 4500; 5e3 > i; i++) {
    			
    			var channelData = event.renderedBuffer.getChannelData(0)[i];
    			output += Math.abs(channelData);
    			
    		}
    		
    		fingerprint = output.toString();
    		
    		if (typeof callback === 'function') {
    			return callback(fingerprint);
    		}
    	}
    	
    	return {
    		run:run
    	};
    	
    })();
    

      

  • 相关阅读:
    Win10删除anaconda重装
    anaconda python no module named 'past'的解决方法
    detectMultiScale 读取冲突的一个解决方法
    [原] Android快速开发框架-AndroidFine,GitHub开源
    [原] Android 自定义View 密码框 例子
    [原]发布一个jQuery提示框插件,Github开源附主站,jquery.tooltips.js
    [原] Jenkins Android 自动打包配置
    [原] Android性能优化方法
    阿里云9折推荐码:0LGVW2
    [原]那些年整理的Linux常用命令,简单明了
  • 原文地址:https://www.cnblogs.com/68xi/p/13353071.html
Copyright © 2011-2022 走看看