Reproduzca videos de YouTube con MPMoviePlayerController en lugar de UIWebView

89

Estoy tratando de transmitir algunos videos de YouTube usando MPMoviePlayerController, pero tengo algunos problemas. El código que estoy usando es bastante simple y puedo reproducir videos .m4v pasando una URL a initWithContentURL. Cuando ejecuto el reproductor de películas, el reproductor aparece pero desaparece después de unos 20 segundos. Cuando lo intento en el simulador, aparece una vista de alerta que dice que el servidor no está configurado correctamente. ¿Hay algún argumento que deba pasar con la URL para obtener un tipo específico de transmisión de video de Google?

NSURL *videoURL = [NSURL URLWithString:@"http://www.youtube.com/v/HGd9qAfpZio&hl=en_US&fs=1&"];
MPMoviePlayerController *moviePlayer;
moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:videoURL];

[moviePlayer play];

También probé la siguiente URL http://www.youtube.com/watch?v=HGd9qAfpZio

También vi el argumento & formato = 1 y traté de agregarlo al final de ambas cadenas, pero no tuve suerte.

jmurphy
fuente
Encontré más información pero todavía no funciona. Alguien sugirió usar esto para una URL: youtube.com/get_video?video_id=ID&t=SIGNATURE&fmt=18 Ingresé mi ID de video pero no sé qué es la firma. Y el reproductor de video sigue comportándose igual. Abre el reproductor y luego se cierra después de 10 a 20 segundos.
jmurphy

Respuestas:

78

La única forma de reproducir un video de YouTube dentro de su propia aplicación es crear una UIWebViewetiqueta de inserción de Youtube para la película que desea reproducir como UIWebView'scontenido. UIWebViewdetectará que el objeto incrustado es un enlace de Youtube, y el contenido de la vista web será la vista previa de YouTube del video. Cuando su usuario haga clic en la vista previa, el video se mostrará en un MPMoviePlayerController. Esta es la técnica descrita en el enlace que proporcionó Muxecoid ( cómo reproducir videos de YouTube dentro de una aplicación ), y esta es (hasta donde yo sé) la única forma de reproducir un video de YouTube dentro de una aplicación. Aún puede hacer que se inicie la aplicación de Youtube pasando la URL de youtube a -[UIApplication openURL:], pero por supuesto esto cierra su propia aplicación, lo que a menudo no es deseable.

Desafortunadamente, no hay forma de reproducir directamente un video de MPMoviePlayerControlleryoutube porque youtube no expone enlaces directos a los archivos de video.

Bryan Henry
fuente
1
Sí, esa es la única forma de reproducir videos de YouTube en su aplicación. Pasé 2 buscando alternativas. La calidad también es algo mala.
Samvermette
¿Todavía no hay otra manera, después de más de 2 años?
fabb
¿Existe la posibilidad de obtener las notificaciones PlaybackFinishReason y PlaybackState en caso de reproducir un video de YouTube incrustado?
Roshit
7
Ésta no es la única forma. Puede obtener el archivo mp4 de Youtube. Lo hago en mi proyecto AirPlayer Python , que te permite reproducir videos de YouTube en tu AppleTV. Lo portaré y lo usaré en mi proyecto actual de iOS y publicaré el código aquí cuando esté listo.
hellozimi
7
Desafortunadamente, el uso de un enlace directo está prohibido. Sección II / 10. en developers.google.com/youtube/terms : "Su Cliente API no accederá [...] a ninguna parte de ningún contenido audiovisual de YouTube por ningún medio que no sea el uso de un reproductor de YouTube u otro reproductor de video expresamente autorizado por YouTube";
Lvsti
26

Si está usando Code:

- (void)embedYouTube:(NSString*)url frame:(CGRect)frame {  
     NSString* embedHTML = @"\ 
        <html><head>\ 
     <style type=\"text/css\">\ 
     body {\ 
     background-color: transparent;\ 
     color: white;\ 
    }\ 
   </style>\ 
    </head><body style=\"margin:0\">\ 
       <embed id=\"yt\" src=\"%@\" type=\"application/x-shockwave-flash\" \ 
    width=\"%0.0f\" height=\"%0.0f\"></embed>\ 
       </body></html>";  
   NSString* html = [NSString stringWithFormat:embedHTML, url, frame.size.width, frame.size.height];  
   if(videoView == nil) {  
      videoView = [[UIWebView alloc] initWithFrame:frame];  
     [self.view addSubview:videoView];  
    }  
    [videoView loadHTMLString:html baseURL:nil];  
  }

