2009-06-02 15 views
14

मैं एक ऐसे एप्लिकेशन पर काम कर रहा हूं जिसमें ऑडियो फाइलों को संसाधित करना है। एमपी 3 फाइलों का उपयोग करते समय मुझे यकीन नहीं है कि डेटा को कैसे संभाला जाए (जिस डेटा में मुझे रूचि है वह ऑडियो बाइट्स है, जो कि हम जो सुनते हैं उसका प्रतिनिधित्व करते हैं)।एमपी 3 से ऑडियो डेटा कैसे प्राप्त करें?

यदि मैं एक WAV फ़ाइल का उपयोग कर रहा हूं, तो मुझे पता है कि मेरे पास 44 बाइट हेडर और फिर डेटा है। जब एमपी 3 की बात आती है, तो मैंने पढ़ा है कि वे फ्रेम द्वारा रचित हैं, प्रत्येक फ्रेम जिसमें हेडर और ऑडियो डेटा है। क्या एमपी 3 फ़ाइल से सभी ऑडियो डेटा प्राप्त करना संभव है?

मैं जावा का उपयोग कर रहा हूं (मैंने एमपी 3 एसपीआई, जेलेर और ट्राइटोनस जोड़ा है) और मैं फ़ाइल से बाइट प्राप्त करने में सक्षम हूं, लेकिन मुझे यकीन नहीं है कि इन बाइट्स का प्रतिनिधित्व करने या फिर कैसे संभालना है ।

उत्तर

26

documentation for MP3SPI से:

File file = new File(filename); 
AudioInputStream in= AudioSystem.getAudioInputStream(file); 
AudioInputStream din = null; 
AudioFormat baseFormat = in.getFormat(); 
AudioFormat decodedFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 
              baseFormat.getSampleRate(), 
              16, 
              baseFormat.getChannels(), 
              baseFormat.getChannels() * 2, 
              baseFormat.getSampleRate(), 
              false); 
din = AudioSystem.getAudioInputStream(decodedFormat, in); 

फिर आप सिर्फ din से डेटा पढ़ने - यह प्रति decodedFormat के रूप में "कच्चे" डेटा हो जाएगा। (अधिक जानकारी के लिए docs for AudioFormat देखें।)

(ध्यान दें कि यह नमूना कोड स्ट्रीम या ऐसा कुछ बंद नहीं होती है -। सामान्य रूप में उपयोग उचित ट्राई/अंत में ब्लॉक)

+0

हाय जॉन, आपके त्वरित उत्तर के लिए धन्यवाद! आपके प्रस्ताव में; अन्य प्रारूप में डीकोड किए गए एमपी 3 डेटा का प्रतिनिधित्व 'decodedFormat' है? अगर मैं "din.read()" लिखता हूं, तो क्या मैं डेटा डीट्स को डीकोडेड प्रारूप में प्राप्त कर रहा हूं? धन्यवाद – dedalo

+0

हां। उस डिकोडेड फोरमेट का कहना है, "मैं चाहता हूं कि आप हस्ताक्षरित पीसीएम डेटा के रूप में डीकोड करें"। –

+0

हाय। मैंने आपकी सलाह का पालन किया और यह काम किया। डेटा का विज़ुअलाइज़ करने के लिए मैं उपयोग करता हूं: जबकि ((numBytesRead = din.read (ऑडियोबाइट्स))! = -1) {} यह बाइट को 'din' में पढ़ता है और उन्हें सरणी ऑडियोबाइट्स में संग्रहीत करता है। मैंने डेटा का उपयोग करके डेटा विज़िज़िज़िन करने का प्रयास किया है: ((numBytesRead = din.read (ऑडियोबाइट्स))! = -1) { System.out.println ("बाइट डीकोडेड मान" + ऑडियोबाइट्स [0]);} मेरे पास इस डेटा के बारे में एक प्रश्न है: प्रत्येक नमूना 16 बिट्स का उपयोग करता है, जो सरणी ऑडियोबाइट्स में 2 पद है, rigth? मैं प्रत्येक नमूने का मूल्य कैसे प्राप्त कर सकता हूं? क्या डीकोडेड प्रारूप (WAV) में 44 हेडर बाइट हैं? आपकी मदद के लिए बहुत बहुत धन्यवाद! – dedalo

0

डेटा जो आप चाहते हैं वास्तविक नमूने, जबकि एमपी 3 डेटा का अलग-अलग प्रतिनिधित्व करता है। तो, जैसा कि हर किसी ने कहा है - आपको अपने उद्देश्य के लिए एमपी 3 डेटा को वास्तविक नमूनों में डीकोड करने के लिए लाइब्रेरी की आवश्यकता है।

0

जैसा कि अन्य उत्तरों में बताया गया है, आपको नियमित ऑडियो नमूने में एमपी 3 डीकोड करने के लिए एक डिकोडर चाहिए।

एक लोकप्रिय विकल्प JavaLayer (LGPL) होगा।