Riproduci video di YouTube con MPMoviePlayerController invece di UIWebView


89

Sto provando a trasmettere in streaming alcuni video di YouTube utilizzando MPMoviePlayerController ma ho dei problemi. Il codice che sto usando è piuttosto semplice e posso riprodurre video .m4v passando un URL a initWithContentURL. Quando avvio il lettore di film, il lettore si accende ma scompare dopo circa 20 secondi. Quando lo provo nel simulatore ottengo una visualizzazione di avviso che dice che il server non è configurato correttamente. C'è un argomento che devo passare con l'URL per ottenere un tipo specifico di feed video da 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];

Ho anche provato il seguente URL http://www.youtube.com/watch?v=HGd9qAfpZio

Ho anche visto l'argomento & format = 1 e ho provato ad aggiungerlo alla fine di entrambe le stringhe ma senza fortuna.


Ho trovato qualche informazione in più ma ancora non funziona. Qualcuno ha suggerito di utilizzare questo per un URL: youtube.com/get_video?video_id=ID&t=SIGNATURE&fmt=18 Ho inserito il mio ID video ma non so quale sia la firma? E il lettore video si comporta ancora allo stesso modo. Apre il lettore, quindi si chiude dopo 10-20 secondi.
jmurphy

Risposte:


78

L'unico modo per riprodurre un video di YouTube all'interno della tua app è creare un UIWebViewcon il tag di incorporamento da Youtube per il film che desideri riprodurre come UIWebView'scontenuto. UIWebViewrileverà che l'oggetto incorporato è un collegamento Youtube e il contenuto della visualizzazione web sarà l'anteprima di YouTube per il video. Quando l'utente fa clic sull'anteprima, il video verrà mostrato in un MPMoviePlayerController. Questa è la tecnica descritta al collegamento fornito da Muxecoid ( come riprodurre i video di YouTube all'interno di un'applicazione ), e questo è (per quanto ne so) l'unico modo per riprodurre un video di YouTube all'interno di un'applicazione. Puoi ancora avviare l'applicazione Youtube passando l'URL di YouTube a -[UIApplication openURL:], ma ovviamente questo chiude la tua applicazione che è spesso indesiderabile.

Sfortunatamente, non c'è modo di riprodurre direttamente un video di YouTube con MPMoviePlayerControllerperché YouTube non espone collegamenti diretti ai file video.


1
Sì, è l'unico modo per riprodurre i video di YouTube nella tua app. Ho speso 2 alla ricerca di alternative. Anche la qualità è pessima.
samvermette

Non c'è ancora altro modo - dopo più di 2 anni?
fabb

C'è la possibilità di ricevere le notifiche PlaybackFinishReason e PlaybackState in caso di riproduzione di un video di YouTube come incorporato?
Roshit

7
Questo non è l'unico modo. Puoi ottenere il file mp4 da Youtube. Lo faccio nel mio progetto AirPlayer Python , che ti consente di riprodurre video di YouTube sulla tua AppleTV. Lo trasferirò e lo userò nel mio attuale progetto iOS e posterò il codice qui quando sarà pronto.
hellozimi

7
Purtroppo l'utilizzo di un collegamento diretto è vietato. Sezione II / 10. in developers.google.com/youtube/terms : "Il tuo client API non accederà [...] ad alcuna parte di alcun contenuto audiovisivo di YouTube con alcun mezzo diverso dall'uso di un lettore YouTube o altro lettore video espressamente autorizzato da YouTube;"
Lvsti

26

Se utilizzi il codice:

- (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];  
  }

Fonte:

Fai riferimento a questo link

Assicurati di testarlo sul dispositivo e non sul simulatore. Dal momento che il simulatore mostrerà sempre un punto interrogativo con un riquadro blu (non ha un lettore quick-time).


23

Come ho scritto sopra nel mio commento ho dovuto farlo in un progetto a cui stavo lavorando. Ho risolto questo problema e inviato il codice su GitHub.

