2016-07-19 94 views
6

canlı akış sesini alın 1 istemciden bir sunucuya birden çok dinleyici istemcisine gerçek zamanlı bir canlı ses akışım olması gerekir.NodeJS sunucusundan istemcilere

Şu anda istemciden gelen kaydı alıyorum ve sese socket.io üzerinden ses dosyasını sunucuya aktarıyorum. Sunucu bu verileri alır ve bu akışı dinlemek isteyen istemcilere sese (ayrıca socket.io? Aracılığıyla) akış vermelidir. Mümkün olduğu kadar gerçek zaman olmalıdır (gecikmeyi en aza indir).

Mikrofonu kaydetmek için GetUserMedia kullanıyorum (tarayıcı uyumluluğu burada önemli değil). İstemcilerin akışı dinlemek için HTML5 ses etiketi kullanmasını istiyorum. Sunucuda alınan veriler, tip ses/wav içeren bir blob içinde paketlenmiş (şu anda 700 paketlenmiş) parçalardır.

mediaRecorder.ondataavailable = function(e) { 
    this.chunks.push(e.data); 
    if (this.chunks.length >= 700) 
    { 
     this.sendData(this.chunks); 
     this.chunks = []; 
    } 
}; 
mediaRecorder.sendData = function(buffer) { 
    blob = new Blob(buffer, { 'type' : 'audio/wav' }); 
    socket.emit('voice', blob); 
} 

ben müşteriye böyle aynı şekilde parçalar göndermek mümkün değilim sunucuda:

Bu

benim kod sunucusuna göndermektir

socket.on('voice', function(blob) { 
    socket.broadcast.emit('voice', blob); 
}); 

Açık

var audio = document.createElement('audio'); 
socket.on('voice', function(arrayBuffer) { 
    var blob = new Blob([arrayBuffer], { 'type' : 'audio/wav' }); 
    audio.src = window.URL.createObjectURL(blob); 
    audio.play(); 
}); 

Bu gönderdiğim parçalar ilk damla çalışır ancak ke izin yok: istemci böyle bu oynayabilir ep, audio.src'ye yeni URL kaynağına geçerek bu yüzden çalışan bir çözüm değildir.

Sunucuda, dinleme istemcilerinde HTML5'in ses etiketine yerleştirebileceğim bir tür akış oluşturmam gerektiğini düşünüyorum, ancak nasıl olduğunu bilmiyorum. Toplanan bloklar gerçek zamanlı olarak bu akıma eklenmelidir.

Bunu yapmanın en iyi yolu nedir? İstemci mikrofondan sunucuya doğru yapıyorum?

Sen değişebilir
+0

Webrtc hakkında bir şeyler duyduysanız, o zaman webrtc eşler arası olduğu için sorun eksi sunucunuz için doğal bir çözümdür. –

+0

Biliyorum ama eşler arası olmayı istemiyorum ama bir sunucudan yayın istiyorum.Ses doensnt kayıt istemci yüzden –

+0

Sen WebRTC'de ait MCU mimari kullanılabilir yapmak için bir sunucu gereken tüm müşterilerine yayın yapma bant genişliği enought ama burada kapsam dışında sanırım. –

cevap

1

audiosrc dinamik (varsayarak mp3 tipi) aşağıdaki gibi:

<audio id="audio" controls="controls"> 
    <source id="mp3Source" type="audio/mp3"></source> 
     Your browser does not support the audio format. 
</audio> 

Çağrı aşağıdaki fonksiyon her, soket olayı alınırsa: Ben biraz geciktim

function updateSource() { 
     var audio = document.getElementById('audio'); 

     var source = document.getElementById('mp3Source'); 
     source.src= <blob>; 

     audio.load(); //call this to just preload the audio without playing 
     audio.play(); //call this to play the song right away 
    } 
1

Burada parti var ama daha önce bitirmediyseniz, web ses API'sinin arkadaşınız olduğu anlaşılıyor. Bir ses parçasına bağlayarak etrafta dalga geçmeden bir ses akışını doğrudan çıkış cihazına oynatmanıza izin verir.

Aynı şeyi yapmaya çalışıyorum ve sorunuza soru yanıtım geldi - istemciden sunucuya nasıl veri alınır. Web ses API'sinin yararı, akışları birbirine ekleme ve sunucuya ses efektleri uygulama becerisidir.

MDN Web Audio API

io olaylar ses bağlamda bir ses tamponu nesnesindeki verileri değiştirmek gerekir. Ses işleme, her istemci için tek bir akış olarak yayınlanmadan önce nodeJS web ses bağlamında gerçekleşebilir.