• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Web Audio Analyser analysiert nicht.

xorg1990

New member
Hi, ich weiß mal wieder nicht weiter und zwar spinnt bei mir der Web audio Analyser rum.
Im Chrome rendert das canvas gar nicht, bleibt schwarz (Uint8Array =0,0,0,) und im FF stehen da nur maximal werte also bei (255,255,255,usw.).
Ich finde das Problem einfach nicht.:confused:

Das Problem könnten in der Methode play liegen, da der Scriptprocessor mit .bind() mit dem Rest verbunden ist, und sich deshalb nix tut. Obwohl ja der Sp. mit den Analyser in der Methode connection verbunden ist.


Code:
<!DOCTYPE html>

<head>
    <title>Playing sound with WebAudio API</title>
    <script src="lib/audiolib.js"></script>
    <script type="text/javascript" src="chroma.js"></script>
    <script type="text/javascript" src="jquery-1.8.0.min.js"></script>
    
     <script>
        function start(){
            new player();
        }
        
        window.AudioContext = window.AudioContext || window.webkitAudioContext;
        
     
        
        
        
	function player(){
           //anaylser/canvas stuff
            this.canvas = document.getElementById("Normal_CW_Window");
            this.canvas_width = this.canvas.width;
            this.canvas_height = this.canvas.height;
            this.canvas_ctx = this.canvas.getContext("2d");
            
            this.tempCanvas = document.createElement("canvas");
            this.tempCtx = this.tempCanvas.getContext("2d");
            this.tempCanvas.width = this.canvas_width;
            this.tempCanvas.height = this.canvas_height;
            
            //chromajs 
            this.colors = new chroma.ColorScale({
            colors: ['#000000', '#0C3AC6', '#ffff00', '#ffffff'],
            positions: [0, .25, .75, 1],
            mode: 'rgb',
            limits: [0, 300]
            });
            //Audio Stuff
            this.audioctx = new AudioContext();
	    this.w_ptr = 0;
	    this.r_ptr = 30720;
	    this.bufferSize = 32768; 
	    this.FloatBuffer = new Float32Array(this.bufferSize);
	    this.InRate = 22050;//hz
            this.OutRate = this.audioctx.sampleRate;
            this.N_of_samples = 2048;//number of samples where Script Processor play through
            //some varibles for the jitterbuffer
            this.pBs = 0.0;//toggle the playback speed if the buffer underruns or overrun
            this.ratioWeight = 0.0;
            this.SPTime = 0.0;
            this.connection();
            this.getSamples();
	}
        
        player.prototype.connection =function(){
            var Processor = this.audioctx.createScriptProcessor(this.N_of_samples, 0, 1)
            this.SpectrumAnaylser = this.audioctx.createAnalyser();
            this.SpectrumAnaylser.fftSize = 2048;
            this.FFT_Data = new Uint8Array(this.SpectrumAnaylser.frequencyBinCount);
                Processor.onaudioprocess = this.play.bind(this);
                Processor.connect(this.SpectrumAnaylser);
                Processor.connect(this.audioctx.destination);
                
                
        }
        
        player.prototype.play = function(ev){
            var outputLeft = ev.outputBuffer.getChannelData(0)
            var Len = ev.outputBuffer.length;           ;
            for (ev=0; ev < Len; ev++) {
               var firstSample = this.FloatBuffer[this.r_ptr];
		//Interpolation Sampleratio berechnen 
                var ratio = this.pBs * this.InRate / this.OutRate;
                this.ratioWeight  += ratio;   
                if(1 <= this.ratioWeight) {
                    this.ratioWeight -= 1; 
                    this.FloatBuffer[this.r_ptr] = 0;
                    this.r_ptr+=1;
                    if (this.bufferSize <= this.r_ptr)this.r_ptr -= this.bufferSize ;
                    var sample = this.FloatBuffer[this.r_ptr];
                    //do Interpolartion
                    sample = (this.ratioWeight * sample + (ratio - this.ratioWeight) * firstSample) / ratio;
                }
		if (sample < -1) sample = -1;
		if (sample > 1) sample = -1;
                outputLeft[ev] = sample;
            } //ende for
            this.SpectrumAnaylser.getByteFrequencyData(this.FFT_Data);
            this.drawSpectrogram(this.FFT_Data);
             document.getElementById("ausgabe2").innerHTML = "Sample: "+ sample;
            this.SPTime = this.audioctx.currentTime//(new Date).getTime();
        }

        player.prototype.drawSpectrogram = function(FFT_Data){
            var drawLength = FFT_Data.length < this.canvas_height ? this.canvas_height : FFT_Data.length;
            this.tempCtx.drawImage(this.canvas, 0, 0, this.canvas_width, this.canvas_height);
             document.getElementById("ausgabe3").innerHTML = "FFT value: "+ FFT_Data[4];
            for (var i = 0; i < drawLength; i++) {
                // draw each pixel with the specific color
                var value = FFT_Data[i];
                this.canvas_ctx.fillStyle = this.colors .getColor(value).hex();
                // draw the line at the right side of the canvas
                this.canvas_ctx.fillRect(this.canvas_width - 1, this.canvas_height - i, 1, 1);
            }
            // set translate on the canvas
            this.canvas_ctx.translate(-1, 0);
            // draw the copied image
            this.canvas_ctx.drawImage(this.tempCanvas, 0, 0, this.canvas_width, this.canvas_height, 0, 0, this.canvas_width, this.canvas_height);
            // reset the transformation matrix
            this.canvas_ctx.setTransform(1, 0, 0, 1, 0, 0);
        }
            
        player.prototype.getSamples = function(){
            var that = this;
           
            var ws = new WebSocket('ws://livegrab-test.ddns.net:3000');
            ws.binaryType = 'arraybuffer';
            var response_speed = 500;//ms
            ws.onmessage = function(b) {
                var jit = (that.bufferSize * 2 + that.w_ptr -  that.r_ptr - (that.audioctx.currentTime - that.SPTime) * that.InRate / 1E3) % that.bufferSize;
                response_speed += 0.01 * (jit - response_speed);
                if (response_speed > 2E3){
                    that.r_ptr = (that.bufferSize + that.w_ptr - 1E3) % that.bufferSize;
                    document.getElementById("ausgabe").innerHTML = "Output Index korrektur: "+ that.r_ptr;
                    jit = response_speed = 1E3;
                }
                that.pBs = 1 + 1E-5 * (response_speed - 1E3);
                 document.getElementById("ausgabe4").innerHTML = "Ratio anpassung: "+ that.pBs;
                if (1.002 < that.pBs)that.pBs = 1.002;
                if (0.998 > that.pBs)that.pBs = 0.998;
                var F32 = new Float32Array(b.data),i=0;
                for(;i<F32.length;i++,that.w_ptr++) {
                    //this.w_ptr++,i++;
                  
                    that.FloatBuffer[that.w_ptr] = F32[i];
                    if(that.bufferSize<=that.w_ptr)that.w_ptr -= that.bufferSize; 
                }
            }
        }
        
        
        
	
    </script>
