2012-01-03 6 views
7

द्वारा पीसीएम डेटा चलाएं हाय मैं वेबऑडियो एपीआई पर काम कर रहा हूं। मैंने HTML5 Web Audio API, porting from javax.sound and getting distortion लिंक पढ़ा लेकिन जावा एपीआई में अच्छी गुणवत्ता नहीं मिली। मुझे सर्वर से पीसीएम डेटा हस्ताक्षरित बाइट्स में मिल रहा है। तो मुझे इसे 16 बिट प्रारूप में बदलना होगा। बदलने के लिए मैं उपयोग कर रहा हूं (firstbyte < < 8 | secondbyte) लेकिन मुझे ध्वनि की अच्छी गुणवत्ता प्राप्त करने में सक्षम नहीं है। क्या ध्वनि में अच्छी गुणवत्ता प्राप्त करने के लिए रूपांतरण या किसी अन्य तरीके से कोई समस्या है?वेबऑडियो एपीआई

+1

कोड स्निपेट हमेशा सहायक होते हैं। – ebidel

+0

क्या कोई मुझे बता सकता है कि हस्ताक्षर बाइट सरणी को Float32Array में कैसे परिवर्तित करें? – user894554

+0

इसे अपनाने के लिए बहुत गर्व नहीं है, लेकिन यह एक अच्छा सवाल है, क्योंकि आधिकारिक दस्तावेज प्ले पीसीएम भाग को छोड़ देता है, जो प्रत्यक्ष कार्य होगा, और डीकोडऑडियोियोटा() पर केंद्रित होगा, जो अधिक 'सहायक' है। –

उत्तर

4

वेब ऑडियो एपीआई -1-1 से 32-बिट हस्ताक्षरित फ्लोट का उपयोग करता है, इसलिए मैं जो कुछ भी करने जा रहा हूं (उम्मीद है) आपको 16-बिट के बजाय, प्रश्न में उल्लिखित करने के लिए कैसे दिखा रहा है।

नमूनों की अपने सरणी मान लिया जाये कि samples कहा जाता है और -128 127 से 2 की तारीफ के रूप में जमा हो जाती है, मुझे लगता है कि यह काम करना चाहिए:

var floats = new Float32Array(samples.length); 
samples.forEach(function(sample, i) { 
    floats[i] = sample < 0 ? sample/0x80 : sample/0x7F; 
}); 

तो फिर तुम कुछ इस तरह कर सकते हैं:

var ac = new webkitAudioContext() 
    , ab = ac.createBuffer(1, floats.length, ac.sampleRate) 
    , bs = ac.createBufferSource(); 
ab.getChannelData(0).set(floats); 
bs.buffer = ab; 
bs.connect(ac.destination); 
bs.start(0); 
+0

मुझे लगता है कि आप "bs.buffer = ab;" गायब हैं – CpnCrunch