Odtwarzaj filmy z YouTube za pomocą MPMoviePlayerController zamiast UIWebView

89

Próbuję przesyłać strumieniowo niektóre filmy z YouTube za pomocą MPMoviePlayerController, ale mam pewne problemy. Kod, którego używam, jest dość prosty i mogę odtwarzać filmy .m4v, przekazując adres URL do initWithContentURL. Kiedy uruchamiam odtwarzacz filmów, odtwarzacz pojawia się, ale po około 20 sekundach znika. Kiedy próbuję to w symulatorze, pojawia się widok alertu, który mówi, że serwer nie jest poprawnie skonfigurowany. Czy jest jakiś argument, który muszę przekazać z adresem URL, aby pobrać określony typ kanału wideo z 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];

Wypróbowałem również następujący adres URL http://www.youtube.com/watch?v=HGd9qAfpZio

Widziałem również argument & format = 1 i próbowałem dodać go na końcu obu ciągów, ale bez powodzenia.

jmurphy
źródło
Znalazłem więcej informacji, ale nadal nie działa. Ktoś zasugerował użycie tego jako adresu URL: youtube.com/get_video?video_id=ID&t=SIGNATURE&fmt=18 Podałem swój identyfikator wideo, ale nie wiem, co to jest podpis? A odtwarzacz wideo nadal zachowuje się tak samo. Otwiera odtwarzacz, a następnie zamyka po 10 do 20 sekundach.
jmurphy

Odpowiedzi:

78

Jedynym sposobem na odtworzenie wideo z YouTube we własnej aplikacji jest utworzenie UIWebViewz tagiem embed z YouTube filmu, który chcesz odtworzyć jako UIWebView'szawartość. UIWebViewwykryje, że osadzony obiekt to link do YouTube, a zawartość widoku internetowego będzie podglądem wideo w YouTube. Gdy użytkownik kliknie podgląd, wideo zostanie wyświetlone w MPMoviePlayerController. Jest to technika opisana pod linkiem, który udostępnił Muxecoid ( jak odtwarzać filmy z YouTube'a w aplikacji ) i jest to (o ile wiem) jedyny sposób na odtwarzanie wideo z YouTube w aplikacji. Nadal możesz uruchomić aplikację YouTube, przekazując adres URL YouTube do -[UIApplication openURL:], ale oczywiście powoduje to zamknięcie własnej aplikacji, co często jest niepożądane.

Niestety nie ma możliwości bezpośredniego odtwarzania wideo z MPMoviePlayerControllerYouTube, ponieważ youtube nie ujawnia bezpośrednich linków do plików wideo.

Bryan Henry
źródło
1
Tak, to jedyny sposób na odtwarzanie filmów z YouTube w Twojej aplikacji. Spędziłem 2 szukając alternatyw. Jakość też jest zła.
samvermette
Czy nadal nie ma innego wyjścia - po ponad 2 latach?
fabb
Czy istnieje możliwość uzyskania powiadomień PlaybackFinishReason i PlaybackState w przypadku odtwarzania filmu z YouTube jako osadzonego?
Roszit
7
To nie jedyny sposób. Możesz pobrać plik mp4 z Youtube. Robię to w moim projekcie AirPlayer Python , który umożliwia odtwarzanie filmów z YouTube na AppleTV. Przeportuję to i użyję go w moim bieżącym projekcie iOS i opublikuję tutaj kod, gdy będzie gotowy.
hellozimi
7
Niestety używanie bezpośredniego linku jest zabronione. Sekcja II / 10. na developers.google.com/youtube/terms : „Twój klient API nie będzie [...] uzyskiwał dostępu do żadnej części jakichkolwiek treści audiowizualnych YouTube w żaden inny sposób niż użycie odtwarzacza YouTube lub innego odtwarzacza wideo wyraźnie autoryzowanego przez YouTube;”
Lvsti
26

Jeśli używasz kodu:

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

Źródło:

Po prostu odeślij ten link

Upewnij się, że testujesz to na urządzeniu, a nie na symulatorze. Ponieważ symulator zawsze będzie wyświetlał znak zapytania z niebieskim pudełkiem (nie ma odtwarzacza quick time).

Jimit
źródło
23

Jak napisałem powyżej w swoim komentarzu, musiałem to zrobić w projekcie, nad którym pracowałem. Rozwiązałem ten problem i przesłałem kod na github.

Możesz sprawdzić źródło i rozwidlić je tutaj .

