2012-08-15 10 views
35

मैं एंड्रॉयड 2.2 के लिए प्रोग्रामिंग कर रहा हूँ और एक साथ कई लगता है खेलने के लिए SoundPool वर्ग का उपयोग कर कोशिश कर रहा हूँ लेकिन क्या यादृच्छिक बार की तरह वक्ताओं से बाहर आने बंद हो जाएगा ध्वनि लग रहा है पर।ऑडियोफ्लिंगर ट्रैक नहीं बना सका। स्थिति: -12

कि इस खेला गया होता प्रत्येक ध्वनि के लिए

logcat में छापा जाता है:

AudioFlinger could not create track. status: -12 
Error creating AudioTrack 
Audio track delete 

कोई अपवाद नहीं फेंक दिया जाता है और इस कार्यक्रम की मात्रा की कमी के अलावा कोई भी बदलाव के बिना निष्पादित करने के लिए जारी है। मुझे वास्तव में कठिन समय लगता है कि क्या स्थितियां त्रुटियों का कारण बनती हैं या ऐसा होने के बाद इसे पुन: प्रयास करती हैं। मुझे कहीं भी दस्तावेज़ीकरण में त्रुटि नहीं मिल रही है और नुकसान में काफी कुछ है।

किसी भी मदद की सराहना की जाएगी!

संपादित करें: मैं यह उल्लेख करना भूल गया कि मैं एमपी 3 फ़ाइलों को लोड कर रहा हूं, ओग नहीं।

+5

आप कितने ट्रैक बना रहे हैं? AFAIK -12 'NO_MEMORY' है, जिसका अर्थ यह हो सकता है कि आप ट्रैक से बाहर हो गए हैं (मुझे लगता है कि खुले ट्रैक की अधिकतम संख्या 32 थी - यह सुनिश्चित नहीं है कि यह अभी भी सत्य है)। – Michael

+0

हम्मम्म, मैं बहुत सारे ट्रैक लोड कर रहा हूं लेकिन वे 5 साउंडपूल के बीच विभाजित हैं। प्रत्येक ध्वनिपूल में अधिकतम ~ 15 ध्वनियां होंगी। क्या आपको पता है कि 32 अधिकतम ट्रैक सिस्टम चौड़े या प्रति ध्वनि पूल थे? – user1599837

+0

यह प्रति मिक्सर थ्रेड है (जिसमें से आपको आउटपुट थ्रेड AFAIK प्रति एक मिल गया है)। लेकिन चूंकि कई प्लेटफार्म सभी गैर-ए 2 डीडी प्लेबैक के लिए एक आउटपुट थ्रेड का उपयोग करते हैं, यह अनिवार्य रूप से वैश्विक सीमा बन जाता है। – Michael

उत्तर

20

मुझे लगभग कुछ ही आवाजों के साथ यह वही समस्या थी जो मैं लोड करने और हाल ही में खेलने का प्रयास कर रहा था।

मैंने इसे एक भी एमपी 3 लोड करने के लिए भी तोड़ दिया जो इस त्रुटि का कारण बन रहा था।

एक बात मैंने ध्यान दिया: जब मैं -1 के लूप से लोड होता हूं, तो यह "स्थिति 12" त्रुटि से असफल हो जाता है, लेकिन जब मैंने इसे 0 बार लूप पर लोड किया, तो यह सफल होगा। 1 बार लोड करने का भी प्रयास विफल रहा।

अंतिम समाधान एमपी 3 को ऑडियो संपादक में खोलना था और इसे थोड़ा कम गुणवत्ता के साथ फिर से संपादित करना था ताकि फ़ाइल अब छोटी हो, और ऐसा लगता है कि सिस्टम में बहुत सारे संसाधन नहीं लगते हैं।

आखिरकार, यह चर्चा है जो आप उपयोग कर रहे वस्तुओं पर एक रिलीज करने के लिए प्रोत्साहित करती है, क्योंकि संसाधनों पर वास्तव में एक कठिन सीमा है जिसका उपयोग किया जा सकता है, और यह सिस्टम-व्यापी है, इसलिए यदि आप कई का उपयोग करते हैं संसाधन, अन्य ऐप्स उनका उपयोग करने में सक्षम नहीं होंगे।

https://groups.google.com/forum/#!topic/android-platform/tyITQ09vV3s/discussion%5B1-25%5D

