2009-01-02 13 views
19

जावा रीयलटाइम ऑडियो प्रोसेसिंग के लिए सी/सी ++ के लिए उपयुक्त विकल्प है?ऑडियो प्रोसेसिंग के लिए जावा यह व्यावहारिक है?

मैं देरी लाइनों (30s @ 48khz) के साथ ऑडियो के अधिकतम (अधिकतम) ट्रैक के साथ एक ऐप पर विचार कर रहा हूं, फ़िल्टरिंग (512 अंक एफआईआर?), और अन्य डीएसपी प्रकार के संचालन एक साथ प्रत्येक ट्रैक पर होते हैं।

संचालन को फ़्लोटिंग पॉइंट में परिवर्तित और निष्पादित किया जाएगा।

सिस्टम शायद 4 जीबी रैम के साथ क्वाड कोर 3GHz होगा, उबंटू चला रहा है।

मैंने जावा के बारे में लेखों को सी/सी ++ के करीब आने, और अब रीयलटाइम एक्सटेंशन के साथ होने के बारे में बहुत तेज देखा है। क्या यह वास्तविकता है? क्या इसे हार्ड कोर कोडिंग और ट्यूनिंग की आवश्यकता होती है ताकि सी के% 50-% 100 प्रदर्शन को specing कर रहे हों?

यदि यह संभव है और किसी भी गॉथ के लिए सिर है तो मैं वास्तव में एक भावना की तलाश में हूं।

+0

जावा वास्तविक समय ऑडियो के लिए बाहर बारी अंत में व्यावहारिक नहीं किया था? – mattbh

+1

मैंने इसे और भी सहन नहीं किया। एक सुरक्षित मार्ग के रूप में, सी ++ के साथ गया था। – JeffV

उत्तर

18
एक ऑडियो आवेदन आप अक्सर कोड का केवल बहुत छोटे भागों जहां समय के सबसे खर्च कर रहा है के लिए

जावा में, आप हमेशा जेएनआई (जावा मूल इंटरफ़ेस) का उपयोग कर सकते हैं और अपने कम्प्यूटेशनल भारी कोड को सी-मॉड्यूल में ले जा सकते हैं (या यदि आपको वास्तव में शक्ति की आवश्यकता है तो एसएसई का उपयोग करके असेंबली)। तो मैं जावा का उपयोग कहूंगा और अपना कोड काम करूँगा। यदि यह पता चला है कि आप अपने प्रदर्शन लक्ष्य को पूरा नहीं करते हैं तो जेएनआई का उपयोग करें। कोड की

90% की संभावना सबसे अधिक गोंद कोड और आवेदन सामान वैसे भी हो जाएगा। लेकिन ध्यान रखें कि आप इस तरह के कुछ क्रॉस प्लेटफार्म सुविधाओं को खो देते हैं। यदि आप उस जेएनआई के साथ रह सकते हैं तो आपको हमेशा देशी कोड प्रदर्शन के लिए दरवाज़ा खुल जाएगा।

4

निश्चित रूप से, क्यों नहीं?

महत्वपूर्ण सवाल (भाषा से स्वतंत्र, इस सिद्धांत कतार से है) कर रहे हैं:

  • क्या अधिकतम प्रवाह आप को संभालने के लिए (आपके द्वारा निर्दिष्ट 100 x 48kHz की जरूरत है, कि मोनो या स्टीरियो है, उस आवृत्ति पर कितने बिट्स बराबर हैं?)
  • क्या आपके जावा दिनचर्या औसत पर इस दर के साथ रह सकती हैं?
  • अधिकतम स्वीकार्य विलंबता क्या है?

यदि आपका प्रोग्राम औसत पर थ्रूपुट के साथ रह सकता है, और आपके पास विलंबता के लिए पर्याप्त जगह है, तो आप इनपुट और आउटपुट के लिए कतारों का उपयोग करने में सक्षम होना चाहिए, और महत्वपूर्ण प्रोग्राम जो कि महत्वपूर्ण हैं समय के लिए वे टुकड़े हैं जो डेटा को इनपुट कतार में डालते हैं और आउटपुट कतार से बाहर ले जाते हैं और इसे एक डीएसी/स्पीकर/जो कुछ भी भेजते हैं।

