2015-06-20 29 views
6

Tôi đang cố gắng tạo cuộc trò chuyện thoại theo thời gian thực. một khi một khách hàng đang nắm giữ một nút và các cuộc đàm phán, tôi muốn âm thanh được gửi qua socket đến backend nodejs, sau đó tôi muốn truyền dữ liệu này đến một máy khách khác.Tôi có thể truyền trực tiếp âm thanh micrô từ máy khách đến ứng dụng khách bằng nút không?

đây là mã gửi khách hàng:

socket.on('connect', function() { 
     var session = { 
      audio: true, 
      video: false 
     }; 

     navigator.getUserMedia(session, function(stream){ 
      var audioInput = context.createMediaStreamSource(stream); 
      var bufferSize = 2048; 

      recorder = context.createScriptProcessor(bufferSize, 1, 1); 

      recorder.onaudioprocess = onAudio; 

      audioInput.connect(recorder); 

      recorder.connect(context.destination); 

     },function(e){ 

     }); 

     function onAudio(e) { 

      if(!broadcast) return; 

      var mic = e.inputBuffer.getChannelData(0); 

      var converted = convertFloat32ToInt16(mic); 

      socket.emit('broadcast', converted); 
     } 

    }); 

Máy chủ sau đó được đệm này và chuyển nó đến các khách hàng khác (trong ví dụ này, khách hàng giống nhau)

Máy chủ Mã

socket.on('broadcast', function(buffer) { 
    socket.emit('broadcast', new Int16Array(buffer)); 
}); 

Và sau đó, để phát âm thanh ở phía bên kia (người nhận), mã khách hàng giống như:

socket.on('broadcast', function(raw) { 

     var buffer = convertInt16ToFloat32(raw); 

     var src = context.createBufferSource(); 
     var audioBuffer = context.createBuffer(1, buffer.byteLength, context.sampleRate); 

     audioBuffer.getChannelData(0).set(buffer); 

     src.buffer = audioBuffer; 

     src.connect(context.destination); 

     src.start(0); 
    }); 

Kết quả mong đợi của tôi là âm thanh từ máy khách A sẽ được nghe trong ứng dụng khách B, tôi có thể thấy bộ đệm trên máy chủ, tôi có thể xem bộ đệm trong máy khách nhưng tôi không nghe thấy gì. Tôi biết socket.io 1.x hỗ trợ dữ liệu nhị phân nhưng tôi không thể tìm thấy ví dụ nào về trò chuyện thoại, tôi cũng đã thử sử dụng BinaryJS nhưng kết quả cũng giống nhau, ngoài ra, tôi biết rằng với WebRTC, đây là một nhiệm vụ đơn giản nhưng tôi không muốn sử dụng WebRTC, bất cứ ai có thể chỉ cho tôi một tài nguyên tốt hay cho tôi biết tôi đang thiếu gì?

Trả lời

7

Tôi tự xây dựng thứ gì đó như thế này vài tuần trước. Vấn đề tôi chạy vào (bạn sẽ tại một số điểm):

  • Để dữ liệu nhiều mà không làm giảm tốc độ bit và samplerate (trên internet)
  • quallity âm thanh xấu mà không suy hoặc một nén âm thanh tốt hơn
  • Thậm chí nếu không muốn nói nó được hiển thị cho bạn, bạn sẽ nhận được các mẫu khác nhau từ các thẻ âm thanh máy tính khác nhau (PC = 48kHz, Máy tính xách tay = 32Khz) có nghĩa là bạn phải viết một bộ lấy mẫu lại
  • Websocket là TCP: mọi gói âm thanh sẽ đạt được mục tiêu, nhưng nếu bạn có điều kiện xấu, bạn nhận được các gói dữ liệu cùng lúc hoặc theo thứ tự khác nhau. (U phải sử dụng proxy máy khách UDP trên mỗi máy khách nếu bạn muốn UDP)
  • Trong WebRTC, chúng sẽ giảm quallity âm thanh nếu phát hiện thấy kết nối internet kém. Bạn không thể làm điều này bởi vì đây là thứ cấp thấp!
  • Bạn cần phải thực hiện điều này một cách nhanh chóng bởi vì JS sẽ chặn frontent của bạn nếu không muốn nói> webworkers sử dụng
  • âm thanh codex dịch sang JS rất chậm và bạn sẽ nhận được kết quả bất ngờ (xem một câu hỏi audiocodex từ tôi: here) Tôi cũng đã thử Opus nhưng chưa có kết quả tốt.

Tôi không làm việc trên dự án này vào lúc này nhưng bạn có thể lấy mã tại địa chỉ: https://github.com/cracker0dks/nodeJsVoip

và ví dụ làm việc: (liên kết loại bỏ) cho đa âm thanh sử dụng voip. (Không hoạt động nữa! Máy chủ web bị lỗi!) Nếu bạn đi vào cài đặt> âm thanh (trên trang), bạn có thể chọn bit cao hơn và lấy mẫu để có âm thanh tốt hơn.

EDIT: Bạn có thể cho tôi biết lý do tại sao bạn không muốn sử dụng WebRTC không?

+0

Cảm ơn bạn rất nhiều vì câu trả lời thông tin này.Lý do tôi không muốn sử dụng webrtc: đầu tiên tôi phải sử dụng STUN và TURN dịch vụ để làm cho nó hoạt động trên internet và thứ hai, nói rằng bạn muốn một khách hàng để phát sóng cho 10 người dùng nó có nghĩa là 10 kết nối ngang hàng, hơn khách hàng trong cuộc trò chuyện, các kết nối ngang hàng hơn mà mỗi khách hàng cần thiết lập – udidu

+0

vâng bạn cần các máy chủ STUN và TURN nhưng bạn sẽ tìm thấy nhiều máy chủ mà bạn có thể sử dụng hoặc lưu trữ một số máy chủ của mình (https://code.google.com/p/ rfc5766-turn-server /). Đối với các vấn đề many2many bạn có thể có một cái nhìn cho phần mềm được gọi là: MCU. MCU tốt nhất cho WebRTC (mã nguồn mở) tại thời điểm này là Licode: http://lynckia.com/licode/ tôi nghĩ (và sử dụng), nhưng bạn cũng có thể xem tại: http://www.kurento.org/và TelePresence: https://code.google.com/p/telepresence/ – Cracker0dks

Các vấn đề liên quan