ऑडियो के लिए, वहाँ प्रति डिवाइस 32 सक्रिय audiotrack वस्तुओं की एक कठिन सीमा है (न एप्लिकेशन प्रति: यदि आप प्रणाली के बाकी हिस्सों के साथ उन 32 साझा करने की आवश्यकता है), और audiotrack प्रयोग किया जाता है आंतरिक रूप से SoundPool, ToneGenerator, MediaPlayer, देशी ऑडियो नीचे OpenSL ES, आदि लेकिन के आधार पर वास्तविक audiotrack सीमा < 32 है; यह निर्भर करता है इस तरह के स्मृति, CPU लोड, आदि के रूप में मुलायम कारकों के बारे में अधिक भी ध्यान रखें कि एंड्रॉयड ऑडियो मिक्सर में सीमक वर्तमान में गतिशील रेंज संपीड़न नहीं है, इसलिए यह संभव है अगर आप सक्रिय की एक बड़ी संख्या है क्लिप करने के लिए है लगता है और वे सभी जोर से हैं।

वीडियो खिलाड़ियों के लिए सीमा बहुत ज्यादा तीव्र लोड कि वीडियो डिवाइस पर डालता है की वजह से कम है।

मैं इसे मीडिया डेवलपर्स को याद दिलाने का अवसर के रूप में उपयोग करूंगा: कृपया आपके ऐप को रोक दिए जाने पर मीडिया ऑब्जेक्ट्स के लिए रिलीज़() को कॉल करना याद रखें। यह उन अंतर्निहित संसाधनों को मुक्त करता है जिन्हें अन्य ऐप्स की आवश्यकता होगी। , मीडिया वस्तुओं कचरा कलेक्टर द्वारा अंतिम रूप देने में सफ़ाई की जा रही पर भरोसा करते हैं कि के रूप में अप्रत्याशित समय है मत करो।

0

रिलीज़ करना आपके संसाधनों रखना चाहिए

final ToneGenerator tg = new ToneGenerator(AudioManager.STREAM_NOTIFICATION, 50); 
tg.startTone(ToneGenerator.TONE_PROP_BEEP, 200); 
tg.release(); 

की कोशिश करो।

2

मेरे पास एक समान समस्या थी जहां मेरे एंड्रॉइड गेम के भीतर संगीत ट्रैकर नोट्स छोड़ देगा और मुझे ऑडीफ्लिंगर त्रुटि मिली (हालांकि मेरी स्थिति -22 थी)। मुझे यह काम मिल गया हालांकि यह कुछ लोगों की मदद कर सकता है।

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

यह सुनिश्चित नहीं है कि यह क्यों काम करता है क्योंकि मैं नमूने को स्मृति में कैश करता हूं, लेकिन उसी फ़ाइल को दो अलग-अलग ध्वनियों में लोड करने से भी ठीक नहीं होता है। केवल जब नमूने दो अलग-अलग फाइलों से बाहर आए तो त्रुटियां दूर हो गईं।

मुझे यकीन है कि यह हर किसी की मदद नहीं करेगा और यह सबसे सुंदर फिक्स नहीं है लेकिन यह किसी की मदद कर सकता है।

2

john.k.doe सही है। आपको अपनी एमपी 3 फ़ाइल के आकार को कम करना होगा। आपको प्रति फ़ाइल 100kb के तहत आकार रखना चाहिए। मुझे सामान्य 200kbps की बजाय 32kbps की कॉन्सटेंट बिट रेट (सीबीआर) का उपयोग करके मेरी 200kb फ़ाइल को 72kb तक कम करना पड़ा। यह मेरे लिए काम किया!

0

एक एकल ध्वनिपूल में 1 (एक) एमबी की आंतरिक मेमोरी सीमा होती है। यदि आपकी आवाज बहुत उच्च गुणवत्ता है तो आप इसे मार सकते हैं। यदि आपके पास कई आवाज़ें हैं और इस सीमा को मार रहे हैं, तो बस अधिक ध्वनिपूल बनाएं, और अपनी आवाज़ें उन्हें भर दें।

यदि आप वहां पहुंचने से पहले स्मृति से बाहर हो रहे हैं तो भी आप हार्ड ट्रैक सीमा तक पहुंचने में सक्षम नहीं हो सकते हैं।

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

