Ho una funzione su cui voglio passare per utilizzare Androids AudioTrack
anziché MediaPlayer
, a causa di alcuni bug noti con MediaPlayer
, come il piccolo spazio tra le tracce in loop.Riprodurre l'audio in loop utilizzando AudioTrack
Mi è stato consigliato di utilizzare AudioTrack
ma non ne ho trovato molti esempi in uso. Ho trovato una domanda su SO per quanto riguarda AudioTrack
e usato alcuni di quel codice di hack insieme qualcosa:
public class TestActivity extends Activity implements Runnable {
Button playButton;
byte[] byteData = null;
int bufSize;
AudioTrack myAT = null;
Thread playThread = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
playButton = (Button) findViewById(R.id.testButton);
InputStream inputStream = getResources().openRawResource(R.raw.whitenoise_wav);
try {
byteData = new byte[ inputStream.available()];
} catch (IOException e) {
e.printStackTrace();
}
try {
inputStream.read(byteData);
inputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
initialize();
playButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
playThread.start();
}
});
}
void initialize() {
bufSize = android.media.AudioTrack.getMinBufferSize(44100,
AudioFormat.CHANNEL_CONFIGURATION_STEREO,
AudioFormat.ENCODING_PCM_16BIT);
myAT = new AudioTrack(AudioManager.STREAM_MUSIC,
44100, AudioFormat.CHANNEL_CONFIGURATION_STEREO,
AudioFormat.ENCODING_PCM_16BIT, bufSize,
AudioTrack.MODE_STREAM);
myAT.setVolume(.2f);
playThread = new Thread(this);
}
public void run() {
if (myAT != null) {
myAT.play();
myAT.setLoopPoints(0, byteData.length, 6);
myAT.write(byteData, 0, byteData.length);
}
}
}
Quindi questo vuol sembrano riprodurre l'intera traccia audio (~ 1: 00 min) e poi si ferma. Ora l'obiettivo finale qui è due avere 2 tracce audio separate che suonano e si ripetono allo stesso tempo. Attualmente ho le tracce audio nella directory /res/raw/
, ma posso spostarle in una semplice cartella assets
se fosse meglio. La mia attuale implementazione di AudioTrack
è corretta? Se è così, come faccio a farlo in loop?
In sommario: come è possibile riprodurre l'audio in loop senza uno spazio utilizzando AudioTrack
?
Suggerimenti per modi alternativi per ottenere l'audio in loop, ad esempio le librerie di terze parti, sono i benvenuti.
Si desidera riprodurre entrambe le tracce contemporaneamente e anche il ciclo dell'audio una volta terminato correttamente? –
Questo è corretto. – Orbit
Controllare questo: http://developer.android.com/reference/android/media/SoundPool.html –