studio sonido reproducir poner pausar musica mediaplayer fondo ejemplo detener como boton android audiotrack

poner - reproducir sonido en android studio



Reproducir audio en bucle usando AudioTrack (3)

Tengo una función por la que quiero pasar a utilizar Androids AudioTrack lugar de MediaPlayer , debido a algunos errores conocidos de MediaPlayer , como el pequeño espacio que aparece entre las pistas en bucle.

Me recomendaron usar AudioTrack pero no he encontrado muchos ejemplos en uso. Encontré una pregunta sobre SO con respecto a AudioTrack y usé algo de ese código para hackear algo:

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); } } }

Así que esto parece reproducir la pista de audio completa (~ 1: 00 min) y luego se detiene. Ahora el objetivo final aquí es que dos tienen 2 pistas de audio separadas que se reproducen y se repiten al mismo tiempo. Actualmente tengo las pistas de audio en el directorio /res/raw/ , pero puedo moverlas a una carpeta de assets simple si eso fuera mejor. ¿Es correcta mi implementación actual de AudioTrack ? Si es así, ¿cómo lo haría para hacer un bucle?

En resumen: ¿cómo se puede reproducir audio en bucle sin un hueco utilizando AudioTrack ?

Las sugerencias de formas alternativas de obtener audio en bucle, como bibliotecas de terceros, son bienvenidas.


Estás pasando en longitud de byte de la corriente. setLoopPoints () espera la cantidad de bloques de audio en la transmisión. Consulte getBufferSizeInFrames () en la documentación.

Sin embargo. Les advierto que la mayoría de los formatos de audio particulares no están basados ​​en bloques; se basan en la muestra. MP3 es la única excepción; está alineado en los límites de 1152 bytes. Si el contenido de origen es MP3 y no se ha creado explícitamente como para que esté alineado con bloques, es imposible realizar un bucle continuo. Parece que estás utilizando "whitenoise.wav" como fuente de audio. A menos que la longitud de este archivo se alinee explícitamente con el tamaño del bloque, es posible que tenga artefactos de audio cuando realice el bucle.

La solución para esto es realizar un fundido cruzado de los bloques de cuadros inicial y final cuando realiza un bucle y manejar todo el búfer, pero tendría que escribir código para hacerlo usted mismo.


Mira this ejemplo, parece un problema similar, resuelto alimentando continuamente el AudioTrack .

class ToneGenerator { int sampleRate = 8000; double sample[] = null; byte generatedSnd[] = null; int m_ifreq = 400; Thread m_PlayThread = null; boolean m_bStop = false; AudioTrack m_audioTrack = null; int m_play_length = 1000;//in seconds static public void PlayTone(int freq, int play_length) { ToneGenerator player = new ToneGenerator(); player.m_ifreq = freq; player.m_play_length = play_length; player.play(); } synchronized void stop() { m_bStop = true; if (m_PlayThread != null) { try { m_PlayThread.interrupt(); m_PlayThread.join(); m_PlayThread = null; } catch (Exception e) { } } if (m_audioTrack != null) { m_audioTrack.stop(); m_audioTrack.release(); m_audioTrack = null; } } synchronized void play() { m_bStop = false; m_PlayThread = new Thread() { public void run() { try { int iToneStep = 0; m_audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, 2 * sampleRate, AudioTrack.MODE_STREAM); while (!m_bStop && m_play_length-- > 0) { genTone(iToneStep++); m_audioTrack.write(generatedSnd, 0, generatedSnd.length); if (iToneStep == 1) { m_audioTrack.play(); } } } catch (Exception e) { Log.e("Tone", e.toString()); } catch (OutOfMemoryError e) { Log.e("Tone", e.toString()); } } }; m_PlayThread.start(); } //Generate tone data for 1 seconds synchronized void genTone(int iStep) { sample = new double[sampleRate]; for (int i = 0; i < sampleRate; ++i) { sample[i] = Math.sin(2 * Math.PI * (i + iStep * sampleRate) / (sampleRate / m_ifreq)); } // convert to 16 bit pcm sound array // assumes the sample buffer is normalised. generatedSnd = new byte[2 * sampleRate]; int idx = 0; for (final double dVal : sample) { // scale to maximum amplitude final short val = (short) ((dVal * 32767)); // in 16 bit wav PCM, first byte is the low order byte generatedSnd[idx++] = (byte) (val & 0x00ff); generatedSnd[idx++] = (byte) ((val & 0xff00) >>> 8); } } }


No puede hacer un bucle utilizando un AudioTrack configurado con AudioTrack.MODE_STREAM . Si utiliza MODE_STREAM AudioTrack debe rellenarse con nuevas muestras continuamente.

Pero puede configurarlo con AudioTrack.MODE_STATIC y pasar el búfer completo para que se reproduzca (quiero decir: si necesita mezclar dos muestras, debe pasar las muestras mezcladas).

setLoopPoints: establece los puntos de bucle y el conteo de bucles. El bucle puede ser infinito. De manera similar a setPlaybackHeadPosition, la pista debe detenerse o pausarse para que se cambien los puntos de bucle, y debe usar el modo MODE_STATIC.

Tenga en cuenta que AudioTrack reproduce muestras de PCM sin procesar, no hay soporte para WAV, MP3 u otros contenedores.