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 reproducirMediaPlayer
). - 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 aonCompletion
. (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 delDownloadManager
.
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 establecersetDataSource(''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 otroLAUNCHER
.
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).