2009-05-25 14 views
17

Estoy escribiendo una aplicación, parte de la cual permite al usuario reproducir/reproducir videos. Quiero restringir la funcionalidad para que solo puedan transmitir videos si tienen una conexión WiFi. Luego guardaré el video para que cuando solo tengan una conexión 3G (o menor) no puedan transmitir videos y solo puedan reproducir videos guardados en el teléfono.¿Transmitir y guardar un video simultáneamente?

Idealmente, me gustaría obtener MPMoviePlayerController para reproducir/reproducir la película y luego acceder a los datos de la película y guardarla. Sin embargo, la api MPMoviePlayerController no parece admitir el acceso a los datos de la película.

Me gustaría evitar el escenario y descargar y reproducir. ¿Algunas ideas?

+0

Hola, ¿has tenido éxito con eso? – Bkillnest

Respuesta

11

Dos soluciones vienen a la mente. Ambas soluciones requieren que el archivo esté en un formato que se pueda reproducir progresivamente, p. Ej. que no necesita todo el archivo para poder jugarlo (pero eso sería un requisito previo de todos modos).

  1. utilice un hilo para descargar los datos y anexarlo a un archivo, y reproducir el archivo de otro hilo. Ahora, eso requiere que pueda manejar eventos EOF en el MPMoviePlayerController y pausar la reproducción hasta que se anexe el archivo de caché y luego reanudarlo para el mismo punto.

Hasta ahora lo que he visto a la gente haciendo esto no funciona porque MPMoviePlayerController no puede manejar el evento EOF. (aún no lo he probado yo mismo) [Caching videos to disk after successful preload by MPMoviePlayerController

  1. Omita la reproducción desde un archivo y configure un servidor HTTP local y la transmisión desde ese (en el host local). Esto tampoco está probado. La idea es que MPMoviePlayerController manejaría mejor el evento de datos faltantes de un flujo HTTP y luego leería el archivo directamente. Lo malo es que es menos eficiente, pero creo que es un aumento menor en la CPU. No sé si la interfaz de red lo manejaría, pero asumo que no es un problema.

Dejo esta respuesta como una wiki, porque no tengo una solución de trabajo, pero yo también quiero una.

+2

¿Alguien ha intentado esto todavía? ¿Tuviste éxito? – calimarkus

+0

Estoy intentando este enfoque ahora. Parece que puede funcionar, pero aún no hay suerte. Estoy usando un tenedor de CocoaHTTPServer con un 'HTTPAsyncDataResponse' de este proyecto: https://github.com/nickhart/CocoaHTTPServer – vaughan

+0

¿funciona? Descargué esta fuente pero no pude – Bkillnest

1

el iPhone está utilizando la descarga progresiva para que no se guarde en el dispositivo. Para eso, necesita descargarlo explícitamente y luego reproducir el video desde su carpeta local.

2

Hay una manera de hacer que esto funcione, pero tiene que escribir su propio descargador HTTP Live Streaming.

Básicamente, analiza el archivo .m3u8 (es un estándar bastante simple, pero puede ser complicado con secuencias alternativas y la posibilidad de que la transmisión simplemente se desconecte y necesite una nueva lista de reproducción para continuar) y luego descarga los fragmentos en Formato .ts a su almacenamiento local, por ejemplo, la carpeta Documentos o Cachés, etc.

Luego tendrá que configurar un servidor HTTP local para permitir que MPMoviePlayerController o AVPlayer accedan a los archivos a través de HTTP (ya que no lo harán). toque una ruta de archivo local), incluido un archivo de lista de reproducción re-codificado que apunta a los archivos locales, que deberá crear a partir de la (s) lista (s) de reproducción original (s). CocoaHTTPServer funciona muy bien para esto.

Una vez que haya hecho todo eso, funciona muy bien. Es inevitable que tengas un poco de retraso mientras descargas el primer trozo o dos antes de presentar tu URL HTTP local al reproductor de películas, pero después de eso obtienes la descarga, la grabación y la reproducción previa sin problemas.

¡Buena suerte!

Cuestiones relacionadas