Reproduza vídeos do YouTube com MPMoviePlayerController em vez de UIWebView

89

Estou tentando transmitir alguns vídeos do YouTube usando o MPMoviePlayerController, mas estou tendo alguns problemas. O código que estou usando é muito simples e posso reproduzir vídeos .m4v passando uma URL para initWithContentURL. Quando eu inicio o reprodutor de filmes, o reprodutor é ativado, mas desaparece após cerca de 20 segundos. Quando tento no simulador, recebo um alerta que diz que o servidor não está configurado corretamente. Preciso passar um argumento com o URL para obter um tipo específico de feed de vídeo do 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];

Também tentei o seguinte URL http://www.youtube.com/watch?v=HGd9qAfpZio

Também vi o argumento & format = 1 e tentei adicioná-lo ao final de ambas as strings, mas sem sorte.

jmurphy
fonte
Encontrei mais algumas informações, mas ainda não funciona. Alguém sugeriu usar isso para um URL: youtube.com/get_video?video_id=ID&t=SIGNATURE&fmt=18 Coloquei meu ID de vídeo, mas não sei o que é assinatura? E o player de vídeo ainda se comporta da mesma forma. Ele abre o player e fecha após 10 a 20 segundos.
jmurphy

Respostas:

78

A única maneira de reproduzir um vídeo do YouTube em seu próprio aplicativo é criar um UIWebViewcom a tag embed do Youtube para o filme que você deseja reproduzir como UIWebView'sconteúdo. UIWebViewdetectará que o objeto incorporado é um link do Youtube e o conteúdo da visualização da web será a visualização do YouTube do vídeo. Quando o usuário clicar na visualização, o vídeo será mostrado em um MPMoviePlayerController. Esta é a técnica descrita no link fornecido pelo Muxecoid ( como reproduzir vídeos do YouTube em um aplicativo ), e esta é (até onde eu sei) a única maneira de reproduzir um vídeo do YouTube em um aplicativo. Você ainda pode iniciar o aplicativo Youtube passando o URL do youtube para -[UIApplication openURL:], mas é claro que isso fecha seu próprio aplicativo, o que muitas vezes é indesejável.

Infelizmente, não há como reproduzir diretamente um vídeo do MPMoviePlayerControlleryoutube porque o youtube não expõe links diretos para os arquivos de vídeo.

Bryan Henry
fonte
1
Sim, essa é a única maneira de reproduzir vídeos do YouTube em seu aplicativo. Passei 2 procurando alternativas. A qualidade também é ruim.
samvermette 01 de
Ainda não há outra maneira - depois de mais de 2 anos?
fabb
Existe a possibilidade de obter as notificações PlaybackFinishReason e PlaybackState no caso de reproduzir um vídeo do YouTube como incorporado?
Roshit
7
Esta não é a única maneira. Você pode obter o arquivo mp4 no Youtube. Eu faço isso no meu projeto AirPlayer Python , que permite que você reproduza vídeos do YouTube em sua AppleTV. Vou portar isso e usá-lo em meu projeto iOS atual e postar o código aqui quando estiver pronto.
hellozimi
7
Infelizmente, o uso de um link direto é proibido. Seção II / 10. em developers.google.com/youtube/terms : "Seu cliente API não acessará [...] qualquer parte de qualquer conteúdo audiovisual do YouTube por qualquer meio que não seja o uso de um player do YouTube ou outro player de vídeo expressamente autorizado pelo YouTube;"
Lvsti
26

Se você estiver usando o código:

- (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:

Apenas consulte este link

Certifique-se de testá-lo no dispositivo e não no simulador. Já que o simulador sempre exibirá um ponto de interrogação com uma caixa azul (ele não tem um player de tempo rápido).

Jimit
fonte
23

Como escrevi acima em meu comentário, tive que fazer isso em um projeto em que estava trabalhando. Resolvi esse problema e enviei o código no github.

Você pode verificar a fonte e fazer um fork aqui .

Basicamente, ele pega um url do youtube e obtém todos os urls de vídeo compatíveis com iOS.

Espero que seja para alguma ajuda!
Felicidades

hellozimi
fonte
1
Obrigado! BTW, as atualizações corrigiram o problema com as alterações recentes do YouTube.
Peter DeWeese,
1
Isso não é permitido pelo ToS do YouTube. Use-o por sua própria conta e risco, pois seu aplicativo pode parar de funcionar a qualquer momento se o YouTube perceber que você não está seguindo os ToS OU se o YouTube alterar o código de incorporação que gera.
Mathew,
13

Acabei de encontrar alguém que conseguiu colocar um YouTubevídeo dentro de um MPMoviePlayerController. Parece possível agora.

LBYouTubeView

TPoschel
fonte
@Obrigado, está funcionando bem, mas quando eu uso [mpplayer stop]; para parar este vídeo, então ele está rodando. mas eu quero parar o vídeo
Jaspreet Singh
o link do github também reproduz o áudio em segundo plano?
Khalid Usman
2

Para reproduzir vídeos do you tube, você precisa extrair o url antes de passar o url para o MPMoviePlayer. Você não pode jogar diretamente.

Meu repo github tem uma implementação de demonstração disso.

Vejo:

https://github.com/DpzAtMicRO/IOSYoutubePlayer

Experimente, isso torna possível carregar e reproduzir vídeos do YouTube diretamente MPMoviePlayercomo qualquer outro vídeo e é uma abordagem muito boa também.

EDITAR: certifique-se de ler o Readme.md bem antes de usá-lo em seu projeto

DD_
fonte
2
Contra os ToS do YouTube, infelizmente. Se você fizer isso, seu aplicativo só funcionará enquanto o YouTube não souber o que você está fazendo.
Mathew
Eu enviei um e-mail para o pessoal da API do YouTube há algum tempo para perguntar se estaria tudo bem se eu mesmo analisasse a URL do vídeo; esta é uma citação da resposta que recebi: "O único mecanismo suportado é o iframe embed. O acesso a stream bruto não é suportado por nossos ToS, exceto os streams RTSP de baixa resolução que fornecemos para feature phones"
Mathew
1
Você me convenceu sobre o ponto de downvoting; Concordo que deve ser uma ferramenta para marcar o que está incorreto e que votar a favor é suficiente para mostrar quais dessas respostas eu acho que são mais relevantes para as pessoas que estão tentando resolver o problema de incorporação do YouTube. Droga, aparentemente StackOverflow bloqueia meu downvote e não posso mais removê-lo, a menos que sua resposta seja editada.
Mathew
ótimo! Eu posso fazer uma edição e solicitar que você remova seu voto negativo! ... Mas ... não precisa..deixa estar aí!
DD_
@Mathew Muitos aplicativos iOS legítimos estão fazendo esse tipo de coisa (contornando a API do YouTube) e, embora viole os ToS, como você apontou, o Google não parece se importar em muitos casos, pois permite que seu produto alcance mais espectadores.
rmp251
1

É tão simples quanto pegar o elemento src do iframe para o novo código embed e chamar

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

Existe uma maneira oficial de incorporar vídeo do YouTube no aplicativo iOS que é fornecido pelo Google.

Instale a biblioteca via cocoapods: pod "youtube-ios-player-helper"

importar por: #import “YTPlayerView.h” Use UIViewe defina a classe YTPlayerViewou crie um objeto deYTPlayerView programática.

Carregar vídeo: [self.playerView loadWithVideoId:@"M7lc1UVf-VE"];

Há também playVideoe stopVideométodos disponíveis. Para mais informações visite este Link

Ganpat
fonte