</head>

<body onload=start();>
    <canvas id="Normal_CW_Window" width="893" height="730" style="display: block; background-color: black ;"></canvas>
    <div id="ausgabe"></div>
    <br>
    <div id="ausgabe2"></div>
        <br>
    <div id="ausgabe3"></div>
    <br>
    <div id="ausgabe4"></div>
    <br>  
</body>
</html>
Habe auch einen Test link gemacht,
aber Achtung als stream ist irgendein Radio Sender eingedreht der kratzt manch mal ganz schön laut.
Hoffe doch, dass die Internet Verbindung mitspielt (DSL 16000).

Dann ist da noch ‘ne frage zur code Übersicht:
Momentan gibt es nur ein Objekt namens player, ich hätte aber gerne ein weiteres Objekt namens SpectrumAnalyser .
Wie bekomme ich aber dann den Scriptprocessor, der im Objekt Player ist, mit dem Objekt SpectrumAnalyser verbunden?
 
Das Problem könnten in der Methode play liegen, da der Scriptprocessor mit .bind() mit dem Rest verbunden ist, und sich deshalb nix tut. Obwohl ja der Sp. mit den Analyser in der Methode connection verbunden ist.
keine ahnung, ob du das selbe meinst, aber soweit ich das sehe, bekommt der audioctx keinen input und deswegen wird onaudioprocess(play bei dir) auch nicht gerufen.
 
hesst schrieb:
...bekommt der audioctx keinen input und deswegen wird onaudioprocess(play bei dir) auch nicht gerufen.
Du hast da was verwechselt audioctx ist das Web Audio Context Objekt (new AudioContext())
Der Scriptprocessor (Sp. Abkürzung) läuft eigenständig sobald er mit einen Ziel verbunden ist: Processor.connect(this.audioctx.destination);

