2015-12-05 34 views
9

Tôi mới sử dụng dữ liệu nhị phân và getUserMedia, cách nào được đề xuất để truyền getUserMedia (video/audio) đến máy chủ và sau đó chuẩn bị luồng (video/âm thanh) cho các kết nối khác?streaming getUserMedia đến máy chủ

suy nghĩ ban đầu của tôi là để gửi dữ liệu qua WebSockets và sau đó ghi dữ liệu vào một tập tin (mp4) như thế này:

getUserMedia -->(websockets)--> server -->(file.mp4)--> video.src.

Tôi đã nhìn vào MediaStreamRecorder và tôi có thể gửi một bộ đệm như vậy:

multiStreamRecorder.ondataavailable = function (blobs) { 
    socket.emit('blobs', blobs) 
}; 

trên máy chủ tôi nhận được

{ audio: <Buffer 52 49 46 46 2c 10 04 00 57 41 56 45 66 6d 74 20 10 00 00 00 01 00 01 00 44 ac 00 00 10 b1 02 00 02 00 10 00 64 61 74 61 00 10 04 00 f8 ff 04 00 0d 00 ... >, 
    video: <Buffer 1a 45 df a3 40 20 42 86 81 01 42 f7 81 01 42 f2 81 04 42 f3 81 08 42 82 40 04 77 65 62 6d 42 87 81 02 42 85 81 02 18 53 80 67 10 0a 41 54 15 49 a9 66 ... >, 
    onDataAvailableEventFired: true } 

Bây giờ tôi nghĩ rằng tôi nên viết những dòng này vào một tập tin, phục vụ tập tin đó và sau đó yêu cầu tập tin đó từ nguồn của một phần tử video .. Nếu đó là tất cả chính xác làm thế nào tôi sẽ đi về việc viết các tập tin vào hệ thống tập tin? hay tôi đang làm gì sai?

Tôi hiểu WebRTC có chức năng p2p, tôi sẽ phân phối luồng video tới ~ 50 khách hàng trở lên nên không phải là tùy chọn.

Cập nhật với giải pháp WebSocket:

Tôi bây giờ phát ra các dữ liệu trở lại trên WebSockets như vậy:

socket.on('blobs', function(data){ 
    socket.emit('blobs', data) 
}) 

và trên các mặt hàng đẩy nó vào một mediaSource và sau đó một yếu tố video với số timestampOffset để giữ cho hình ảnh mượt mà.

var mediaSource = new MediaSource(), 
    mediaBuffer, 
    // init duration of 0 seems fine 
    duration = 0; 

var video = $('video').get(0); 
video.src = window.URL.createObjectURL(mediaSource); 

mediaSource.addEventListener('sourceopen', function(e) { 
    mediaBuffer = mediaSource.addSourceBuffer('video/webm; codecs="vp8"') 
    mediaBuffer.addEventListener('update', function() { 
     // wait for mediaBuffer update to fire before setting the new duration 
     duration = video.duration 
    }); 
}, false); 

socket.on('blobs', function (data) { 
    mediaBuffer.timestampOffset = duration; 
    mediaBuffer.appendBuffer(new Uint8Array(data.video)); 
}); 
+0

Tôi đã tìm thấy câu hỏi này trong khi tìm kiếm giải pháp bằng cách sử dụng [API MediaRecorder] (https://www.w3.org/TR/mediastream-recording/#MediaRecorderAPI) thay vì thư viện MediaStreamRecorder. Có một [câu trả lời hay trong câu hỏi khác] (http://stackoverflow.com/a/27821586/3256574) – marcw

+0

Và điều gì về kịch bản server.js cách xử lý việc lắng nghe một cổng, tôi có cần script phía máy chủ không? –

+1

@ASahra giải pháp đã được cung cấp cho phía máy chủ. OP chỉ sử dụng 'socket.on ('blobs', hàm (data) {socket.emit ('blobs', data)})' để gửi luồng tới những người dùng khác, chỉ cần sử dụng nó một cách hiệu quả như là 1: 1 . – zillaofthegods

Trả lời

5

Để làm cho công việc này hoạt động bình thường, bạn cũng cần máy chủ "nói" WebRTC. Sử dụng websockets sẽ không cung cấp cho bạn kết quả mong muốn và sẽ không đáp ứng như WebRTC - nó sẽ không phải là thời gian thực.

Để chạy WebRTC trên máy chủ, bạn có thể sử dụng ngăn xếp WebRTC tại webrtc.org hoặc OpenWebRTC làm điểm bắt đầu, sử dụng GStreamer hoặc hoàn tất công việc. Dự án tốt của khung máy chủ phương tiện cho WebRTC để bắt đầu là Kurento, JitsiJanus.

Do tính chất của câu hỏi của bạn, đề xuất của tôi là bắt đầu với một trong các khuôn khổ máy chủ phương tiện hoàn chỉnh hơn được đề cập ở trên.

+0

Cảm ơn bạn, tôi nghĩ Janus sẽ làm việc khá tốt cho nhu cầu của tôi mặc dù bây giờ tôi đã tìm ra một giải pháp khá tốt đẹp bằng cách sử dụng websockets (thêm vào câu hỏi). – brod

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