studio mejorar descargar ainur android audio

descargar - mejorar audio bluetooth android



Android MediaPlayer loop tiene lagunas incluso con formato OGG (1)

Está bien, el viejo Post, pero esta solución funciona. Esto es una especie de truco. Ayudará a alguien si alguien llega a esta respuesta.

Solo estoy usando tres reproductores multimedia. mp1 , mp2 , mp3 . mp1 se reproduce, y configuro mp2 en su setNextMediaPlayer . cuando mp1 finaliza, configuro mp3 a mp2''s setNextMediaPlayer . Cuando mp2 finaliza, configuro mp1 a mp1 de mp3''s . A continuación se muestra el código completo que reproduce pause, stop, set vol. Simplemente cree un objeto BZMediaPlayer , BZMediaPlayer proporcionando uri o id de recurso.

import android.content.Context; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.net.Uri; import android.util.Log; public class BZMediaPlayer { private Context context; private Uri uri; private int resourceId; // which file is getting played public static final int URI_PLAYING = 1; public static final int RESOURCE_PLAYING = 2; private int filePlaying; // states of the media player public static final int STATE_PLAYING = 1; public static final int STATE_PAUSED = 2; public static final int STATE_STOP = 3; // current state private int state = STATE_STOP; // current mediaPlayer which is playing private int mediaPlayerIndex = -1; // 3 media players private MediaPlayer mp[] = new MediaPlayer[3]; // current volume private float vol; public BZMediaPlayer(Context context) { this.context = context; } /** * plays the provided uri * @param uri */ public void play(Uri uri) { this.uri = uri; // current playing file filePlaying = URI_PLAYING; // stop any playing session stop(); // initialize and set listener to three mediaplayers for (int i = 0; i < mp.length; i++) { mp[i] = MediaPlayer.create(context, uri); mp[i].setOnCompletionListener(completionListener); } // set nextMediaPlayers mp[0].setNextMediaPlayer(mp[1]); mp[1].setNextMediaPlayer(mp[2]); // start the first MediaPlayer mp[0].start(); // set mediaplayer inex mediaPlayerIndex = 0; // set state state = STATE_PLAYING; } /** * play file from resource * @param resourceId */ public void play(int resourceId) { this.resourceId = resourceId; filePlaying = RESOURCE_PLAYING; stop(); for (int i = 0; i < mp.length; i++) { mp[i] = MediaPlayer.create(context, resourceId); mp[i].setOnCompletionListener(completionListener); } mp[0].setNextMediaPlayer(mp[1]); mp[1].setNextMediaPlayer(mp[2]); mp[0].start(); mediaPlayerIndex = 0; state = STATE_PLAYING; } /** * play if the mediaplayer is pause */ public void play() { if (state == STATE_PAUSED) { mp[mediaPlayerIndex].start(); Log.d("BZMediaPlayer", "playing"); state = STATE_PLAYING; } } /** * pause current playing session */ public void pause() { if (state == STATE_PLAYING) { mp[mediaPlayerIndex].pause(); Log.d("BZMediaPlayer", "pausing"); state = STATE_PAUSED; } } /** * get current state * @return */ public int getState() { return state; } /** * stop every mediaplayer */ public void stop() { for(int i = 0 ; i < mp.length ; i++) { if (mp[i] != null) { mp[i].stop(); if(mp[i].isPlaying()) { mp[i].release(); } } } state = STATE_STOP; } /** * set vol for every mediaplayer * @param vol */ public void setVol(float vol) { this.vol = vol; for(int i = 0 ; i < mp.length ; i++) { if (mp[i] != null && mp[i].isPlaying()) { mp[i].setVolume(vol, vol); } } } /** * internal listener which handles looping thing */ private MediaPlayer.OnCompletionListener completionListener = new OnCompletionListener() { @Override public void onCompletion(MediaPlayer curmp) { int mpEnds = 0; int mpPlaying = 0; int mpNext = 0; if(curmp == mp[0]) { mpEnds = 0; mpPlaying = 1; mpNext = 2; } else if(curmp == mp[1]) { mpEnds = 1; mpPlaying = 2; mpNext = 0; // corrected, else index out of range } else if(curmp == mp[2]) { mpEnds = 2; mpPlaying = 0; // corrected, else index out of range mpNext = 1; // corrected, else index out of range } // as we have set mp2 mp1''s next, so index will be 1 mediaPlayerIndex = mpPlaying; Log.d("BZMediaPlayer", "Media Player " + mpEnds); try { // mp3 is already playing release it if (mp[mpNext] != null) { mp[mpNext].release(); } // if we are playing uri if (filePlaying == URI_PLAYING) { mp[mpNext] = MediaPlayer.create(context, uri); } else { mp[mpNext] = MediaPlayer.create(context, resourceId); } // at listener to mp3 mp[mpNext].setOnCompletionListener(this); // set vol mp[mpNext].setVolume(vol, vol); // set nextMediaPlayer mp[mpPlaying].setNextMediaPlayer(mp[mpNext]); // set nextMediaPlayer vol mp[mpPlaying].setVolume(vol, vol); } catch (Exception e) { e.printStackTrace(); } } }; }

Espero que ayude a alguien

Edit: clean code

En Android 4.x mi aplicación de looping de audio tiene de 0.2 a 0.5 segundos de brechas en los loops de sonido.

Estoy usando MediaPlayer ya que mis sonidos pueden ser bastante grandes (de 2 a 300 m cada uno en algunos casos) y puede ejecutar varias instancias al mismo tiempo.

Investigué bastante sobre esto y veo que hay un error para Android 4.x ... sin embargo, he intentado muchos problemas y parece que ninguno de ellos funciona.

  • Convirtió todos los wavs a OGG usando Audacity (nivel de calidad 2 a 10, no importaba)
  • Intentó setNextMediaPlayer ()
  • Intenté usar seekTo (0) en detener y repetir
  • Intentó SoundPool que tiene sus propios errores

Aquí hay una muestra del código que estoy usando:

public class SoundPlayer implements OnCompletionListener { private MediaPlayer mp = null; public void initPlayer() { if(mp == null) { mp = new MediaPlayer(); } } public void prepare(Context context, int resource) { initPlayer(); try{ mp.reset(); Uri uri = Uri.parse("android.resource://com.myapp.app/"+resource); mp.setDataSource(context,uri); mp.prepare(); isPrepared = true; mp.setOnCompletionListener(this); } catch(Exception e) { e.printStackTrace(); } } .......... etc (Uses typical MediaPlayer methods such as stop(), start(), setLooping(true) }

No estoy usando nada especial, así que me pregunto si alguien sabe de una solución para el error de bucle en Android.