문제

AudioFile Amplitudes 값을 가져 오는 파형 생성기를 만들고 JavaScript에서 가능한 한 빠른 캔버스에 표시합니다 (실시간보다 빠르게). 따라서 OfflineAudioContext / WebKitOffLineAudioContext를 사용하여 파일을로드하고 분석을 시작합니다. 파형은 넓은 캔버스를 채우는 것입니다.

processor.onaudioprocess 함수에서 버퍼를 분석합니다. (나는 그것이 작동하는 방식이라고 생각한다.)

Firefox에서 잘 작동하지만 Chrome에서 문제가 있습니다. 가능한 한 빨리 작동하며, 단지 몇 좌표만을 돌려주기 위해 많은 분석을 통해 "점프"것 같습니다. 여기에 JSFIDDLE입니다. http://jsfiddle.net/bestiole/95ebf/

// create the audio context
if (! window.OfflineAudioContext) {
    if (! window.webkitOfflineAudioContext) {
        $('#output').append('failed : no audiocontext found, change browser');
    }
    window.OfflineAudioContext = window.webkitOfflineAudioContext;
}
//var context = new AudioContext();
var length = 15241583;
var samplerate = 44100;
var fftSamples = 2048;
var waveformWidth = 1920;

var context = new OfflineAudioContext(1,length,samplerate);
var source;
var splitter;
var analyser;
var processor;
var i=0;
var average;
var max;
var coord;

processor = context.createScriptProcessor(fftSamples, 1, 1);
processor.connect(context.destination);

analyser = context.createAnalyser();
analyser.smoothingTimeConstant = 0;
analyser.fftSize = fftSamples;

source = context.createBufferSource();
splitter = context.createChannelSplitter();
source.connect(splitter);
splitter.connect(analyser,0,0);

analyser.connect(processor);

context.oncomplete = function(){
    $('#output').append('<br />complete');
}

var request = new XMLHttpRequest();
request.open('GET', "http://www.mindthepressure.org/bounce.ogg", true);
request.responseType = 'arraybuffer';
request.onload = function(){
    $('#output').append('loaded ! ');
    context.decodeAudioData(request.response, function(buffer) {
        $('#output').append('starting analysis<br />');
        processor.onaudioprocess = function(e){
            var data =  new Uint8Array(analyser.frequencyBinCount);
            analyser.getByteFrequencyData(data);
            average = getAverageVolume(data);
            max = Math.max.apply(Math, data);
            coord = Math.min(average*2,255);
            coord = Math.round((max+coord)/2);
            ctx.fillStyle=gradient;
            ctx.fillRect(i,255-coord,1,255);
            console.log(i+' -> '+coord);
            i++;
        }
        source.buffer = buffer;
        source.start(0);
        context.startRendering();
    }, onError);
}
request.send();

function onError(e) {
    $('#output').append('error, check the console');
    console.log(e);
}

function getAverageVolume(array) {
    var values = 0;
    var average;
    var length = array.length;
    for (var k = 0; k < length; k++) {
        values += array[k];
    }
    average = values / length;
    return average;
}
.

(여기서는 1920px 와이드에 파형이 적합하고 관심있는 사람들이 웨이브 폼 데이터를 생성하는 또 다른 버전이 있습니다. http : // jsfiddle .NET / BETIOOLE / E3RSX / )

나는 정말로 요점을 얻지 못하고, 크롬은 오디오 파일의 모든 부분을 어떻게 처리하지 않습니까?

도움말셔서!

도움이 되었습니까?

해결책

크롬은 오프라인 모드에서 스크립트 프로세서에 버그가 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top