Zasadniczo pobiera adres URL YouTube i pobiera wszystkie adresy URL wideo zgodne z iOS.

Mam nadzieję, że to pomoże!
Twoje zdrowie

hellozimi
źródło
1
Dzięki! Przy okazji, aktualizacje rozwiązały problem z ostatnimi zmianami w YouTube.
Peter DeWeese
1
Nie jest to dozwolone zgodnie z Warunkami korzystania z usługi YouTube. Używasz go na własne ryzyko, ponieważ Twoja aplikacja może przestać działać w dowolnym momencie, jeśli YouTube zauważy, że nie przestrzegasz Warunków korzystania z usługi LUB jeśli YouTube zmieni generowany przez siebie kod osadzania.
Mathew
12

Właśnie natknąłem się na kogoś, kto był w stanie umieścić YouTubewideo w pliku MPMoviePlayerController. Obecnie wydaje się to możliwe.

LBYouTubeView

TPoschel
źródło
@Thanx działa dobrze, ale kiedy używam [mpplayer stop]; aby zatrzymać ten film, to wideo jest odtwarzane. ale chcę zatrzymać wideo
Jaspreet Singh
czy łącze github również odtwarza dźwięk w tle?
Khalid Usman
2

Aby odtwarzać filmy z tuby, musisz wyodrębnić adres URL przed przekazaniem go do MPMoviePlayer. Nie możesz grać bezpośrednio.

Moje repozytorium github ma wersję demonstracyjną tego.

Widzieć:

https://github.com/DpzAtMicRO/IOSYoutubePlayer

Wypróbuj, to umożliwia ładowanie i odtwarzanie wideo z YouTube bezpośrednio, MPMoviePlayerjak każdy inny film i jest również całkiem dobrym podejściem.

EDYCJA: Upewnij się, że dobrze przeczytałeś plik Readme.md, zanim użyjesz go w swoim projekcie

DD_
źródło
2
Niestety wbrew Warunkom korzystania z serwisu YouTube. Jeśli to zrobisz, możesz oczekiwać, że Twoja aplikacja będzie działać tylko wtedy, gdy YouTube nie wie, co robisz.
Mathew
Jakiś czas temu wysłałem e-mail do facetów z YouTube API, aby zapytać, czy mogę samodzielnie przeanalizować adres URL filmu; to jest cytat z odpowiedzi, którą otrzymałem: „Jedynym obsługiwanym mechanizmem jest osadzanie ramek iframe. Nasze ToS nie obsługują dostępu do strumienia surowego, z wyjątkiem strumieni RTSP o niskiej rozdzielczości, które zapewniamy dla telefonów z internetem”
Mathew
1
Przekonałeś mnie o przegłosowaniu; Zgadzam się, że powinno to być narzędzie do zaznaczania nieprawidłowości i że podbicie głosowe wystarczy, aby pokazać, które z tych odpowiedzi moim zdaniem są najbardziej odpowiednie dla osób próbujących rozwiązać problem osadzania w YouTube. Cholera, najwyraźniej StackOverflow blokuje mój głos przeciw i nie mogę go już usunąć, chyba że twoja odpowiedź zostanie zmieniona.
Mathew
świetny! Mogę wprowadzić zmiany i poprosić Cię o usunięcie Twojego głosu przeciw! ... Ale ... nie ma potrzeby ... niech tam będzie!
DD_,
@Mathew Wiele legalnych aplikacji na iOS robi tego rodzaju rzeczy (omijając API YouTube) i chociaż narusza to Warunki korzystania z usługi, jak wskazałeś, Google wydaje się nie mieć nic przeciwko w wielu przypadkach, ponieważ pozwala ich produktowi dotrzeć więcej widzów.
rmp251
1

Jest to tak proste, jak pobranie elementu src elementu iframe dla nowego kodu osadzania i wywołanie

[self.webView loadRequest:[NSURLRequest requestWithURL:self.url]];
jjxtra
źródło
0

Istnieje oficjalny sposób osadzania filmów z YouTube'a w aplikacji na iOS dostarczanej przez Google.

Zainstaluj bibliotekę przez cocoapods: pod "youtube-ios-player-helper"

import przez: #import “YTPlayerView.h” Użyj UIViewi ustaw klasę YTPlayerViewlub utwórz obiekt YTPlayerViewprogramowo.

Załaduj wideo: [self.playerView loadWithVideoId:@"M7lc1UVf-VE"];

Jest też playVideoi stopVideometody dostępne. Aby uzyskać więcej informacji, odwiedź ten link

Ganpat
źródło