Android – Reproducción de mp3 desde byte

Tengo mi archivo mp3 en byte [] (descargado de un servicio) y me gustaría reproducirlo en mi dispositivo similar a cómo se pueden reproducir archivos:

MediaPlayer mp = new MediaPlayer(); mp.setDataSource(PATH_TO_FILE); mp.prepare(); mp.start(); 

Pero no puedo encontrar una forma de hacerlo. No me importaría guardar archivos en el teléfono y luego reproducirlo. ¿Cómo puedo reproducir el archivo, o descargar y luego reproducirlo?

Aceptar, gracias a todos ustedes, pero yo necesitaba reproducir mp3 de byte [] como lo obtengo de. NET webservice (no desea almacenar dinámicamente generado mp3s en el servidor).

Al final – hay número de "gotchas" para reproducir mp3 simple … aquí es el código para cualquier persona que lo necesita:

 private MediaPlayer mediaPlayer = new MediaPlayer(); private void playMp3(byte[] mp3SoundByteArray) { try { // create temp file that will hold byte array File tempMp3 = File.createTempFile("kurchina", "mp3", getCacheDir()); tempMp3.deleteOnExit(); FileOutputStream fos = new FileOutputStream(tempMp3); fos.write(mp3SoundByteArray); fos.close(); // resetting mediaplayer instance to evade problems mediaPlayer.reset(); // In case you run into issues with threading consider new instance like: // MediaPlayer mediaPlayer = new MediaPlayer(); // Tried passing path directly, but kept getting // "Prepare failed.: status=0x1" // so using file descriptor instead FileInputStream fis = new FileInputStream(tempMp3); mediaPlayer.setDataSource(fis.getFD()); mediaPlayer.prepare(); mediaPlayer.start(); } catch (IOException ex) { String s = ex.toString(); ex.printStackTrace(); } } 

EDIT: He escrito esta respuesta hace más de 4 años – obviamente muchas cosas han cambiado desde entonces. Vea el comentario de Justin sobre cómo reutilizar la instancia de MediaPlayer. Además, no sé si .deleteOnExit () funcionará para usted ahora – no dude en sugerir mejoras para que los archivos temporales no se acumulen.

No está seguro acerca de bytearrays / bytestreams, pero si tiene una URL del servicio, puede intentar establecer el origen de datos en un URI de red llamando al

 setDataSource(Context context, Uri uri) 

Consulte los documentos de la API .

Encontré una solución fácil codificando mi archivo MP3 como Base64 (ya recibí los datos codificados de un servicio Restful API) y luego creé un objeto URL. Lo probé en Android 4.1.

 public void PlayAudio(String base64EncodedString){ try { String url = "data:audio/mp3;base64,"+base64EncodedString; MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setDataSource(url); mediaPlayer.prepare(); mediaPlayer.start(); } catch(Exception ex){ System.out.print(ex.getMessage()); } } 

Streaming de audio desde una URL en Android usando MediaPlayer?

codigo erroneo:

  MediaPlayer mp = new MediaPlayer(); mp.setDataSource(PATH_TO_FILE); mp.prepare(); mp.start(); 

CORRECTO CÓDIGO:

  MediaPlayer mp = new MediaPlayer(); mp.setDataSource(PATH_TO_FILE); mp.setOnpreparedListener(this); mp.prepare(); //Implement OnPreparedListener OnPrepared() { mp.start(); } 

Vea Demos API.

Iniciando Android MarshMellow (Código de versión 23), hay una nueva API que hará esto posible.

MediaPlayer.setDataSource (android.media.MediaDataSource)

Puede proporcionar una implementación personalizada de MediaDataSource y ajustar un byte []. Una implementación básica dada a continuación.

 import android.annotation.TargetApi; import android.media.MediaDataSource; import android.os.Build; import java.io.IOException; @TargetApi(Build.VERSION_CODES.M) public class ByteArrayMediaDataSource extends MediaDataSource { private final byte[] data; public ByteArrayMediaDataSource(byte []data) { assert data != null; this.data = data; } @Override public int readAt(long position, byte[] buffer, int offset, int size) throws IOException { System.arraycopy(data, (int)position, buffer, offset, size); return size; } @Override public long getSize() throws IOException { return data.length; } @Override public void close() throws IOException { // Nothing to do here } } 
  • Cómo reproducir el archivo de audio Mp3 desde el servidor
  • Cómo rotar video * .mp4 en SurfaceView?
  • Reproductor de vídeo en android (desarrollar)
  • Impedir mi aplicación de audio con NuPlayer en Android Lollipop 5.x?
  • SetVideoSurfaceTexture ha fallado: -22 en mediaplayer
  • Android 2.2 MediaPlayer está funcionando bien con una URL de SHOUTcast, pero no con la otra
  • ¿Cómo implementar un reinicio de MediaPlayer en errores en Android?
  • Servicio de Android que controla MediaPlayer
  • SurfaceView en blanco al reproducir vídeo usinng mediaplayer
  • Android Visualizador FFT / onda afectada por el volumen del dispositivo?
  • YouTube Player API en android ya no funciona bien
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.