Habe das ganze verlinkt wenn du da was hörst geht auch der Sp.

Bei mir passiert das:
FFT Problem.png
...gelb:mad:
 
Du hast da was verwechselt audioctx ist das Web Audio Context Objekt (new AudioContext())
du hast einen audioctx, der hat erst mal eine dst. die src, musst du aber erst mal festlegen und mit der dst verbinden, sonst kommt nichts hinten raus.
jetzt willst du zw. src und dst eine scriptnode verschalten, also src->script->dst.
kommt was von src nach script wird onaudioprocess gerufen.

Der Scriptprocessor (Sp. Abkürzung) läuft eigenständig sobald er mit einen Ziel verbunden ist: Processor.connect(this.audioctx.destination);
und was geht in Processor rein? also wo steht source.connect(Processor);?

Habe das ganze verlinkt wenn du da was hörst geht auch der Sp.
ich sehe mir nur den code an, den du gepostet hast
 
hesst schrieb:
ich sehe mir nur den code an, den du gepostet hast
dann solltest du mal den link betätigen!
hesst schrieb:
und was geht in Processor rein? also wo steht source.connect(Processor)
die Quelle ist die websocket Verbindung: player.prototype.getSamples

Die Samples werden in den Buffer geschrieben this.FloatBuffer = new Float32Array(this.bufferSize);
im Sp werden die Samples dann wider herausgelesen: var sample = this.FloatBuffer[this.r_ptr];

hesst schrieb:
ich sehe mir nur den code an, den du gepostet hast
... dann intensiver angucken, ist ja auch kompliziert muss ich ehrlich zugeben
 
dann solltest du mal den link betätigen!
nee, sry

die Quelle ist die websocket Verbindung: player.prototype.getSamples
das möchtest du vielleicht

Die Samples werden in den Buffer geschrieben this.FloatBuffer = new Float32Array(this.bufferSize);
ja

im Sp werden die Samples dann wider herausgelesen: var sample = this.FloatBuffer[this.r_ptr];
ja, aber der Sp wird nie aufgerufen, weil er keine daten bekommt.
du hast: script->dst
script besteht aus: ->inputbuffer->onaudioprocess->outputbuffer->
kommt was in die scriptnode wird onaudioprocess getriggert. das passiert bei dir aber nicht, also wird onaudioprocess nie gerufen

... dann intensiver angucken, ist ja auch kompliziert muss ich ehrlich zugeben
oder übersehe ich was?
 
hesst schrieb:
oder übersehe ich was?
ja die Funktionsweise des Scriptprocessors.

Let me explain.

Initializing a ScriptProcessor takes 3 arguments, the first of which is the size of the buffer that you want to process on each AudioProcessing Event. That buffer size then also determines how frequently the AudioProcessing event needs to be fired. Puttering around the web, most of the examples you’ll find demonstrating a ScriptProcessor will use a buffer size of 1024 or 4096 sample frames. Lets look at that for a second.

Using a buffer size of 1024 means that every 1024 sample frames, the AudioProcess event will fire, and your callback will be called. The AudioContext uses a sample rate of 44100Hz (44.1 kHz) by default. This is pretty standard in audio processing, and chances are that you won’t have any reason to change it. So, some simple math: each sample frame is 1 / 44100 = 0.00002267 seconds long. Each buffer then is 1024 * 0.00002267 = 0.0232 seconds long, which is the length of time in between each invocation of your callback. Woah. Every .0232s your event loop gets hit with another function call. That’s 43 callbacks per second, just for one ScriptProcessor! You can run through that math again with a buffer size of 4096 if you want to, you’ll find that you’re not saving yourself much trouble. Buffer size vs. latency is a tradeoff that you hopefully have already considered anyway.

Sollte alles klar sein.
Quelle: https://medium.com/web-audio/you-dont-need-that-scriptprocessor-61a836e28b42

Der Sp muss mit dem destination Verbunden sein sonnst feuert der nicht los und er muss mindestens einen Ausgangs Puffer haben.

Hier habe ich noch in mein Repertoire gefunden:
Code:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/html">
<head>
    <title>Playing sound with WebAudio API</title>

 </head>
<body>
<h1>Playing sound with WebAudio API</h1>

<script type="text/javascript">
window.AudioContext = window.AudioContext || window.webkitAudioContext;
var context = new AudioContext();

