2011-12-06 9 views
16

मैंने एक साधारण एप्लिकेशन बनाया जो आवृत्ति की एक वर्ग लहर उत्पन्न करता है और इसे स्ट्रीम मोड (STREAM_MUSIC) में ऑडियोट्रैक का उपयोग करके चलाता है। सब कुछ और काम करने ठीक लग रहा है ध्वनि ठीक खेलता है, लेकिन जब धारा समाप्त हो गया है मैं लॉग में संदेश प्राप्त:ऑडियोट्रैक इसे रोकने के बाद भी पुनरारंभ करना

डब्ल्यू/audiotrack (7579): obtainBuffer() ट्रैक 0x14c228 विकलांग, को पुन: प्रारंभ ...

स्टॉप() फ़ंक्शन को कॉल करने के बाद भी मुझे ये मिलता है। मेरा मानना ​​है कि मैं ऑडियोट्रैक द्वारा आवश्यक न्यूनतम आकार के आधार पर ऑडियोट्रैक बफर आकार को सही ढंग से सेट करता हूं (मेरे मामले में 6x1024)। मैं इसे 1024 शॉर्ट्स के छोटे बफर के साथ खिलाता हूं।

क्या यह ठीक है कि मुझे ये मिल रहा है और क्या मुझे इसे छोड़ देना चाहिए?

उत्तर

15

ठीक है, मुझे लगता है कि समस्या हल हो गई है। त्रुटि उत्पन्न होती है जब बफर समय पर डेटा से पूरी तरह से भरा नहीं जाता है (बफर अंडरन)। मैं पता नहीं क्या समय समाप्ति है, लेकिन यदि आप अनुभव यह सुनिश्चित करें कि:

  1. आप खेलने विधि कॉल नहीं है जब तक आप बफर में कुछ डेटा है।

  2. आप टाइमआउट को हरा करने के लिए पर्याप्त तेज़ डेटा जेनरेट कर सकते हैं।

  3. स्टॉप() विधि को कॉल करने से पहले, डेटा के साथ बफर को खिलाने के बाद, सुनिश्चित करें कि "अंतिम" बफर टाइमआउट से पहले डेटा से पूरी तरह से भरा हुआ था।

मैं हमेशा एक छोटे से (समय समाप्ति तक) तो 1 बफर शून्य से भरा भेजने और अंत में बंद बुला() फ़ंक्शन इंतजार कर द्वारा पिछले मुद्दे के साथ निपटा।

ध्यान रखें कि आपको हमेशा छोटे टुकड़ों में बफर भेजना चाहिए, भले ही आपके पास बड़ा हिस्सा तैयार हो। यह अभी भी मुझे परेशान करता है कि मैं 100% निश्चित नहीं हूं कि यह सही तरीका है लेकिन त्रुटियां खत्म हो गई हैं, इसलिए मुझे लगता है कि मैं इसके साथ रह सकता हूं :)

5

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

4

मुझे उस चेतावनी मिल रही थी जब मैंने audioTrack.play() नामक ऑडिओट्रैक को तुरंत चालू किया और play() कॉल और audioTrack.write() के बीच थोड़ी देर हो गई। अगर मैंने play() को write() से ठीक पहले चेतावनी दी, तो चेतावनी गायब हो गई। खेलने कॉल करने से पहले डेटा के साथ बफर भरने -

+0

है कि बिंदु से हल किया गया है। फिर सुनिश्चित करें कि आप समय पर डेटा जेनरेट कर सकते हैं। आपके पास विलंबता होगी और यह आपके फोन (न्यूनतम बफर आकार), नमूना दर और गतिशील रिज़ॉल्यूशन पर निर्भर करता है। मैं अपना मामला (एचटीसी डिजायर) 6 केबी। यह लगभग 3000 16 बिट मोनो नमूने है। नमूना दर को ध्यान में रखते हुए आप परिणामी विलंबता की आसानी से गणना कर सकते हैं। यदि आप मूल ऑडियो एपीआई का उपयोग करते हैं तो आपको बहुत छोटी लेटेंसी मिल सकती है, लेकिन अभी भी आईफोन के छोटे 5ms से दूर है ... –

0

मैं इस

 if (mAudioTrack.getPlayState()!=AudioTrack.PLAYSTATE_PLAYING) 
      mAudioTrack.play(); 
     mAudioTrack.write(b, 0, sz * 2); 
     mAudioTrack.stop(); 
     mAudioTrack.flush(); 
संबंधित मुद्दे