Fuente:

Solo refiera este enlace

Asegúrese de probarlo en el dispositivo y no en el simulador. Dado que el simulador siempre mostrará un signo de interrogación con un cuadro azul (no tiene un reproductor de tiempo rápido).

Jimit
fuente
23

Como escribí anteriormente en mi comentario, tenía que hacer esto en un proyecto en el que estaba trabajando. Resolví este problema y envié el código en github.

Puede verificar la fuente y bifurcarla aquí .

Básicamente, toma una URL de YouTube y obtiene todas las URL de video compatibles con iOS.

¡Espero que esto sea de ayuda!
Salud

holazimi
fuente
1
¡Gracias! Por cierto, las actualizaciones solucionaron el problema con los cambios recientes de YouTube.
Peter DeWeese
1
Esto no está permitido bajo las Condiciones de servicio de YouTube. Úselo bajo su propio riesgo, porque su aplicación puede dejar de funcionar en cualquier momento si YouTube nota que no está siguiendo los ToS O si YouTube cambia el código de inserción que genera.
Mathew
13

Me encontré con alguien que pudo colocar un YouTubevideo dentro de un MPMoviePlayerController. Parece posible ahora.

LBYouTubeView

TPoschel
fuente
@ Gracias, está funcionando bien, pero cuando uso [mpplayer stop]; para detener este video, entonces el video se está ejecutando. pero quiero detener el video
Jaspreet Singh
¿El enlace de github también reproduce el audio en segundo plano?
Khalid Usman
2

Para reproducir videos de YouTube, debe extraer la URL antes de pasarla a MPMoviePlayer. No puedes jugarlo directamente.

Mi repositorio de github tiene una implementación de demostración de esto.

Ver:

https://github.com/DpzAtMicRO/IOSYoutubePlayer

Pruébelo, esto hace posible cargar y reproducir videos de YouTube directamente MPMoviePlayercomo cualquier otro video y también es un enfoque bastante bueno.

EDITAR: asegúrese de revisar bien el Readme.md antes de usar esto en su proyecto

DD_
fuente
2
Contra los ToS de YouTube, desafortunadamente. Si hace esto, solo puede esperar que su aplicación funcione mientras YouTube no sepa lo que está haciendo.
Mathew
También envié un correo electrónico a los chicos de la API de YouTube hace un tiempo para preguntarles si estaría bien que yo mismo analizara la URL del video; esta es una cita de la respuesta que recibí: "El único mecanismo admitido es la inserción de iframe. El acceso a la transmisión sin procesar no es compatible con nuestras Condiciones de servicio, aparte de las transmisiones RTSP de baja resolución que ofrecemos para los teléfonos con funciones"
Mathew
1
Me ha convencido en el punto de las votaciones negativas; Estoy de acuerdo en que debería ser una herramienta para marcar incorrecciones, y que votar a favor es suficiente para mostrar cuáles de estas respuestas creo que son más relevantes para las personas que intentan resolver el problema de inserción de YouTube. Maldita sea, aparentemente StackOverflow bloquea mi voto negativo y no puedo eliminarlo más a menos que se edite su respuesta.
Mathew
¡Excelente! ¡Puedo hacer una edición y solicitarle que elimine su voto negativo en ese momento! ... Pero ... no es necesario ... ¡que esté ahí!
DD_
@Mathew Muchas aplicaciones legítimas de iOS están haciendo este tipo de cosas (sin pasar por la API de YouTube) y, aunque viola las Condiciones de servicio, como ha estado señalando, a Google no parece importarle en muchos casos, ya que permite que su producto alcance más espectadores.
rmp251
1

Es tan simple como tomar el elemento src del iframe para el nuevo código de inserción y llamar

[self.webView loadRequest:[NSURLRequest requestWithURL:self.url]];
jjxtra
fuente
0

Existe una forma oficial de incrustar videos de YouTube en la aplicación de iOS proporcionada por Google.

Instalar la biblioteca a través de cocoapods: pod "youtube-ios-player-helper"

importar por: #import “YTPlayerView.h” Use UIViewy establezca la clase YTPlayerViewo cree un objeto deYTPlayerView programación

Cargar video: [self.playerView loadWithVideoId:@"M7lc1UVf-VE"];

También existe playVideoy stopVideométodos disponibles. Para más información visite este enlace

Ganpat
fuente