// Create a ScriptProcessorNode with a bufferSize of 4096 and a single output channel
var audioNode = context.createScriptProcessor(4096, 0, 1);

var volume = .5;

// The frequncy of the sine wave tone
var frequency = 440;

// Give the node a function to process audio events
audioNode.onaudioprocess = function(audioProcessingEvent) {

  // The output buffer contains the samples that will be modified and played
  var outputBuffer = audioProcessingEvent.outputBuffer;

  // Loop through the output channels (in this case there is only one)
  for (var channel = 0; channel < outputBuffer.numberOfChannels; channel++) {
    var outData = outputBuffer.getChannelData(channel);

    // Loop through the 4096 samples
    for (var sample = 0; sample < outputBuffer.length; sample++) {

      // The time at which the sample will play
      var sampleTime = audioProcessingEvent.playbackTime + outputBuffer.duration * sample / outputBuffer.length;

      // Set the data in the output buffer for each sample
      outData[sample] = volume * Math.sin(sampleTime * frequency * Math.PI * 2);
    }
  }
}

// Connect the node to the context to start playing the sound
audioNode.connect(context.destination); // Connect to speakers
</script>
</body>
</html>
Hier gibt es auch keine quelle und trotzdem geht es. Achtung laut!!!
 
Zuletzt bearbeitet:
Hier gibt es auch keine quelle und trotzdem geht es.
ja, aber
klar ist das nicht und auch nicht standardkonform. das was dort beschrieben ist, ist das sollverhalten. also, wenn ich einen buffer mit 1024 entrys habe, ist der alle .0232s voll und das callback wird gerufen. habe ich aber keine input, wird der auch nie voll und wird nicht gerufen.
https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#ScriptProcessorNode
audioprocess events are only dispatched if the ScriptProcessorNode has at least one input or one output connected.
EDIT: ok, das or sehe ich erst jetzt. macht für mich trotzdem keinen sinn

kannst du mir mal ein paar (viele) werte des FloatBuffer posten?
 
Zuletzt bearbeitet:
Oh ich sehe gerade das in der neuen Dokumentation der Sp als veraltet markiert wurde, wenn die Browserhersteller den rausnehmen bedeutet das den tot mein Projekts + den tot von den websdr Projekt der Uni Twente + den tot von three.js Projekten, da wird der zum timen von audio evens verwendet insbesondere bei Spielen. Gerade mit dem Sp und der Convlover sind die mächtigsten Werkzeuge der Api. Etliche webrtc Projekte würden auch den Bach runter gehen.:mad::mad::mad:

Naja noch ist es nicht so weit.

hesst schrieb:
kannst du mir mal ein paar (viele) werte des FloatBuffer posten?
Wie soll das den gehen? wäre es nicht einfacher ein rauschen zu erzeugen.


Code:
var FloatBuffer = new Float32Array(32768);

for(var i=0;i<FloatBuffer.length;i++){
      FloatBuffer[i] = Math.random()*2-1;
}

//ScriptProcessor...
kommt am Ende aufs selbe raus. Kannst auch das Sinus von letzten post nehmen.
 
Zuletzt bearbeitet:
hesst schrieb:
hast du denn mal nachgesehen, ob da noch vernünftige werte ankommen?

╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦╦:d
Code:
[-0.012543107382953167, 0.021225623786449432, -0.015320291742682457, -0.0079500712454319, -0.00953703373670578, -0.010895107872784138, 0.0034943693317472935, -0.016113772988319397, -0.0048371837474405766, -0.009247108362615108, -0.0070650349371135235, -0.01904354989528656, -0.01420636661350727, -0.007095553446561098, -0.003997924737632275, -0.004745628219097853, -0.004501480143517256, -0.0010071108117699623, -0.004333628341555595, -0.01829584687948227, -0.021973326802253723, -0.01347392238676548, -0.012787255458533764, -0.012375256046652794, -0.024475842714309692, -0.006942960899323225, -0.0037690354511141777, -0.023575548082590103, 0.0006714076735079288, 0.014587847515940666, -0.008056886494159698, 0.0019531846046447754, 0.008758812211453915, 0.002182073425501585, 0.023453474044799805, 0.00611896114423871, -0.0023651844821870327, -0.0017700735479593277, -0.017151402309536934, 0.0037842951714992523, 0.009613330475986004, -0.014191106893122196, -0.0044404431246221066, -0.00047303689643740654, -0.017258217558264732, -0.004547257907688618, -0.020172733813524246, -0.01826532743871212, 0.0008392590098083019, -0.01594592072069645, -0.027527695521712303, -0.019592883065342903, -0.017090365290641785, -0.005523850210011005, -0.009857479482889175, -0.005188146606087685, 0.009277626872062683, 0.004654072690755129, 0.01730399578809738, 0.010345774702727795, 0.01229895930737257, 0.014877773821353912, 0.009247108362615108, -0.024781029671430588, -0.01229895930737257, -0.007736442144960165, -0.008621478453278542, -0.003082369454205036, -0.013138217851519585, -0.01510666310787201, -0.009369182400405407, 0.005706961266696453, 0.013595996424555779, -0.0119174774736166, 0.007568590342998505, 0.013458662666380405, 0.008896145969629288, -0.002227851189672947, 0.01745658740401268, -0.005355998408049345, -0.0021973326802253723, -0.006653035059571266, -0.0012207403779029846, -0.003723258152604103, 0.004165776539593935, -0.002151554450392723, -0.02610858343541622, -0.006057924125343561, 0.004699850454926491, -0.013214513659477234, -0.02150028944015503, 0.009750664234161377, -0.012787255458533764, -0.009735404513776302, 0.018646810203790665, 0.0005645924247801304, 0.01106295920908451, 0.010177923366427422, 0.002578814048320055, 0.0005188146606087685…]
╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩

Mehr passt in das console.log nicht rein.:d
 
Code:
            this.pBs = 0.0;//toggle the playback speed if the buffer underruns or overrun
            this.ratioWeight = 0.0;
...
                var ratio = this.pBs * this.InRate / this.OutRate; // immer 0
                this.ratioWeight  += ratio;                               // also auch immer 0
                if(1 <= this.ratioWeight) {                               // kommt hier nie rein !!! das kann kein mensch lesen, leute die sowas schreiben verwenden auch jslint, du meinst wenn this.ratioWeight >= 1
...
                    var sample = this.FloatBuffer[this.r_ptr];
...
                }
...
                outputLeft[ev] = sample;                                // sampleist immer undefined
            } 
...         
            this.SpectrumAnaylser.getByteFrequencyData(this.FFT_Data); // beim 1. mal dürften hier keine vernünftigen werte kommen
 
hesst schrieb:
kommt hier nie rein !!! das kann kein mensch lesen, leute die sowas schreiben verwenden auch jslint, du meinst wenn this.ratioWeight >= 1
Mir persönlich ist das egal wie das da steht man muss halt nur 2 mal hingucken, lese auch aheui wenns sein muss:p:rolleyes:
Nee spass bei Seite werde es mir merken, muss auch noch ein meiner Namenskonvention arbeiten. Jslint musste ich gerade erst ein mal Googlen was du damit meinst.

Hm wenn this.pBs immer 0 ist, dann wird das onmessege nicht losgefeuert, bei mir geht die Audiowiedergabe ohne Probleme:confused:
Steht was in der Console?? Was sagt den die Ausgabe "Ratio anpassung" da müsste 1.0021354346 oder so stehen wenn da nix steht wird das onmessage nicht ausgeführt.
 
Zuletzt bearbeitet:
Hm wenn this.pBs immer 0 ist, dann wird das onmessege nicht losgefeuert, bei mir geht die Audiowiedergabe ohne Probleme:confused:
ahh, hatte ich übersehen

Steht was in der Console?? Was sagt den die Ausgabe "Ratio anpassung" da müsste 1.0021354346 oder so stehen wenn da nix steht wird das onmessage nicht ausgeführt.
ich kucke nur

- - - Aktualisiert - - -

trotzdem ist das komisch. weil du dort uU den outputbuffer nicht mit werten versorgst. ok, die verschwinden bei dir nicht, da du die nicht über den inputbuffer beziehst, aber keine ahnung was dann passiert.
wie groß ist denn this.OutRate = this.audioctx.sampleRate;?
 
wie groß ist denn this.OutRate = this.audioctx.sampleRate;?
Die Semplerate richtet sich nach deinen System Einstellung.
web audio - WebAudio API sampling rate - Stack Overflow
Das musst du also selber ermitteln.

this.audioctx.sampleRate; kann von 44100 - 192000 alles sein. also 44100, 48000, 96000, 19200. Wobei 44100 Samples/sec nur FF macht, Chrome guck in die Hardware.