देरी लाइनों में कम कम्प्यूटेशनल लोड है, आपको बस पर्याप्त मेमोरी (+ मेमोरी बैंडविड्थ) की आवश्यकता है ... वास्तव में आपको शायद इसके लिए इनपुट/आउटपुट कतारों का उपयोग करना चाहिए, यानी डेटा इनपुट इनपुट कतार में तुरंत डालना शुरू करें, और आउटपुट कतार 30 के बाद डेटा लेना शुरू करें। यदि यह वहां नहीं है, तो आपका प्रोग्राम बहुत धीमा है ...)।

एफआईआर अधिक महंगे हैं, जो शायद बाधा बनने जा रहे हैं (जो आप अनुकूलित करना चाहते हैं) जब तक कि आपके मन में कुछ बदसूरत बुरा ऑपरेशन न हो।

1

एक बात जो मैंने आपके प्रश्न में नहीं देखी है, यह है कि क्या आपको इन संसाधित नमूने को चलाने की आवश्यकता है या यदि आप उनके साथ कुछ और कर रहे हैं (उदाहरण के लिए उन्हें फ़ाइल में एन्कोड करना)। मैं जावा के ध्वनि इंजन की स्थिति के बारे में अधिक चिंतित हूं कि जेवीएम कितने तेज़ नमूने को कम कर सकता है।

