¿Se pueden recuperar datos de un stream de MediaPlayer?
Si tuviera que transmitir algún tipo de medio a un MediaPlayer, ¿hay alguna forma de copiarlo antes / después de que se juega? Por ejemplo, si tuviera que transmitir un clip de YouTube, ¿es posible guardar ese clip mientras se está reproduciendo?
Editar:
(La respuesta de Ocelot me hizo darme cuenta de lo localizada que es esta pregunta).
- MediaPlayer setDataSource necesita asesoramiento sobre las mejores prácticas
- Android: ¿Cómo configurar el volumen de MediaPlayer mediante programación?
- Instancia de MediaPlayer: stop se comporta como una pausa
- Android - MediaPlayer tamaño de búfer en ICS 4.0
- Android: ¿Cómo crear un reproductor de vídeo?
Lo que estoy tratando de hacer es copiar el flujo de un MediaPlayer ya en curso (ya sea youtube o stream de música). Quiero ser capaz de ser notificado cuando un nuevo flujo comienza y termina. Hasta ahora lo único que encontré (para el último) que es incluso remotamente cerrar la cadena de difusión ACTION_AUDIO_BECOMING_NOISY pero eso realmente no hace nada por lo que necesito. ¿Hay alguna manera de hacer esto?
- Android - Múltiple, transmisión simultánea de audio
- Cómo desarrollar un simple reproductor de audio streaming android?
- ¿Cómo implementar un reproductor de audio para Android usando MediaPlayer y MediaController?
- MediaPlayer error: pausa llamada en el estado 64
- Android Media Player no se detuvo
- ANR android en MediaPlayer restablecer
- Android Streaming Video - Necesita la relación de aspecto
- Visualizando letras de MP3 song en Android
No he probado esto, y parece un poco de trabajo, pero aquí es lo que intentaría:
-
Cree una subclase de Socket. En esta clase, puede manejar todas las lecturas de bytes y guardar la secuencia localmente o hacer lo que quiera con ella
-
Cree su propio proveedor de contenido, que puede utilizar para pasar URIs a su reproductor de medios, en su propio formato. Ejemplo:
mystream://youtube.com/watch?v=3Rhy37u
-
En su proveedor de contenido, anule el método
openFile
y en él, abra su propio socket y cree un ParcelFileDescriptor con él .
Ahora, simplemente pasando el url de formato nuevo a su mediaplayer debe hacer que todos los flujos pasen a través de su Socket, donde puede guardar sus datos.
Una forma es averiguar primero dónde está el video en el servidor para exmaple en youtube con regex simple como este:
Regex("(?<=&t=)[^&]*").Match(file).Value;
Puede recuperar url al vídeo y luego descargarlo como
public static void Download(string videoID, string newFilePath) { WebClient wc = new WebClient(); string file = wc.DownloadString(string.Format("http://www.youtube.com/watch?v={0}", videoID)); string t = new Regex("(?<=&t=)[^&]*").Match(file).Value; wc.DownloadFile(string.Format("http://www.youtube.com/get_video?t={0}=&video_id={1}",t,videoID), newFilePath); }
Es c # código, pero usted podría convertirlo fácilmente a java.
@zrgiu
He intentado ir con esta solución, pero el MediaPlayer recupera un FileDescriptor de la URI, así que lamentablemente no se puede pasar http URL como esta.
También encontré otra solución, que sugiere para crear un ProxyServer local en su dispositivo para servir a los archivos de Internet, debería ser posible guardar también los archivos transmitidos a través del proxy.
- Uso de un APN personalizado para una conexión
- AsyncTask onPostExecute no se ejecuta en el hilo principal?