reproductor para mega gratis descargar android audio download streaming media-player

android - para - vlc media player



Android Media Player: Descargar a archivo y transmitir desde archivo (3)

Me ayudó, espero ayudar a alguien más.

Reproductor de descargar y reproducir música.

mMediaPlayer.setDataSource(DOWNLOAD_URL); File root = Environment.getExternalStorageDirectory(); File dir = new File(root + "/Folder"); if (!dir.exists()) { dir.mkdirs(); DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); Uri downloadUri = Uri.parse(DOWNLOAD_URL); DownloadManager.Request request = new DownloadManager.Request(downloadUri); request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI); request.setAllowedOverRoaming(false); request.setTitle(TITLE); request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); request.setDestinationInExternalPublicDir(Environment.DIRECTORY_MUSIC, TITLE); request.allowScanningByMediaScanner();

Después de descargar el archivo:

mMediaPlayer.setDataSource(Environment.getExternalStorageDirectory() + "/Folder/" + TITLE + ".mp3");

Estoy usando el MediaPlayer de Android para reproducir archivos MP3 que se descargan simultáneamente desde Internet mediante el DownloadManager . Soy consciente de la capacidad del MediaPlayer para transmitir directamente, pero no quiero usar eso:

La ventaja obvia que obtiene al descargar y al mismo tiempo transmitir desde un archivo es que de esta manera, el archivo se almacena y está disponible localmente después.

  • Esto funciona en principio: el MediaPlayer comienza a reproducir el archivo aunque no se haya descargado completamente. (Por cierto, mi problema NO es que no pueda reproducir MediaPlayer ).
  • El problema es que cuando MediaPlayer llega a la posición donde estaba el estado de la descarga cuando comenzó a reproducirse, se detiene y llama a onCompletion . (Aclaración: supongamos que el archivo está descargado al 12% cuando comienzo a jugar. Cuando el jugador llega a la posición al 12%, se detiene).
  • Nota rápida: no se llama a OnBufferingUpdateListener.onBufferingUpdate(...) cuando se añade algo al archivo MP3 a través del DownloadManager .

Entonces la pregunta es: ¿Cómo puedo descargar simultáneamente un archivo de audio al sistema de archivos y reproducirlo? (Android 4+ es suficiente, si eso marca la diferencia).


Supongo que estás apuntando MediaPlayer al archivo. En ese caso, no creo que sea compatible con la transmisión, y probablemente verifique el tamaño del archivo por adelantado, por lo que no se actualizará a sí mismo a medida que ingrese más cantidad del archivo.

Debe apuntarlo a un origen de contenido que funcione con la transmisión, por ejemplo, HTTP. Acabo de comprobar cómo lo hace "ES File Explorer" (con LogCat): cuando hace clic en un archivo de video en un recurso compartido de archivos remoto, abre un servidor HTTP local y envía un Uri HTTP al MediaPlayer a su servidor local. , que también incluye la ruta remota.

Cuando recibe la solicitud a través de HTTP, el servidor local comienza a leer el archivo desde la ubicación remota y lo proporciona localmente a MediaPlayer a través de HTTP. Probablemente pueda hacer lo mismo, y además de proporcionarlo a través de HTTP, también guárdelo en el disco.


Tengo el mismo problema. Por supuesto, cuando uso setDataSource(video_uri) y aCustomDownload(video_uri) al mismo tiempo, se puede guardar y reproducir, pero desperdició el ancho de banda.

Intenté hacer un FileDescriptor de bloqueo falso (FileInputStream, LocalSocket) para setDataSource y otras formas, pero todas fallaron.

Así que encontré esta solución, VideoCache .

  • Es a través de un servidor proxy http, igual que la respuesta de @Oren. Construye un servidor http local de socket, luego escucha un url válido como http://127.0.0.1:xxxx/url_encode(''your video url'') .

  • Cuando obtiene una url válida, crea un cliente de solicitud de socket para descargar la url y enviar la secuencia al servidor 127.0.0.1 . Así que puedes establecer setDataSource(''http://127.0.0.1:xxxx/your video''s encode url'')

  • Utilice una vez descargar, guardar y jugar. Y puede hacer un servidor Singleton con una actividad más (ciclo de vida) lanzada, así que puedo usarlo desde android.intent.action.SEND u otro LAUNCHER .

Es una solución perfecta.

Aviso: debe desactivar el límite de caché. de lo contrario, VideoCache borrará todos los datos cuando el tamaño del caché fuera de 512 MB (predeterminado).