2015-09-10 7 views
5

में चलाएं मेरे उद्देश्य के लिए, मैं कच्चे प्रारूप (केवल नमूने), 8kHz, 16 बिट (थोड़ा एंडियन) और 1 चैनल में ध्वनि रिकॉर्ड करना चाहता हूं। फिर, मैं उन नमूनों को खिड़कियों में स्थानांतरित करना चाहता हूं और इसे QAudioOutput के साथ खेलना चाहता हूं। तो मेरे पास दो अलग-अलग प्रोग्राम हैं: QAudioInput के साथ आवाज रिकॉर्ड करने के लिए, और दूसरा एक फ़ाइल देता है जिसमें कुछ नमूने होते हैं, फिर मैं इसे QAudioOutput के साथ चलाता हूं। QAudioInput और QAudioOutput बनाने के लिए नीचे मेरा स्रोत कोड है।QAudioInput के साथ लिनक्स में रिकॉर्ड करें और इसे विंडोज

//Initialize audio 
void AudioBuffer::initializeAudio() 
{ 
    m_format.setFrequency(8000); //set frequency to 8000 
    m_format.setChannels(1); //set channels to mono 
    m_format.setSampleSize(16); //set sample sze to 16 bit 
    m_format.setSampleType(QAudioFormat::UnSignedInt); //Sample type as usigned integer sample 
    m_format.setByteOrder(QAudioFormat::LittleEndian); //Byte order 
    m_format.setCodec("audio/pcm"); //set codec as simple audio/pcm 

    QAudioDeviceInfo infoIn(QAudioDeviceInfo::defaultInputDevice()); 
    if (!infoIn.isFormatSupported(m_format)) 
    { 
     //Default format not supported - trying to use nearest 
     m_format = infoIn.nearestFormat(m_format); 
    } 

    QAudioDeviceInfo infoOut(QAudioDeviceInfo::defaultOutputDevice()); 

    if (!infoOut.isFormatSupported(m_format)) 
    { 
    //Default format not supported - trying to use nearest 
    m_format = infoOut.nearestFormat(m_format); 
    } 
    createAudioInput(); 
    createAudioOutput(); 
} 

void AudioBuffer::createAudioOutput() 
{ 
    m_audioOutput = new QAudioOutput(m_Outputdevice, m_format, this); 
} 

void AudioBuffer::createAudioInput() 
{ 
    if (m_input != 0) { 
    disconnect(m_input, 0, this, 0); 
    m_input = 0; 
    } 

    m_audioInput = new QAudioInput(m_Inputdevice, m_format, this); 

} 

ये प्रोग्राम अलग-अलग विंडोज़ और लिनक्स में अच्छी तरह से काम करते हैं। हालांकि, जब मैं लिनक्स में एक आवाज रिकॉर्ड करता हूं और इसे विंडोज़ में चलाता हूं तो इसमें बहुत शोर होता है।

मुझे लगता है कि खिड़कियों और लिनक्स में कब्जे वाले नमूने अलग हैं। पहली तस्वीर लिनक्स में कैप्चर की गई ध्वनि से जुड़ी है और विंडोज़ के लिए दूसरा है। लिनक्स में

कब्जा कर लिया ध्वनि: विंडोज में captured sound in Linux

कब्जा कर लिया ध्वनि: captured sound in Windows

एक थोड़ा और अधिक विवरण पर कि विंडोज और लिनक्स में चुप्पी अलग है। मैंने बाइट्स को स्वैप करने सहित कई चीजों की कोशिश की, भले ही मैंने दोनों प्लेटफार्मों में थोड़ा एंडियन सेट किया हो।

अब, मुझे अल्सा कॉन्फ़िगरेशन के बारे में संदेह है। क्या कोई चूक गई सेटिंग्स हैं?

क्या आपको लगता है कि अगर मैं QAudioInput का उपयोग किए बिना सीधे आवाज रिकॉर्ड करता हूं तो बेहतर होगा?

+0

क्या आप दोनों मामलों में 'isFormatSupported' सच देख सकते हैं? – UmNyobe

+0

दोनों इनपुट और आउट सत्य हैं! – Ari

+0

'निकटतमफॉर्मैट' कोड की गणना करने वाली दोनों पंक्तियों को निकालें और इसके बजाय 'abort() 'डालें, फिर लिनक्स पर एक नई फ़ाइल रिकॉर्ड करें, फ़ाइल को विंडोज़ पर ले जाएं, और फिर से प्रयास करें। सुनिश्चित करें कि आप लागू परिवर्तन के साथ दोनों पर ताजा निर्माण का उपयोग करें, और आप लिनक्स मशीन से स्थानांतरित नई कैप्चर की गई फ़ाइल चला रहे हैं। –

उत्तर

3

आवाज UnSignedInt है, लेकिन नमूना मान में नकारात्मक और सकारात्मक दोनों मूल्य हैं! ऐसा लगता है कि आपको कैप्चरिंग में परेशानी थी। QAudioFormat::UnSignedInt से QAudioFormat::SignedInt बदलें।

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