2011-02-23 26 views
27

Reproducir el video de Youtube en la aplicación es fácil y está bien documentado.Guardar el video de Youtube en iPhone en la aplicación

Hay dos problemas con eso:

  1. después de cerrar reproductor de Youtube, si el usuario quiere jugar de nuevo tiene que esperar para los flujos de nuevo
  2. no puede jugar fuera de línea (vídeo de carga en el hogar a ver en la carretera)

¿alguien tiene el código para:

  1. descargar vídeos de YouTube a carpeta de documentos y muestran el progreso de descarga
  2. reproducción de vídeo descargado por carga de archivos desde la carpeta de documentos (es decir, incluso cuando no está conectado a Internet)

Respuesta

1

me gustaría jugar el vídeo y averiguar dónde se almacena el archivo temporal . Si puede obtener acceso a él, cópielo en alguna carpeta del documento para verlo sin conexión.

+0

Sean, esa es una sugerencia. Pero la implementación que vi en algunas aplicaciones chinas muestra una descarga de progreso personalizada y permite jugar en cualquier momento después de la descarga, sin necesidad de jugarlo primero. Uno puede tener muchas descargas progresando al mismo tiempo. – Biko

+0

En mi sandbox (https://github.com/comonitos/youtube_video). Descargo video de youtube en la carpeta de documentos. Para mostrar el progreso, puede usar NSURLConnection delegate o ASIHTTPRequest (allseeing-i.com/ASIHTTPRequest): 1 aplicación que obtiene la url de youtube. 2 ASIHTTPRequest || NSURLConnection: descargue mostrando progreso. – comonitos

5

No sé personalmente cómo descargar videos de youtube (y el código es demasiado grande para poner una respuesta aquí).

Sin embargo, aquí hay un ejemplo completo de descarga de youtube here. Es un programa de descarga de youtube de código abierto llamado LoadTube: here's the a link to the source code.

+0

Gracias por los enlaces, ¡esto ayudará! – Biko

42

Para descargar el vídeo de YouTube:

  1. obtener la URL para descargar desde, a través de la API de YouTube o cualquier otro método.
  2. Crea un NSOutputStream o NSFileHandle abierto en un archivo temporal (en NSTemporaryDirectory() o un archivo con nombre temporal en el directorio de Documentos).
  3. Configure su barra de progreso y cualquier otra cosa que necesite hacer.
  4. Asigne e inicie una NSURLConnection para recuperar el archivo de la URL. No use sendSynchronousRequest:returningResponse:error:, por supuesto.
  5. En el método delegado connection:didReceiveResponse:, lea la longitud de los datos que se descargarán para actualizar correctamente la barra de progreso.
  6. En el método de delegado connection:didReceiveData:, escriba los datos en el controlador de secuencia/archivo de salida y actualice la barra de progreso según sea necesario.
  7. En connectionDidFinishLoading: o connection:didFailWithError:, cierre la secuencia de salida/identificador de archivo y cambie el nombre o elimine el archivo temporal según corresponda.

para reproducirla, sólo tiene que utilizar NSURL de fileURLWithPath: para crear una URL que apunta al archivo local en el directorio de documentos y jugar como lo haría con cualquier vídeo remoto.

+0

Gran respuesta Anomie - Voy a intentarlo lo antes posible. – Biko

+1

@Biko; no ser curioso pero, ¿funcionó? – Jake

+0

MiRAGe, se metió en el código de limpieza de https://github.com/iosdeveloper/MyTube - decidió ver si el mecanismo utilizado allí es robusto. Comprobaré la solución de Anomie después de eso. – Biko

6

Aquí está mi ejemplo: https://github.com/comonitos/youtube_video

Solía ​​clase PSYouTubeExtractor.h por Peter Steinberger Se puede obtener la URL de youtube video mp4 y que la descarga y visualización no es un problema

NSURLConnection + NSNotificationCenter + PSYouTubeExtractor + NSMutableData

7

he utilizado las clases de este proyecto: https://github.com/larcus94/LBYouTubeView Funciona bien para mí. Puedo descargar videos de youtube.

que utiliza este código:

LBYouTubeExtractor *extractor = [[[LBYouTubeExtractor alloc] initWithURL:[NSURL URLWithString:[NSString stringWithFormat:(@"http://www.youtube.com/watch?v=%@"), self.videoID ]] quality:LBYouTubeVideoQualityLarge] autorelease]; 
[extractor extractVideoURLWithCompletionBlock:^(NSURL *videoURL, NSError *error) { 
    if(!error) { 
     NSLog(@"Did extract video URL using completion block: %@", videoURL); 

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
      NSData *data = [NSData dataWithContentsOfURL: videoURL]; 
      NSString *pathToDocs = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
      NSString *filename = [NSString stringWithFormat:(@"video_%@.mp4"), self.videoID ]; 
      [data writeToFile:[pathTODocs stringByAppendingPathComponent:filename] atomically:YES]; 
      NSLog(@"File %@ successfully saved", filename); 
     }); 
    } else { 
     NSLog(@"Failed extracting video URL using block due to error:%@", error); 
    } 
}]; 

le puede mostrar el progreso de la descarga utilizando la técnica descrita en los puestos de arriba.

+1

Solución perfecta –

+0

The Perfect !!! – Trident

+0

@Petr, esto no funciona para mí ahora. ¿Puedes decirme por favor que está funcionando por ahora? –

Cuestiones relacionadas