2010-12-13 9 views
8

मुझे एक ही समय में ऑडियोट्रैक के दो उदाहरण चलाने की आवश्यकता है। उन्हें अलग से चलना चाहिए क्योंकि मैं उन्हें अलग-अलग, परिवर्तनीय नमूना दरों पर खेल रहा हूं। मैंने पाया कि अगर मैं उन्हें एक ही थ्रेड में चलाता हूं, तो वे "मोड़ लेते हैं"। मैं उन्हें अपने स्वयं के धागे में चला रहा हूं, लेकिन ऑडियो stuttering है।एंड्रॉइड: एकाधिक ऑडियोट्रैक उदाहरणों को मिलाकर?

दो उदाहरण बनाने पर कोई विचार अच्छा खेलता है? यदि नहीं, तो दो छोटे बफर मिश्रण करने पर कोई सुझाव, भले ही मैं उन्हें विभिन्न नमूना दरों पर खेलना चाहता हूं।

उत्तर

11

मेरे पास एक बार में 4 ऑडियोट्रैक खेल रहे हैं और वे ठीक खेलते हैं। एचटीसी डिजायर 1.1ghz ओसी पर परीक्षण। हालांकि कभी-कभी थ्रेडिंग के साथ ग्लिच होते हैं। कभी-कभी यदि सभी चार खेल रहे हैं तो मैं थ्रेड में शामिल होने का प्रयास नहीं करूँगा। अधिक परीक्षण करने की आवश्यकता है। यहाँ एक दिए गए पथ

package com.ron.audio.functions; 

import java.io.BufferedInputStream; 
import java.io.DataInputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.InputStream; 

import android.media.AudioFormat; 
import android.media.AudioManager; 
import android.media.AudioTrack; 

public class AudioPlayManager implements Runnable { 

private File fileName; 
private volatile boolean playing; 

public AudioPlayManager() { 
    super(); 
    setPlaying(false); 
} 

public void run(){ 
     // Get the length of the audio stored in the file (16 bit so 2 bytes per short) 
     // and create a short array to store the recorded audio. 
     int musicLength = (int)(fileName.length()/2); 
     short[] music = new short[musicLength]; 

     try { 
     // Create a DataInputStream to read the audio data back from the saved file. 
     InputStream is = new FileInputStream(fileName); 
     BufferedInputStream bis = new BufferedInputStream(is); 
     DataInputStream dis = new DataInputStream(bis); 

     // Read the file into the music array. 
     int i = 0; 
     while (dis.available() > 0) { 
      music[i] = dis.readShort(); 
      i++; 
     } 

     // Close the input streams. 
     dis.close();  

     // Create a new AudioTrack object using the same parameters as the AudioRecord 
     // object used to create the file. 
     AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 
               11025, 
               AudioFormat.CHANNEL_CONFIGURATION_MONO, 
               AudioFormat.ENCODING_PCM_16BIT, 
               musicLength, 
               AudioTrack.MODE_STREAM); 
     // Start playback 
     audioTrack.play(); 

     // Write the music buffer to the AudioTrack object 
     while(playing){ 
      audioTrack.write(music, 0, musicLength); 
     } 

     } 
     catch(Exception e){ 
      e.printStackTrace(); 
     } 

} 


public void setFileName(File fileName) { 
    this.fileName = fileName; 
} 

public File getFileName() { 
    return fileName; 
} 

public void setPlaying(boolean playing) { 
    this.playing = playing; 
} 

public boolean isPlaying() { 
    return playing; 
} 

}

+0

धन्यवाद में दर्ज एक wav फ़ाइल प्ले बैक करने के लिए मेरी कक्षा है! की कोशिश करेंगे। मैं थ्रेड कॉलबैक में अपना ऑडियोट्रैक नहीं बना रहा हूं जैसे आप हैं। मुझे लगता है कि यह इलाज है (आपका शेष कोड मेरे पास लगभग समान है)। यह समझाएगा कि दो ऑडियोट्रैक का "टॉगल" क्यों है - वे एक-दूसरे को अवरुद्ध कर रहे हैं। – BTR

+0

मुझे बताएं कि यह आपके लिए काम करता है या नहीं। मेरे पास यह सब एक और वर्ग में लपेटा गया है जो मेरे लिए सभी थ्रेड प्रबंधन करेगा। मैं फिर थ्रेड मैनेजर को कॉल कर सकता हूं और स्ट्रीमिंग के लिए थ्रेडिंग या धाराओं को वापस चलाने के बारे में चिंता करने की ज़रूरत नहीं है। – DeliveryNinja

+2

इसके मुकाबले थोड़ा और अधिक था, लेकिन वास्तविक कुंजी थ्रेड के अंदर ऑडियोट्रैक बना रही थी। मेरे पास "डिवाइस" वर्ग का एक अलग प्रकार था इसलिए मैं उस पर टेम्पो, वॉल्यूम इत्यादि को नियंत्रित कर सकता था। इसे उस वर्ग में जोड़कर जो फ़ाइल को पढ़ता है और इसे एक थ्रेड में कर रहा है, उन्हें अच्छा खेलना पड़ता है। अब मैं अपने ऑप्टिमस (600 एमएचजेड) पर डीजेइंग ट्रैक कर रहा हूं। :) – BTR

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