Puoi controllare la fonte e fare il fork qui .

Fondamentalmente richiede un URL di YouTube e ottiene tutti gli URL video compatibili con iOS.

Spero che questo sia di aiuto!
Saluti


1
Grazie! A proposito, gli aggiornamenti hanno risolto il problema con le recenti modifiche di YouTube.
Peter DeWeese

1
Ciò non è consentito dai Termini di servizio di YouTube. Usalo a tuo rischio, perché la tua app potrebbe smettere di funzionare in qualsiasi momento se YouTube nota che non stai seguendo i Termini di servizio OPPURE se YouTube cambia il codice di incorporamento che genera.
Mathew

13

Mi sono appena imbattuto in qualcuno che è stato in grado di inserire un YouTubevideo all'interno di un file MPMoviePlayerController. Ora sembra possibile.

LBYouTubeView


@ Grazie funziona bene ma quando uso [mpplayer stop]; per fermare questo video, il video è in esecuzione. ma voglio fermare il video
Jaspreet Singh

il collegamento GitHub riproduce anche l'audio in background?
Khalid Usman

2

Per riprodurre i video di YouTube è necessario estrarre l'URL prima di passare l'URL in MPMoviePlayer. Non puoi riprodurlo direttamente.

Il mio repository GitHub ha un'implementazione demo di questo.

Vedere:

https://github.com/DpzAtMicRO/IOSYoutubePlayer

Provalo, questo rende possibile caricare e riprodurre i video di YouTube direttamente MPMoviePlayercome qualsiasi altro video ed è anche un approccio abbastanza buono.

EDIT: assicurati di leggere bene il file Readme.md prima di utilizzarlo nel tuo progetto


2
Contro i ToS di YouTube, sfortunatamente. Se lo fai, puoi aspettarti che la tua app funzioni finché YouTube non è a conoscenza di ciò che stai facendo.
Mathew

Ho anche inviato un'e-mail ai ragazzi dell'API di YouTube qualche tempo fa per chiedere se sarebbe stato ok per me analizzare l'URL del video da solo; questa è una citazione dalla risposta che ho ricevuto: "L'unico meccanismo supportato è l'incorporamento dell'iframe. L'accesso allo streaming raw non è supportato dai nostri ToS diversi dagli stream RTSP a bassa risoluzione che forniamo per i feature phone"
Mathew

1
Mi hai convinto sul punto di downvoting; Sono d'accordo sul fatto che dovrebbe essere uno strumento per contrassegnare l'erroneità e che il voto positivo è sufficiente per mostrare quale di queste risposte penso siano più rilevanti per le persone che cercano di risolvere il problema dell'incorporamento di YouTube. Dannazione, a quanto pare StackOverflow blocca il mio voto negativo e non posso più rimuoverlo a meno che la tua risposta non venga modificata.
Mathew

grande! Posso fare una modifica e chiederti di rimuovere il tuo voto negativo allora! ... Ma ... non c'è bisogno..che sia lì!
GG_

@Mathew Molte app iOS legittime stanno facendo questo genere di cose (bypassando l'API di YouTube) e sebbene violi il ToS come hai sottolineato, a Google in molti casi non sembra importare poiché consente al loro prodotto di raggiungere più spettatori.
rmp251

1

È semplice come prendere l'elemento src dell'iframe per il nuovo codice di incorporamento e chiamare

[self.webView loadRequest:[NSURLRequest requestWithURL:self.url]];


0

Esiste un modo ufficiale per incorporare i video di YouTube nell'applicazione iOS fornito da Google.

Installa la libreria tramite cocoapods: pod "youtube-ios-player-helper"

import by: #import “YTPlayerView.h” usa UIViewe imposta la classe YTPlayerViewo crea un oggetto di YTPlayerViewprogrammaticamente.

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

Ci sono anche playVideoe stopVideometodi disponibili. Per maggiori informazioni visita questo link

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.