2010-07-15 9 views
5

एप्लिकेशन को मैं एंड्रॉइड के लिए विकसित करने की कोशिश कर रहा हूं, 48khz (पीसीएम 16 बिट्स & मोनो) पर फ्रेम रिकॉर्ड करता है और उन्हें नेटवर्क पर भेजता है। इसके अलावा, 8 किलोग्राम पर ऑडियो की आने वाली स्ट्रीम है। इसलिए, मुझे 8 किलोहर्ट्ज नमूने वाले फ्रेम मिलते हैं और उन्हें खेलते हैं (मेरी ऑडियोट्रैक ऑब्जेक्ट 8 किलोग्राम पर सेट है), लेकिन जब उन्हें खेलते हैं, तो सब कुछ काम करता है लेकिन विलंबता बड़ी है। जब तक आप कुछ सुन नहीं लेते हैं, यह लगभग 3 सेकंड की तरह लगता है।8 किलोहर्ट्ज से 48 किलोहर्ट्ज (जावा/एंड्रॉइड)

मुझे लगता है कि अगर मैं 8khz से 48khz तक प्राप्त फ्रेम को अपमानित करता हूं और उन्हें चलाता हूं, तो इतनी बड़ी खेल विलंबता नहीं होगी। वास्तव में जब मैं एक ही दर पर फ्रेम रिकॉर्ड और प्ले करता हूं, तो विलंबता वास्तव में कम होती है। बुरी बात यह है कि मुझे इसे इस तरह से करने के लिए मजबूर किया गया है: 48 किलोहर्ट्ज पर भेजें और 8 किलोहर्ट्ज प्राप्त करें।

जैसा कि पहले बताया गया है, मैं 8 किलोहर्ट्ज से 48 किलोहर्ट्ज तक एक ध्वनि फ्रेम (16 बिट पीसीएम) को अपनाने की कोशिश कर रहा हूं। क्या जावा में कोई भी नियमित/लाइब्रेरी/एपीआई जानता है जो यह करता है ???

मुझे एक बुद्धिमान सिग्नल को अपनाने के बारे में मूल बातें पता हैं, लेकिन मैं मानता हूं कि अपने स्वयं के एफआईआर फ़िल्टर को डिजाइन और कार्यान्वित करने और ऑडियो स्ट्रीम के साथ इसे मजबूत करने के लिए .... रास्ता बहुत अधिक है। इसके अलावा, यह मेरे ज्ञान पर है।

तो ... क्या कोई इस के साथ मेरी मदद कर सकता है ?? क्या जावा में किसी भी पुस्तकालय/दिनचर्या को पता है जिसे मैं उपयोग कर सकता हूं ?? कोई सुझाव या विकल्प ??

+4

@juergen, आप एक पुराने सवाल "उन्नत में धन्यवाद" में लेखन ठीक करने के लिए टक्कर करने के लिए जा रहे हैं, * कम से कम * वाक्यांश को पूरी तरह निकाल, के रूप में यह कोई मूल्य नहीं है, और अन्य वर्तनी त्रुटियों को ठीक करें। –

उत्तर

6

एक त्वरित और गंदे समाधान रैखिक इंटरपोलेशन होगा। चूंकि आप हमेशा छह के कारक से नमूना ले रहे हैं, यह वास्तव में करना आसान है:

यह कुछ हद तक काम करता है (सी-कोड, और अनचाहे, और मैं अंतिम पुनरावृत्ति को सही तरीके से संभाल नहीं पा रहा हूं, लेकिन यह दिखाता है विचार मुझे लगता है)।

void resample (short * output, short * input, int n) 
{ 
    // output ought to be 6 times as large as input (48000/8000). 

    int i; 
    for (i=0; i<n-1; i++) 
    { 
    output[i*6+0] = input[i]*6/6 + input[i+1]*0/6; 
    output[i*6+1] = input[i]*5/6 + input[i+1]*1/6; 
    output[i*6+2] = input[i]*4/6 + input[i+1]*2/6; 
    output[i*6+3] = input[i]*3/6 + input[i+1]*3/6; 
    output[i*6+4] = input[i]*2/6 + input[i+1]*4/6; 
    output[i*6+5] = input[i]*1/6 + input[i+1]*5/6; 
    } 

रैखिक इंटरपोलेशन आपको अच्छी ध्वनि गुणवत्ता नहीं देगा लेकिन यह सस्ता और तेज़ है। यदि आप चाहें तो क्यूबिक इंटरपोलेशन का उपयोग करके आप इसे बेहतर बना सकते हैं।

यदि आप एक तेज़ और उच्च गुणवत्ता वाले resampling चाहते हैं तो मैं सुझाव देता हूं कि आप एंड्रॉइड-एनडीके का उपयोग करके libresample जैसे c resampling लाइब्रेरी को संकलित करें और इसे जेएनआई का उपयोग करके जावा से कॉल करें। यह बहुत तेज होगा। जेएनआई कोड लिखना कुछ लोगों से दूर है, लेकिन यह काफी आसान है .. एनडीके के लिए इसके कई उदाहरण हैं।

http://www.mega-nerd.com/SRC/index.html

2

रैखिक प्रक्षेप कलाकृतियों परिचय देता है। उच्च गुणवत्ता वाले पुनरावृत्ति के साथ अच्छी जावा लाइब्रेरी है - जेएसएसआरसी (http://jssrc.khadkevich.org/)।

कोड Github पर उपलब्ध है: https://github.com/hutm/JSSRC

+1

आपने मुझे सिरदर्द बचाया। जिस साइट से आपने लिंक किया है वह नीचे है, यहां आर्काइव https://web.archive.org/web/20130902203226/http://jssrc.khadkevich.org और यहां गिथब रिपोजिटरी है .. https: // github.com/hutm/JSSRC –

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