मैंने mPlayer.write(audio, 0, audio.length);
को अपने Thread
में आंशिक रूप से हल किया है। यह चॉकलेट-नेस में से कुछ लेता है (इस तथ्य के कारण कि लिखना एक अवरुद्ध कॉल है), लेकिन यह अभी भी एक अच्छा दूसरा या 2 के बाद चटनी लगता है। इसमें अभी भी 2-3 सेकंड की महत्वपूर्ण देरी है।
new Thread(){
public void run(){
byte[] audio = packet.getData();
mPlayer.write(audio, 0, audio.length);
}
}.start();
बस एक छोटे से गुमनाम Thread
कि लेखन अब है ...
किसी इस समस्या को हल करने के लिए पर एक विचार है?
संपादित करें:
कुछ आगे की जाँच के और डिबगिंग के बाद, मैंने देखा है कि इस obtainBuffer साथ एक मुद्दा है। मैंने java code of the AudioTrack और C++ code of AudioTrack पर देखा है और मैंने देखा है कि यह केवल C++ कोड में दिखाई दे सकता है।
if (__builtin_expect(result!=NO_ERROR, false)) {
LOGW( "obtainBuffer timed out (is the CPU pegged?) "
"user=%08x, server=%08x", u, s);
mAudioTrack->start(); // FIXME: Wake up audioflinger
timeout = 1;
}
मैंने देखा है कि कोड के इस टुकड़े में FIXME
है। : < लेकिन वैसे भी, क्या कोई यह समझा सकता है कि यह सी ++ कोड कैसे काम करता है? मैं इसके साथ कुछ अनुभव प्राप्त हुआ है, लेकिन यह इस रूप में के रूप में जटिल नहीं था ...
संपादित करें 2:
मैं अब कुछ अलग की कोशिश की है, अंतर किया जा रहा है कि मैं डेटा बफ़र मुझे मिलता है, और फिर जब बफर कुछ डेटा से भरा होता है, तो यह खिलाड़ी को लिखा जा रहा है। हालांकि, खिलाड़ी कुछ चक्रों के लिए उपभोग करने के साथ रहता है, तो obtainBuffer timed out (is the CPU pegged?)
चेतावनी में शामिल होता है, और खिलाड़ी को लिखे जाने पर कोई भी डेटा नहीं होता है जब तक कि यह जीवन वापस शुरू नहीं हो जाता ... उसके बाद, यह लगातार डेटा प्राप्त करेगा जब तक बफर खाली नहीं होता तब तक इसे लिखा जाता है।
एक और मामूली अंतर यह है कि मैं अब प्लेयर को एक फाइल स्ट्रीम करता हूं। यही है, इसे टुकड़ों में पढ़ना, उन हिस्सों को बफर में लिखना। यह वाईफाई पर प्राप्त होने वाले पैकेजों को अनुकरण करता है ...
मुझे आश्चर्य है कि यह सिर्फ एक ओएस मुद्दा है जो एंड्रॉइड है, और ऐसा कुछ नहीं है जिसे मैं अपने आप हल कर सकता हूं ... किसी को भी कोई विचार है उस पर?
संपादित करें 3:
मैं और अधिक परीक्षण किया है, लेकिन यह मेरे लिए किसी भी आगे मदद नहीं करता है। यह परीक्षण मुझे दिखाता है कि जब मैं पहली बार ऑडियोट्रैक को लिखने की कोशिश करता हूं तो मुझे केवल अंतराल मिलता है। इसे पूरा होने में कुछ और 3 सेकंड के बीच लगता है। मैं निम्न कोड बिट का उपयोग करके ऐसा किया:
long beforeTime = Utilities.getCurrentTimeMillis(), afterTime = 0;
mPlayer.write(data, 0, data.length);
afterTime = Utilities.getCurrentTimeMillis();
Log.e("WriteToPlayerThread", "Writing a package took " + (afterTime - beforeTime) + " milliseconds");
हालांकि, मैं निम्नलिखित परिणाम प्राप्त: Logcat Image http://img810.imageshack.us/img810/3453/logcatimage.png
ये पता चलता है कि अंतराल शुरू में, शुरुआत में होता है जिसके बाद audiotrack हो रही डेटा रखता है लगातार ... मुझे वास्तव में यह तय करने की ज़रूरत है ...
क्या आपने 'PLAYER_CAPACITY' के साथ खेलने का प्रयास किया है? मेरा मानना है कि आपको उचित मूल्य प्राप्त करने के लिए 'getMinBufferSize() 'का उपयोग करना चाहिए, जैसा कि यहां दिखाया गया है: http://developer.android.com/reference/android/media/AudioTrack.html – gary
मैंने कोशिश की है ... लेकिन नेटवर्क से प्राप्त डेटा आमतौर पर 4096 I (वर्तमान में) से कम है, इस डिवाइस पर getMinBufferSize से मिलता है। इसे बफरसाइज़ करने के लिए सेट करना <प्राप्त बाइट्स के परिणामस्वरूप कोई भी ऑडियो नहीं खेला जा रहा है ... मुझे प्राप्त बाइट्स की मात्रा 900 से 2048 तक (स्रोत, अन्य मोबाइल डिवाइस या पीसी के आधार पर) प्राप्त होती है। – ThaMe90
मेरे पास इस पर दूसरा नजरिया था, मेरे मामले में, चटनी पैकेट गायब/पुनः प्रेषण की महत्वपूर्ण मात्रा के कारण है। एंड्रॉइड जैसी कुछ संसाधन-सीमित प्रणाली में, प्रोग्राम को प्रत्येक व्यक्तिगत यूडीपी पैकेट को पर्याप्त रूप से पैकेट को रोकने के लिए पर्याप्त प्रक्रिया को संसाधित करना होगा। – yorkw