2015-05-04 17 views
16

Ich versuche, eine 48000Hz Aufnahme über getUserMedia aufzunehmen. Aber ohne Glück. Der zurückgegebene Audio MediaStream gibt 44100Hz zurück. Wie kann ich dies auf 48000Hz einstellen?Ändern der Abtastrate von AudioContext (getUserMedia)

Hier sind Schnipsel meines Codes:

var startUsermedia = this.startUsermedia; 

      navigator.getUserMedia({ 
       audio: true, 
       //sampleRate: 48000 
      }, startUsermedia, function (e) { 
       console.log('No live audio input: ' + e); 
      }); 

Die startUsermedia Funktion:

startUsermedia: function (stream) { 
      var input = audio_context.createMediaStreamSource(stream); 
      console.log('Media stream created.'); 
      // Uncomment if you want the audio to feedback directly 
      //input.connect(audio_context.destination); 
      //__log('Input connected to audio context destination.'); 

      recorder = new Recorder(input); 
      console.log('Recorder initialised.'); 
     }, 

Ich habe versucht, die Eigenschaft sample des AudioContext ändern, aber kein Glück.

Wie kann ich die SampleRate auf 48000Hz ändern?

EDIT: Wir sind auch jetzt mit einer Flash-Lösung in Ordnung, die den Export und WAV-Dateien auf 48000Hz

Antwort

2

Sie können nicht aufnehmen kann. Die Samplerate des AudioContext wird vom Browser/Gerät festgelegt und Sie können nichts ändern. Tatsächlich werden Sie feststellen, dass 44.1kHz auf Ihrem Computer 48kHz auf meinem Rechner sind. Es hängt davon ab, was das Betriebssystem standardmäßig wählt.

Denken Sie auch daran, dass nicht alle Hardware alle Abtastraten verarbeiten kann.

+0

Ich sehe, danke. Gibt es vielleicht eine Flash-Lösung, die 48kHz unterstützt?(Es spielt keine Rolle, wenn einige Hardware es nicht unterstützt) –

+0

@ f.lorenzo Vielleicht. Sie sollten dafür eine andere Frage stellen, da sich eine Flash-Antwort vollständig von der Web Audio API unterscheidet. – Brad

10

Soweit ich weiß, gibt es keine Möglichkeit, die Abtastrate in einem Audio-Kontext zu ändern. Die Abtastrate ist normalerweise die Abtastrate Ihres Aufnahmegeräts und bleibt auch so. So werden Sie nicht in der Lage sein, so etwas zu schreiben.

var input = audio_context.createMediaStreamSource(stream); 
var resampler = new Resampler(44100, 48000); 
input.connect(resampler); 
resampler.connect(audio_context.destination); 

Wenn Sie jedoch Ihren Audio-Stream nehmen wollen, sampeln, und es dann an das Backend senden (oder etw anderes damit außerhalb der Web Audio API) können Sie einen externen Sample Rate Converter verwenden (zB https://github.com/taisel/XAudioJS/blob/master/resampler.js).

var resampler = new Resampler(44100, 48000, 1, 2229); 

    function startUsermedia(stream) { 
     var input = audio_context.createMediaStreamSource(stream); 
     console.log('Media stream created.'); 


     recorder = audio_context.createScriptProcessor(2048); 
     recorder.onaudioprocess = recorderProcess; 
     recorder.connect(audio_context.destination); 
    } 

    function recorderProcess(e) { 
     var buffer = e.inputBuffer.getChannelData(0); 
     var resampled = resampler.resampler(buffer); 
     //--> do sth with the resampled data for instance send to server 
    } 
+0

Vielen Dank, aber leider eine resampled Version der Aufnahme würde nicht funktionieren. Aber das ist eine gute Antwort für andere Leute, die nach einer Möglichkeit suchen, SampleRates zu konvertieren. –

+0

Ok, dann nur aus Neugier: Was willst du mit deinem Audio-Stream machen? Willst du es irgendwie retten oder was ist dein Ziel? – basilikum

+0

Leider kann ich Ihnen den Verwendungszweck aufgrund der Firmenpolitik nicht mitteilen. Aber ein korrektes SampleRate ist ein Muss. –

2

Sie können OfflineAudioContext verwenden, um Ihren Audiopuffer im Wesentlichen auf eine andere Abtastrate zu rendern (dies ist jedoch ein Stapelbetrieb).

Sie würden also Ihre Aufnahme mit dem normalen Audio-Kontext aufnehmen und dann einen OfflineAudioContext mit einer anderen Abtastrate verwenden, um Ihren Puffer zu rendern. Es gibt ein Beispiel auf der Mozilla-Seite.

0

Es ist jetzt in der Spezifikation, aber noch nicht in Chrom implementiert. Auch in bugs.chromium.org bedeutet "Status: Verfügbar" nicht, dass es implementiert ist. Es bedeutet nur, dass niemand daran arbeitet und dass es für jeden verfügbar ist, der daran arbeiten möchte. Also bedeutet "Verfügbar" "Nicht zugewiesen".