2012-03-12 14 views
6

मैं निम्नलिखित कोड का टुकड़ा के साथ एक संदेह हो रहा है के विभिन्न नंबर देने ...QAudioInput :: byteReady() और QIODevice :: पढ़ें() बाइट्स

const qint64 bytesReady = m_audioInput->bytesReady(); 
const qint64 bytesSpace = m_buffer.size() - m_dataLength; 
const qint64 bytesToRead = qMin(bytesReady, bytesSpace); 
const qint64 bytesRead = m_audioInputIODevice->read(m_buffer.data() + m_dataLength, bytesToRead); 

bytesReady() विधि मुझे का एक विशेष नंबर दे रहा है बाइट्स और QIODevice के पढ़ने() में इन बाइट्स की संख्या को पास कर रहा हूं जो मुझे बाइट्स पढ़ने की संख्या वापस कर देगा।

समस्या यह है कि बाइट्स रीड बाइट्स के बराबर नहीं है। और मुझे रीड विधि i.e 320, 640, 960, 1280, आदि से बाइट्स की निश्चित संख्या मिल रही है और यह byteToRead पर निर्भर करता है।

+0

क्या आप इसे लूप में आजमा सकते हैं? यानी 'जबकि (बाइट्स रीडी = m_audioInput-> बाइट्स रीडी()> 0) {...}' और बताएं कि क्या होता है? आपने QAudioFormat को उपयोग में कैसे शुरू किया? क्या आपने यह सुनिश्चित किया है कि 'QAudioDeviceInfo :: isFormat समर्थित() 'सच है ?? – UmNyobe

+0

सब ठीक काम करता है समस्या उपर्युक्त कोड स्निपेट के साथ है ... असल में कोई समस्या नहीं है लेकिन संदेह है क्योंकि मेरा कोड सफलतापूर्वक चल रहा है .. – shofee

+0

कृपया उत्तर दें ... – shofee

उत्तर

7

QAudioInput::bytesReady() और QIODevice के बीच कोई सीधा संबंध नहीं है जिस पर यह इसके नमूने लिख रहा है।

QAudioInput ऑडियो सिस्टम में आंतरिक रूप से एक आईओ डिवाइस (सिस्टम निर्भर) को बनाए रखता है, जो केवल पढ़ने के लिए QIODevice के अनुरूप है। जब आप bytesReady पर कॉल करते हैं, तो यह QIODevice::bytesAvailable() पर एनालॉग पढ़ने के लिए उपलब्ध बाइट्स की संख्या देता है। जिनके पास आउटपुट QIODevice आउटपुट पर अभी तक लिखे गए हैं, इसलिए जब आप m_audioInputIODevice->read करते हैं तो इसके बाद, प्रोजेक्ट प्रोसेस किए बिना, आप वास्तव में नमूने प्राप्त कर रहे हैं जो पहले ही लिखा गया है, न कि अभी भी ऑडियो बफर में।

यह, साथ ही IODevice का बफरिंग, बताता है कि संख्याएं अलग क्यों हो सकती हैं, और मुझे उन्हें एक साथ सिंक्रनाइज़ करने का कोई तरीका नहीं दिख रहा है।

असल में, आप क्या करना चाहिए:

const qint64 bytesRead = m_audioInputIODevice->read(m_buffer.data() + m_dataLength, bytesSpace); 

जो भी आपके उपलब्ध बफर अंतरिक्ष करने के लिए, IODevice से उपलब्ध है पाने के लिए।

+0

क्या आप कुछ और विवरण प्रदान कर सकते हैं .... – shofee

+0

किस पहलू के बारे में? इस बारे में – Koying

+0

..."जब आप बाइट्स रीडी कहते हैं, QAudioInput ने अभी तक IODevice में नमूने नहीं लिखे हैं, इसलिए जब आप m_audioInputIODevice-> पढ़ते हैं, तो आप वास्तव में पुराने नमूने प्राप्त कर रहे हैं।" – shofee

2

अभी तक बेहतर:

उपयोग ->readAll() जो एक QByteArray "QBA"

रिटर्न ... तो sz=qba.size() का उपयोग जो आपको बताएगा कि आप क्या मिल गया

(शून्य हो सकता है) ... तो sz और qba.data();

का उपयोग करके इसके साथ कुछ करें ... QAudioInput के विपरीत बग के बिना लगता है, जो अविश्वसनीय रूप से तोड़ दिया गया है उदाहरण के लिए, विंडोज के तहत 48000 की मनमानी नमूना दर सीमा, लेकिन ओएसएक्स नहीं, पुल मोड अग्रभूमि धागे का उपयोग करता है, इसलिए किसी भी वास्तविक स्थिति में लगातार टूट जाएगा, bytesReady() व्यर्थ है ... सबसे खराब। क्यूटी। नियमित। Evar!

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