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));
});
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
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? –
@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