Ratio steht für Sampling Ratio oder "resampling factor". mein stream kommt mit 22050Hz und die vom Browser genutzte rate ist x Hz/sec.

22050/48000 = 0,5 * this.pBs
this.pBs ist ein Wert der benutzt wird um die Pufferung zu optimiren, je nach dem ober der Puffer überläuft oder leer läuft wird ein wenig an der Playback rate gespielt somit werden mehr werte interpoliert oder weniger, damit ist eine Wiedergabe in Realtime möglich ohne das es jittert . Mein ganze Anwendung hat vom Input bis zum Output 0.5sec delay. Input = am Server.

Auf den ganzen buffer Algorithmus möchte ich aber jetzt nicht ein gehen, das funzt einfach nur(Sprengt den Rahmen).
Scheint mir ein Fall für kkapsner zu werden.
 
Ratio steht für Sampling Ratio oder "resampling factor". mein stream kommt mit 22050Hz und die vom Browser genutzte rate ist x Hz/sec.
du willst also eigentlich interpolieren(der kommentar sagt es ja eigentlich schon). das sehe ich aber nicht

- - - Aktualisiert - - -

du solltest mal dir mal die SR deines Browsers ausgeben.
wozu? ich habe sonst nur werte von dir.

Begründe! mir schient als überfordert dich mein Skript.:(
dein script gibt nur werte raus, wenn
if(1 <= this.ratioWeight) {
ratioWeight berechnest du in jedem durchgang zu
this.ratioWeight += ratio;
mit 0 als initialwert
im 1. durchgang muss this.ratioWeight also großer/gleich 1 sein und ratio demzufolge auch
ratio berechnest du zu
var ratio = this.pBs * this.InRate / this.OutRate;
mit this.pBs leicht größer als 1(was auch schon schlecht ist, da this.ratioWeight damit irgendwann auch größer als 2 werden kann)
damit muss this.InRate / this.OutRate also 1 ergeben(oder größer - aber nur minimal kleiner als 1, was mit den werten nicht möglich ist) damit ratio größer 1 wird und damit ratioWeight


dann müsstest du eigentlich aus 22050 werten 48000 machen, wenn OutRate 48000 ist, also zw. den werten des inputbuffers jeweils einen zusätzlichen interpolieren
dazu musst du aber auch erst mal die 2 werte suchen, zw denen du interpolieren musst und den interpolationspunkt bestimmen
ist OutRate kleiner, müsstest du entsprechend werte weglassen
 
hesst schrieb:
du willst also eigentlich interpolieren(der kommentar sagt es ja eigentlich schon). das sehe ich aber nicht
//do Interpolartion
sample = (this.ratioWeight * sample + (ratio - this.ratioWeight) * firstSample) / ratio;

hesst schrieb:
im 1. durchgang muss this.ratioWeight also großer/gleich 1 sein und ratio demzufolge auch
wieso den das? wenn this.ratioWeight im ersten Durchgang kleiner ist dann wird nix gespielt.
Wer sagt den das die InRate immer 22050Hz beträgt, je nach Filter Bandbreite variiert auch die Input rate, für SSB(Voice) reichen 8000Hz, für FM(RadioBroadcast) müssen schon 22050 hz ran
dann muss in realtime die Pufferung angepast werden + eben die menge der Zu interpolierten werte

Es wird später noch einen weg zum Server zurück geben, via Websocket wo den Server mitgeteilt wird welche Frequenz der User hören möchte und eben die Filter Bandbreite.


hesst schrieb:
mit this.pBs leicht größer als 1(was auch schon schlecht ist, da this.ratioWeight damit irgendwann auch größer als 2 werden kann)
das darf nicht passieren die inRate muss immer kleiner gleich 44100 sein, da 44100 die kleinste von den Browser genutzte rate ist.

Was hat das ganze mit den nicht funktionierenden Analyser zu tun??? Wenn doch die Soundausgabe tadellos funktioniert.
Hör jetzt auf mit deinen Menschenkenntnis | Psychospielchen Getue, habe schon Kopfschmerzen weil ich wider mal nicht weiß wie ich dir das erklären soll. Hunger habe ich auch noch.

Three.js ist auch nicht in 5 Minuten erklärt, obwohl erklärt vielleicht schon, aber nicht durchschaut. Meine noch Projekt auch nicht,. (von funktionierender Software kann ja keine rede sein):(
 
Zurück
Oben