2016-01-15 22 views
17

Şu anda yalnızca Firefox ve Chrome'da çalışan getUserMedia() kullanıyorum, ancak kullanımdan kaldırıldı ve yalnızca https (Chrome'da) çalışıyor. Tüm platformlarda çalışan javascript'te konuşma girişini almak için başka/daha iyi bir yol var mı?Javascript'te ses nasıl kaydedilir?

E.g. web.whatsapp.com uygulaması gibi web siteleri nasıl ses kaydeder? getUserMedia(), ilk kez kullanıcıların ses kaydına izin vermelerini isterken, Whatsapp uygulaması kullanıcının iznini gerektirmez.

getUserMedia()

Şu anda böyle görünüyor kullanıyorum: getUserMedia güçlü feature olduğundan

navigator.getUserMedia(
    { 
     "audio": { 
      "mandatory": { 
       "googEchoCancellation": "false", 
       "googAutoGainControl": "false", 
       "googNoiseSuppression": "false", 
       "googHighpassFilter": "false" 
      }, 
      "optional": [] 
     }, 
    }, gotStream, function(e) { 
     console.log(e); 
    }); 
+1

Sadece Chrome gerekiyor 'https' AFAIK. Firefox, değeri ne olduğu için '' '' 'getUserMedia'ı desteklemektedir. – jib

+5

https: //web.whatsapp.com/aslında cihazınızda WhatsApp yerel mobil uygulamasını başlatmanıza izin vermekten başka bir şey sağlamaz, değil mi? Yani, https: // web.whatsapp.com/'kendisi ses kaydetmenize izin vermez; bunun yerine, WhatsApp yerel mobil uygulaması yapar. Ve WhatsApp yerel mobil uygulaması, ilk kez kullanıcıların mikrofon erişimine izin vermesini istememesinin nedeni, kullanıcıların zaten yüklendiklerinde bu izni vermiş olmalarıdır. Web uygulamaları için ayrı bir “kurulum” adımı olmadığından, kullanıcıların * web uygulamasını * ilk kez kullandıkları zaman izin istemeleri gerekir. – sideshowbarker

cevap

25

Krom, https kullanarak gerektirir. API erişimi güvenli olmayan etki alanlarında çalışmamalıdır, çünkü API erişimi güvenli olmayan aktörlere aktarılabilir. Firefox yine de http üzerinden getUserMedia'u desteklemektedir.

RecorderJS kullanıyorum ve amaçlarına iyi hizmet ettim. İşte bir kod örneği. (source)

function RecordAudio(stream, cfg) { 

    var config = cfg || {}; 
    var bufferLen = config.bufferLen || 4096; 
    var numChannels = config.numChannels || 2; 
    this.context = stream.context; 
    var recordBuffers = []; 
    var recording = false; 
    this.node = (this.context.createScriptProcessor || 
    this.context.createJavaScriptNode).call(this.context, 
    bufferLen, numChannels, numChannels); 

    stream.connect(this.node); 
    this.node.connect(this.context.destination); 

    this.node.onaudioprocess = function(e) { 
    if (!recording) return; 
    for (var i = 0; i < numChannels; i++) { 
     if (!recordBuffers[i]) recordBuffers[i] = []; 
     recordBuffers[i].push.apply(recordBuffers[i], e.inputBuffer.getChannelData(i)); 
    } 
    } 

    this.getData = function() { 
    var tmp = recordBuffers; 
    recordBuffers = []; 
    return tmp; // returns an array of array containing data from various channels 
    }; 

    this.start() = function() { 
    recording = true; 
    }; 

    this.stop() = function() { 
    recording = false; 
    }; 
} 

kullanım basittir:

var recorder = new RecordAudio(userMedia); 
recorder.start(); 
recorder.stop(); 
var recordedData = recorder.getData() 

Düzenleme: Ayrıca hiçbir şey çalışırsa bu answer kontrol etmek isteyebilir.

2

getUserMedia() kullanımdan kaldırılmamış, kullanımdan kaldırılmış http üzerinden kullanılıyor. Şu anda getUserMedia() için https gerektiren tek tarayıcı, Chrome'un doğru bir yaklaşım olduğunu düşündüğüm nokta.

Testiniz için ssl/tls'u isterseniz, CloudFlare'in ücretsiz sürümünü kullanabilirsiniz.

Whatsapp sayfası herhangi bir kayıt işlevi sağlamaz, sadece uygulamayı başlatmanıza izin verir.

Good article about getUserMedia

Fully working example with use of MediaRecorder

8

Kaydedici JS senin için kolay bir iş yok. Web Audio API düğümleri

Chrome ile çalışır ve Firefox Tarayıcılar şimdi geliştirilmiştir. Sizin için ses kaydı yapan dahili bir MediaRecoder API'si var.

Krom desteğinden

navigator.mediaDevices.getUserMedia({audio:true}) 
    .then(stream => { 
     rec = new MediaRecorder(stream); 
     rec.ondataavailable = e => { 
      audioChunks.push(e.data); 
      if (rec.state == "inactive"){ 
       // Use blob to create a new Object URL and playback/download 
      } 
     } 
    }) 
    .catch(e=>console.log(e)); 

Çalışma demo

MediaRecoder destek başlar: 47

Firefox desteği: 25,0

İlgili konular