2015-12-05 11 views
9

मैं बाइनरी डेटा के लिए नया हूं और यूज़र मीडिया प्राप्त करता हूं, सर्वर पर getUserMedia (वीडियो/ऑडियो) स्ट्रीम करने के लिए अनुशंसित तरीका क्या होगा और फिर अन्य कनेक्शन के लिए स्ट्रीम (वीडियो/ऑडियो) तैयार करेगा?स्ट्रीमिंग getUserMedia सर्वर पर

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

मेरे प्रारंभिक सोचा एक फ़ाइल (MP4) इस तरह के डेटा WebSockets पर डेटा भेजने और फिर लिखने के लिए किया गया था।

मैं MediaStreamRecorder को देखकर किया गया है और मैं बहुत की तरह एक बफर भेज सकते हैं:

multiStreamRecorder.ondataavailable = function (blobs) { 
    socket.emit('blobs', blobs) 
}; 
सर्वर पर

मैं

{ 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 } 

अब मुझे लगता है कि मैं एक फ़ाइल को यह लिखना चाहिए मिलता है, उस फ़ाइल को सेवा दें और उसके बाद उस फ़ाइल को video तत्व के स्रोत से अनुरोध करें .. यदि यह सही है तो मैं फ़ाइल सिस्टम में फ़ाइल लिखने के बारे में कैसे जाऊं? या मुझ से कुछ गलत हो रहा है?

मुझे समझ में आता है कि वेबआरटीसी में पी 2 पी कार्यक्षमता है, मैं वीडियो स्ट्रीम को ~ 50 या अधिक क्लाइंट्स की सेवा कर रहा हूं, इसलिए यह कोई विकल्प नहीं है। WebSocket समाधान के साथ

अद्यतन:

मैं अभी की तरह WebSockets में वापस डेटा उत्सर्जक हूँ:

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

और क्लाइंट साइड एक mediaSource और फिर एक video तत्व में धकेलने पर इसे चिकनी रखने के लिए timestampOffset के साथ।

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

MediaStreamRecorder लाइब्रेरी के बजाय [MediaRecorder API] (https://www.w3.org/TR/mediastream-recording/#MediaRecorderAPI) का उपयोग करके समाधान ढूंढते समय मुझे यह प्रश्न मिला। एक अन्य प्रश्न में एक अच्छा जवाब है [http://stackoverflow.com/a/27821586/3256574) – marcw

+0

और server.js स्क्रिप्ट के बारे में क्या एक बंदरगाह को सुनकर संभाला गया कृपया मुझे सर्वर साइड स्क्रिप्ट चाहिए? –

+1

@ASahra समाधान सर्वर पक्ष के लिए पहले से ही प्रदान किया गया है। ओपी सिर्फ 'socket.on (' blobs ', फ़ंक्शन (डेटा) {socket.emit (' blobs ', डेटा)} का उपयोग कर रहा है)' अन्य उपयोगकर्ताओं को स्ट्रीम भेजने के लिए, प्रभावी ढंग से इसे 1: 1 स्थानांतरण के रूप में उपयोग करने के लिए । – zillaofthegods

उत्तर

5

यह काम ठीक से करने के लिए, आपको सर्वर को "वेब" भी बोलने की आवश्यकता है। Websockets का उपयोग करने से आपको वांछित परिणाम नहीं मिलेगा और वेबआरटीसी के रूप में उत्तरदायी नहीं होगा - यह वास्तविक समय नहीं होगा।

प्राप्त करने के लिए WebRTC एक सर्वर पर चल रहा है, तो आप WebRTC ढेर webrtc.org या OpenWebRTC पर एक प्रारंभिक बिंदु के रूप में उपयोग कर सकते हैं GStreamer का उपयोग करें या कुछ में थोड़ा और अधिक पूरा करने के लिए जाना। WebRTC से शुरू होने के लिए मीडिया सर्वर फ्रेमवर्क की अच्छी परियोजनाएं Kurento, Jitsi और Janus हैं।

आपके प्रश्न की प्रकृति के कारण, मेरा सुझाव उपरोक्त वर्णित एक और पूर्ण मीडिया सर्वर ढांचे में से एक के साथ शुरू करना है।

+0

धन्यवाद दोस्त, मुझे लगता है कि जेनस मेरी ज़रूरतों के लिए काफी अच्छा काम करेगा हालांकि अब मैंने websockets (प्रश्न में जोड़ा गया) का उपयोग करके एक बहुत अच्छा समाधान निकाला है। – brod

संबंधित मुद्दे