2012-07-18 27 views
48

के साथ शराब से ध्वनि कैप्चर करना मैंने परीक्षण उद्देश्यों के लिए एक छोटा जावा एप्लिकेशन लिखा है जो उबंटू 12.04 पर मिक्सर से ध्वनि कैप्चर करता है।TargetDataLine

कोड ठीक काम करता है, मैं शराब के नीचे चल रहे किसी भी चीज़ को छोड़कर सभी अनुप्रयोगों से ध्वनि कैप्चर कर सकता हूं।

जब भी मैं अपने कार्यक्रम शुरू, शुरू कर दिया शराब के बाद, targetDataLine.read() करने के लिए कॉल हमेशा के लिए अवरुद्ध कर देगा

जब शराब पृष्ठभूमि में नहीं चल रहा है, इसे सही ढंग से 0 आउटपुट जब कोई इनपुट, या बाइट की संख्या है अगर इनपुट हो, तो पढ़ें।

यदि मैं शराब शुरू करने से पहले अपना प्रोग्राम शुरू करता हूं, तो ध्वनि चालक शराब के भीतर उपलब्ध नहीं होगा।

मैंने अल्सा के साथ-साथ डिफॉल्ट डिवाइस, दोनों परिणाम प्रदान किए गए दोनों मिक्सर का उपयोग करने का प्रयास किया है।

मैं कल्पना कर सकता हूं कि शराब किसी भी तरह से अल्सा को लॉक करता है (किसी भी कारण से), लेकिन TargetDataLine.read() पर एक आसान कॉल क्यों शराब में असफल हो सकती है? mixerInfo[0] मेरे सिस्टम बीटीडब्ल्यू पर डिफ़ॉल्ट है, और आवेदन हमेशा ऑरैकल के नवीनतम जेआरई (7) का उपयोग करके शराब के बाहर चल रहा है।

private void readSound() 
{ 
    byte tempBuffer[] = new byte[10000]; 
    int cnt = 0; 
    Mixer.Info[] mixerInfo = AudioSystem.getMixerInfo(); 

    System.out.println("Available mixers:"); 
    for (int p = 0; p < mixerInfo.length; p++) 
     System.out.println(mixerInfo[p].getName()); 

    format = getAudioFormat(); 
    DataLine.Info dataLineInfo = new DataLine.Info(TargetDataLine.class, format); 
    Mixer mixer = AudioSystem.getMixer(mixerInfo[0]); 

    try 
    { 
     targetDataLine = (TargetDataLine) mixer.getLine(dataLineInfo); 
     targetDataLine.open(format); 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
    targetDataLine.start(); 

    while (true) 
    { 
     i++; 
     cnt = targetDataLine.read(tempBuffer, 0, tempBuffer.length); 
     System.out.println("read " + cnt + " bytes:" + tempBuffer[i]);    
     calculateLevel(tempBuffer, 0, 200); 
     targetDataLine.flush(); 
     System.out.println(level); 
    } 
} 
+2

क्या आप पोस्ट में, दोनों स्थितियों में कार्यक्रम के आउटपुट, शराब चलने पर, और जब शराब नहीं चल रहा है, तो कृपया प्रदान कर सकते हैं। –

+0

मुझे लगता है कि डेटालाइन :: का उपयोग करना ब्लॉकिंग के साथ मदद कर सकता है। – IceGlow

+2

यह देखने के लिए शराब की कॉन्फ़िगरेशन जांचें कि यह ऑडियो तक कैसे पहुंचता है। http://askubuntu.com/questions/77210/how-to-change-the-default-audio-in-wine-to-alsa- केवल – IceGlow

उत्तर

1

AudioSystem.write() विधि का उपयोग करें। यह बहुत आसान है

targetDataLine.open(format); 
targetDataLine.start(); 
AudioInputStream ais=new AudioInputStream(targetDataLine); 
AudioFileFormat.Type fileformat=AudioFileFormat.Type.WAVE; 
/* 
Other Audio file formats supported: 
AudioFileFormat.Type.AU 
AudioFileFormat.Type.AIFF 
AudioFileFormat.Type.AIFC 
AudioFileFormat.Type.SND 
*/ 
File audoutputfile=new File('myfile'); 
//adjust extension according to AudioFileFormat 
AudioSystem.write(ais,fileformat, audoutputfile); 
+0

ओह। मैंने अभी प्रश्न की तारीख देखी है ... –