2016-01-19 7 views
8

मैं साइन तरंगों का एक अनुक्रम खेलने के लिए AudioTrack उपयोग कर रहा हूँ अदा नहीं करता है, लेकिन जब मैं अपने एचटीसी M9 पर चला है, यह नमूने का ही हिस्सा निभाता है, और कितनी देर तक यह खेलेंगे यादृच्छिक है। ई। जी। मेरे पास खेलने के लिए 20 टन हैं, लेकिन यह केवल 2 से 17.5 टन की तरह खेलता है। और हाँ यह एक स्वर के बीच में भी रुक जाएगा।एंड्रॉयड audiotrack सभी नमूनों

यहाँ मेरी कोड है, एक और उत्तर से:

ArrayList<double[]> samples = new ArrayList<>(); 
    int numSamples = 0; 
    for (final ToneSegment seg : sequence) { 
     int num = seg.getDuration() * sampleRate/1000; 
     double[] sample = new double[num]; 
     for (int i = 0; i < num; ++i) { 
      sample[i] = Math.sin(2 * Math.PI * i * seg.getPitch()/sampleRate); 
     } 
     samples.add(sample); 
     numSamples += num; 
    } 

    byte generatedSnd[] = new byte[2 * numSamples]; 
    int idx = 0; 
    for (double[] sample : samples) { 
     for (final double dVal : sample) { 
      final short val = (short) ((dVal * 32767)); 
      generatedSnd[idx++] = (byte) (val & 0x00ff); 
      generatedSnd[idx++] = (byte) ((val & 0xff00) >>> 8); 
     } 
    } 

    audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 
      sampleRate, AudioFormat.CHANNEL_OUT_MONO, 
      AudioFormat.ENCODING_PCM_16BIT, generatedSnd.length, 
      AudioTrack.MODE_STATIC); 
    audioTrack.write(generatedSnd, 0, generatedSnd.length); 
    audioTrack.play(); 

किसी को भी किसी भी विचार है? धन्यवाद!

उत्तर

0

यह संभावना यह समस्या उत्पन्न कचरा संग्रहण है। मैं इस कोड को तत्काल लौटने की विधि में लिख रहा था, क्योंकि audioTrack ऑब्जेक्ट इसका संदर्भ खो देगा। यदि प्लेबैक के दौरान कचरा संग्रह होता है, तो audioTrack को अंतिम रूप दिया जाएगा और टोन खेलना बंद कर दिया जाएगा। इस प्रकार यह समस्या कभी-कभी होती है, इस पर निर्भर करता है कि जीसी कब खेल रहा है।

तो मुझे प्लेबैक समाप्त होने तक AudioTrack ऑब्जेक्ट संदर्भ रखने की आवश्यकता है। मुझे लगता है कि ऐसा करने के लिए कई तरीके हैं, लेकिन अंत में मैं सबसे आसान तरीका का उपयोग करें:

class Player { 
    private static AudioTrack sAudioTrack; 
} 

MediaPlayer भी इस चूक है, और के बाद से यह लोग इन कि यह पहले जारी किया गया अंतिम रूप दे दिया है लिखेंगे कैसे मैं इस समस्या पाया है।

2

आप AudioTrack.MODE_STATIC का उपयोग कर रहे हैं जो कि लघु ध्वनि और कम विलंबता आवश्यकताओं के लिए है, जबकि आपको AudioTrack.MODE_STREAM का उपयोग करना चाहिए। AudioTrack.MODE_STREAM लंबी धाराओं के लिए है, लेकिन मुझे नहीं पता कि आपके नमूने कब तक हैं। तो अगर आप कोशिश करते हैं और audiotrack बदल सकते हैं:

audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 
     sampleRate, AudioFormat.CHANNEL_OUT_MONO, 
     AudioFormat.ENCODING_PCM_16BIT, generatedSnd.length, 
     AudioTrack.MODE_STREAM); 

इसके अलावा audiotrack बाइट में बफर आकार की आवश्यकता है, एक छोटी जरूरतों के लिए आवश्यक बाइट्स की सही मात्रा की गणना करने के दो से गुणा किया जाना है। आप इस तरह उस में हैक हो सकता है:

audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 
     sampleRate, AudioFormat.CHANNEL_OUT_MONO, 
     AudioFormat.ENCODING_PCM_16BIT, generatedSnd.length*2, 
     AudioTrack.MODE_STREAM); 
+0

मैंने MODE_STREAM को आजमाया है, लेकिन यह वही है। मेरे नमूने केवल 3 से 7 सेकंड के लिए खेलते हैं। –

+0

वे एक यादृच्छिक अवधि के लिए खेलते हैं? क्या आपने छोटे या अन्य ऑडियो नमूने की कोशिश की है? और क्या आपने बाइट्स की मात्रा भी गुणा की है? – jobbert

+0

हां, मैंने अन्य नमूने की कोशिश की है। वे यादृच्छिक अवधि नहीं हैं। बाइट्स की मात्रा गुणा करने के लिए क्या है? –

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