2012-01-06 11 views
17

मुझे वेबसॉकेट के माध्यम से node.js और socket.io के साथ एमपी 3 डेटा स्ट्रीम करने में समस्याएं हैं। सब कुछ काम करने लगता है लेकिन decodeAudioData मेरे साथ उचित नहीं खेलता है।वेबसाकेट्स के माध्यम से node.js और socket.io के साथ एमपी 3 डेटा स्ट्रीम कैसे करें?

यह मेरा खिलौना सर्वर है:

var app = require('http').createServer(handler) 
    , io = require('socket.io').listen(app) 
    , fs = require('fs') 

app.listen(8081); 

function handler (req, res) { 
    res.writeHead(200, { 
     'Content-Type': 'text/html', 
    }); 
    res.end('Hello, world!'); 
} 

io.configure('development', function() { 
    io.set('log level', 1); 

    io.set('transports', [ 'websocket' ]); 
}); 

io.sockets.on('connection', function (socket) { 
    console.log('connection established'); 

    var readStream = fs.createReadStream("test.mp3", 
             {'flags': 'r', 
              'encoding': 'binary', 
              'mode': 0666, 
              'bufferSize': 64 * 1024}); 
    readStream.on('data', function(data) { 
     console.log(typeof data); 
     console.log('sending chunk of data') 
     socket.send(data); 
    }); 

    socket.on('disconnect', function() { 
     console.log('connection droped'); 
    }); 
}); 

console.log('Server running at http://127.0.0.1:8081/'); 

ग्राहक प्रकार स्ट्रिंग के रूप में डेटा प्राप्त लेकिन मैं decodeAudioData करने के लिए डेटा को खिलाने के लिए चाहते हैं और यह यह तार पसंद नहीं करता है लगता है। decodeAudioData करने के लिए कॉल निम्न त्रुटि संदेश में परिणाम:

Uncaught Error: SYNTAX_ERR: DOM Exception 12 

मुझे लगता है कि decodeAudioData एक ArrayBuffer में संग्रहीत डेटा की जरूरत है। क्या डेटा को बदलने का कोई तरीका है? ,

<script src="http://127.0.0.1:8081/socket.io/socket.io.js"></script> 
<script> 
    var audioBuffer = null; 
    var context = null; 
    window.addEventListener('load', init, false); 
    function init() { 
     try { 
      context = new webkitAudioContext(); 
     } catch(e) { 
      alert('Web Audio API is not supported in this browser'); 
     } 
    } 

    function decodeHandler(buffer) { 
     console.log(data); 
    } 

    var socket = io.connect('http://127.0.0.1:8081'); 
    socket.on('message', function (data) { 
      // HERE IS THE PROBLEM 
     context.decodeAudioData(data, decodeHandler, function(e) { console.log(e); }); 
    }); 
</script> 
+0

आप इस समस्या का समाधान मिल गया है? – codeAnand

+0

मुझे सॉकेट.io का उपयोग करके कोई समाधान नहीं मिला है। Socket.io के बिना समाधान के लिए अपना स्वयं का जवाब देखें। –

+0

सॉकेट.io 1.0 में बाइनरी के लिए समर्थन है, मैं कोशिश करता हूं लेकिन काम नहीं करता है। इसके अलावा मैं websocket के साथ कोशिश करता हूं, लेकिन बिल्कुल एक ही त्रुटि के साथ। आपके पास इसका उदाहरण है कि आप इसे कैसे हल करते हैं? – cmarrero01

उत्तर

10

मैं अपने आप को WebSockets के माध्यम से एमपी 3 डेटा स्ट्रीम करने के लिए एक रास्ता मिल गया है।

एक समस्या एमपी 3 डेटा का हिस्सा आकार था। ऐसा लगता है कि वेब ऑडियो एपीआई को डेटा को डीकोड करने में सक्षम होने के लिए वैध एमपी 3 भाग के साथ खिलाया जाना चाहिए। शायद आश्चर्य की बात नहीं है। मेरे डेमो ऐप में मैं एमपी 3 खंड फ़ाइलों का एक सेट प्रदान करता हूं।

ऑडियो की गुणवत्ता भी सही नहीं है। मेरे पास कुछ सूक्ष्म ग्लिच हैं। मैं एमपी 3 डेटा के बड़े हिस्से भेजकर इसे सुधारने में सक्षम था लेकिन अभी भी छोटे क्रैकल हैं।

संपादित करें: मैं ऑडियो गुणवत्ता में सुधार करने में कामयाब रहा। ऐसा लगता है कि वेब ऑडियो विधि decodeAudioData वास्तव में एमपी 3 डेटा के निरंतर भाग को डीकोड करने के लिए डिज़ाइन नहीं किया गया है।

+0

वह लिंक टूटा हुआ है। – ma11hew28

+1

'मान्य एमपी 3 भाग' के संबंध में http://stackoverflow.com/a/13315068/612262 देखें। – biril

+8

क्या आप अपना समाधान पोस्ट कर सकते हैं? मैं वेबसाईट पर एमपी 3 डेटा स्ट्रीम करने की भी कोशिश कर रहा हूं। – Light

3

आपके मामले में context.decodeAudioData बाइनरी डेटा के ArrayBuffer उम्मीद मैं के लिए एक ArrayBuffer क्लाइंट साइड करने के लिए एक बेस 64 स्ट्रिंग के लिए अपने हिस्सा परिवर्तित, तो सुझाव है:

इस ग्राहक कोड है सबसे अनुमानित परिणाम। This script खंडित डेटा के बेस 64 से क्लाइंट-साइड डीकोड के लिए एक अच्छा प्रारंभिक बिंदु होना चाहिए।

सही अपने डेटा (आधार -64 एन्कोडेड स्ट्रिंग) प्राप्त करने के बाद चाल करना होगा data = Base64Binary.decodeArrayBuffer(data); के साथ एक लाइन जोड़ रहा है ...

+0

आपके उत्तर के लिए धन्यवाद लेकिन मैं इसे स्क्रिप्ट के साथ काम नहीं कर सकता। परिणामस्वरूप ऐरेबफर यह होना चाहिए जितना लंबा होना चाहिए। मैं इसके ऊपरी हिस्से के कारण बेस 64 से बचना चाहता हूं। मुझे लगता है कि मुझे खुद का समाधान मिला है। मैं इसे जल्द ही यहां पोस्ट करने जा रहा हूं। –

+1

@ फेयर डिनकम थिंकम मैं आपका समाधान जानना चाहता हूं। – fyasar

+0

@fyasar मेरा समाधान socket.io के बजाय 'ws' मॉड्यूल का उपयोग करना था। उस समय socket.io बाइनरी डेटा को संभालने में सक्षम नहीं था। यकीन नहीं है कि यह अभी भी मामला है। –

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