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?
- Android Exerciser Monkey comienza a reproducir archivos de audio al azar
- ¿Grabar audio en Android con MediaPlayer como fuente?
- Android Mediaplayer: problema de setDataSource para el archivo de medios descargado
- Android - ¿Cómo puedo permitir que una instancia de MediaPlayer se reproduzca a la vez?
- ¿Cómo desarrollar un reproductor de video que recibe transmisión de video en la difusión wi-fi / multidifusión?
- Video androide, escuchar sonido pero no video
- ¿Deshabilitar la solicitud de VideoView de AndroidAudioFocus al reproducir un video?
- Control de reproducción de botón de pausa en fragmento de servicio de reproductor de música
- Adición de efectos de audio personalizados al reproductor de audio de Android
- Establecer mi aplicación como reproductor de música por defecto en android programatically
- Android MediaPlayer: onErrorListener y onCompletionListener trabajando ab-normalmente
- Cómo configurar presets eq en android?
- Cómo reproducir o reanudar la música de otro reproductor de música de mi código?
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 } }
- Android Google Map API V2: Abrir ventana de información personalizada en el lado derecho del marcador
- Cómo pasar AttributSet a la vista personalizada