0

मैं इस समस्या के साथ था। इसे हल करने के लिए मैं ध्वनि चलाने के बाद SoundPool ऑब्जेक्ट की विधि .release() चलाता हूं।

यहाँ मेरी कोड है:

SoundPool pool = new SoundPool(10, AudioManager.STREAM_MUSIC, 50); 
final int teste = pool.load(this.ctx,this.soundS,1); 
pool.setOnLoadCompleteListener(new OnLoadCompleteListener(){ 

@Override 
    public void onLoadComplete(SoundPool sound,int sampleId,int status){ 
     pool.play(teste, 20,20, 1, 0, 1); 
     new Thread(new Runnable(){ 
@Override      
    public void run(){ 
     try { 
     Thread.sleep(2000); 
       pool.release(); 
     } catch (InterruptedException e) { e.printStackTrace(); } 
     } 
     }).start(); 
    } 
}); 

ध्यान दें कि मेरे मामले में मेरे ध्वनियों लंबाई 1-2 सेकंड अधिकतम था, तो मैं मान केवल रिहाई के लिए Thread.Sleep(), में 2000 मिलीसेकंड की डाल खिलाड़ी के समाप्त होने के बाद संसाधन।

1

जैसा ऊपर बताया गया है, लूपिंग में कोई समस्या है: जब मैं -1 को दोहराता हूं तो मुझे यह त्रुटि मिलती है, लेकिन 0 के साथ सब ठीक से काम कर रहा है। मैंने देखा है कि कुछ ध्वनियां इस त्रुटि को देती हैं जब मैं उन्हें एक-एक करके चलाने की कोशिश कर रहा हूं। उदाहरण के लिए:

mSoundPool.stop(mStreamID); 
mStreamID = mSoundPool.play(mRandID, mVolume, mVolume, 1, -1, 1f); 

ऐसे मामले में, पहला ट्रैक ठीक खेला जाता है, लेकिन जब मैं ध्वनि स्विच करता हूं, तो अगला ट्रैक यह त्रुटि देता है। ऐसा लगता है कि लूपिंग का उपयोग करके, एक बफर किसी भी तरह अधिभारित होता है, और mSoundPool.stop संसाधनों को तुरंत जारी नहीं कर सकता है।

समाधान:

final Handler handler = new Handler(); 
handler.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     mStreamID = mSoundPool.play(mRandID, mVolume, mVolume, 1, -1, 1f); 
}, 350); 

और यह काम कर रहा है, लेकिन देरी विभिन्न उपकरणों के लिए अलग है।

1

मेरे मामले में, गुणवत्ता को कम करना और इस प्रकार एमपी 3 के फ़ाइल आकार 100kb से कम नहीं था, क्योंकि कुछ 51kb फाइलें काम करती थीं जबकि कुछ लंबी अवधि 41kb फाइलें अभी भी नहीं थीं।

हमें 44100 से 22050 तक नमूना दर को कम करने या 5 सेकंड से कम अवधि की अवधि को कम करने में क्या मदद मिली।

0

मुझे बहुत अधिक जटिल उत्तर दिखाई देता है। त्रुटि -12 का अर्थ है कि आपने चर जारी नहीं किए हैं। मुझे ओजीजी ऑडियो फ़ाइल 8 बार चलाने के बाद भी यही समस्या थी। यह मेरे लिए काम किया:

SoundPoolPlayer onBeep; //Global variable 

    if(onBeep!=null){ 
     onBeep.release(); 
    } 
    onBeep = SoundPoolPlayer.create(getContext(), R.raw.micon); 
    onBeep.setOnCompletionListener(
     new MediaPlayer.OnCompletionListener() { 
      @Override 
      public void onCompletion(MediaPlayer mp) { //mp will be null here 
      loge("ON Beep! END"); 
      startGoogleASR_API_inner(); 
      } 
         } 
     ); 
    onBeep.play(); 

चर() होगा गड़बड़ चीजों को .play के बाद सही जारी है, और यह onCompletion अंदर चर जारी है, इसलिए नोटिस उपयोग करने से पहले मैं कैसे चर जारी (संभव नहीं है और nullpointer अपवाद से बचने के लिए शून्य के लिए जाँच)।

यह आकर्षण की तरह काम करता है!

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