मैंने कुछ साल पहले javax.sound.sampled पर बहुत कठिन धक्का दिया और गहराई से अप्रसन्न हो गया - यह ओपनल या मैक/आईफोन के कोर ऑडियो जैसे समकक्ष ढांचे के साथ तुलना नहीं करता है (दोनों जिनमें से मैंने उपयोग किया है तीव्रता का एक समान स्तर)। javax.sound.sampled के लिए आपको अपने नमूने को अज्ञात अवधि के अपारदर्शी बफर में धक्का देना आवश्यक है, जो सिंक्रनाइज़ेशन को असंभव बनाता है। यह भी खराब दस्तावेज है (इन-मेमोरी क्लिप के छोटे उदाहरणों के विपरीत एक रेखा पर अनिश्चित-लंबाई ऑडियो स्ट्रीमिंग के उदाहरण खोजने के लिए बहुत मुश्किल है) में, कार्यान्वित तरीके हैं (DataLine.getLevel() ... जिसका गैर-कार्यान्वयन नहीं है ' टी भी दस्तावेज), और इसे ऊपर करने के लिए, मेरा मानना ​​है कि सूर्य ने पिछले जावासाउंड इंजीनियर को साल पहले रखा था।

अगर मैं था ध्वनि मिश्रण और उत्पादन के लिए एक जावा इंजन का उपयोग करने, मैं शायद और, एक पहली पसंद के रूप OpenAL को जोअल बाइंडिंग का उपयोग करने के बाद से मैं कम से कम जानते होंगे इंजन वर्तमान में समर्थित किया गया था की कोशिश बहुत कम विलंबता में सक्षम। हालांकि मुझे लंबे समय तक संदेह है कि निल्स सही है और आप मूल ध्वनि एपीआई को कॉल करने के लिए जेएनआई का उपयोग कर समाप्त कर देंगे।

3

मुझे लगता है कि विलंबता आपकी बड़ी समस्या होगी - आधुनिक ओएस पर पहले से ही सी/सी ++ में विलंबता बनाए रखना काफी मुश्किल है, और जावा निश्चित रूप से समस्या (कचरा कलेक्टर) में जोड़ता है। "रीयल-टाइम" ऑडियो प्रसंस्करण के लिए सामान्य डिज़ाइन आपके प्रोसेसिंग थ्रेड को रीयल टाइम शेड्यूलिंग (SCHE_FIFO पर लिनक्स कर्नेल पर, अन्य ओएस के बराबर) पर चलाना है, और उन थ्रेड को कभी भी अवरुद्ध नहीं करना चाहिए। इसका मतलब है कि कोई सिस्टम कॉल नहीं, कोई मॉलोक नहीं, निश्चित रूप से कोई आईओ नहीं है ... यहां तक ​​कि पेजिंग भी एक समस्या है (डिस्क से मेमोरी में एक पेज प्राप्त करने से आसानी से कई एमएस ले सकते हैं), इसलिए आपको कुछ पेजों को लॉक करना चाहिए ताकि वे यह सुनिश्चित कर सकें कि वे कभी नहीं हैं विनिमय किया।

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

0

क्यों नहीं एक दिन खर्च करें और एक साधारण जावा एप्लिकेशन लिखें जो न्यूनतम प्रसंस्करण करता है और यह सत्यापित करता है कि प्रदर्शन अपर्याप्त है या नहीं।

+5

@mP, उस तरह का एक सवाल-जवाब साइट के बिंदु को हरा देता है यह नहीं है? – JeffV

2

जेएसन नामक एक लाइब्रेरी देखें।

http://www.softsynth.com/jsyn/

+0

अच्छा लिंक मैं इसका इस्तेमाल करने के लिए सुनिश्चित हो जाएगा, यहां तक ​​कि एक एंड्रॉयड कार्यान्वयन है! https://github.com/philburk/jsyn/tree/master/android/com/jsyn/devices/android – ejectamenta

7

जावा कई ऑडियो अनुप्रयोगों के लिए ठीक है। कुछ अन्य पोस्टर्स के विपरीत, मुझे जावा ऑडियो के साथ काम करने में खुशी मिलती है। आपके लिए उपलब्ध एपीआई और संसाधनों की तुलना डरावनी, मुश्किल से दस्तावेज वाले दिमागी * के लिए करें जो कोरऑडियो है और आप एक आस्तिक होंगे। जावा ऑडियो कुछ विलंबता समस्याओं से ग्रस्त है, हालांकि कई ऐप्स के लिए यह अप्रासंगिक है, और कोडेक्स की कमी है। ऐसे बहुत सारे लोग भी हैं जिन्होंने कभी भी अच्छे ऑडियो प्लेबैक इंजन लिखने के लिए समय नहीं लिया है (संकेत, कभी भी SourceDataLine को बंद न करें, इसके बजाय शून्य लिखें), और बाद में जावा को उनकी समस्याओं के लिए दोष दें। एपीआई बिंदु से, जावा ऑडियो बहुत सरल है, उपयोग करने में बहुत आसान है, और jsresources.org पर बहुत सारे मार्गदर्शन और बहुत सारे मार्गदर्शन हैं।

+1

jsresources.org कोड नमूने के बहुत सारे के साथ एक महान संसाधन है। अच्छा खोज –

3

हां, जावा ऑडियो अनुप्रयोगों के लिए बहुत अच्छा है। आप जावा का उपयोग कर सकते हैं और एएसओ के माध्यम से ऑडियो परतों तक पहुंच सकते हैं और वास्तव में विंडोज प्लेटफ़ॉर्म पर कम विलंबता (64 नमूने विलंबता जो कुछ भी नहीं है) है। इसका मतलब है कि आपके पास वीडियो/मूवी पर होंठ-सिंक होगा। मैक पर अधिक विलंबता क्योंकि ओएस एक्स और "शीर्ष पर जावा" के संयोजन को "शॉर्टकट" करने के लिए कोई एएसओ नहीं है, लेकिन फिर भी ठीक है। लिनक्स भी, लेकिन मैं अधिक अज्ञानी हूँ। जावा और असियो के एक व्यावहारिक (और दुनिया के पहले) उदाहरण के लिए soundpimp.com देखें, जो सद्भाव में काम कर रहा है। एनआरके रेडियो & टीवी एंड्रॉइड ऐप भी देखें जिसमें एक एमपी 3 डीकोडर (जावा से) है।आप जावा के साथ अधिकतर ऑडियो चीजें कर सकते हैं, और फिर अतिरिक्त समय महत्वपूर्ण होने पर देशी परत का उपयोग कर सकते हैं।

-2

से http://www.jsresources.org/faq_performance.html#java_slow

चलो कुछ ethernal ज्ञान इकट्ठा करते हैं:

  • पृथ्वी फ्लैट है।

  • और, भूलना नहीं: जावा धीमा है।

कई अनुप्रयोगों (लिंक अनुभाग देखें) साबित के रूप में, जावा पर्याप्त ऑडियो संपादकों, ठीक खेल रिकॉर्डिंग सिस्टम और मिडी प्रोसेसिंग सॉफ्टवेयर का निर्माण करना है। कोशिश करके देखो!

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