Różnice między AVPlayer i MPMoviePlayerController [zamknięte]

87

Tworzę aplikację na iPhone'a, która musi odtwarzać filmy. Jak dotąd dowiedziałem się, że są co najmniej dwa API do osiągnięcia tego; AVPlayeri MPMoviePlayerController.

Jakie są główne różnice?

suse
źródło
4
Próbowałem przeformułować to pytanie, aby upewnić się, że nie generuje ono odpowiedzi opartych na opiniach.
Do

Odpowiedzi:

173

UWAGA od iOS9 firma Apple wycofała MPMoviePlayerController:

Klasa MPMoviePlayerController jest formalnie przestarzała w systemie iOS 9. (Klasa MPMoviePlayerViewController również jest formalnie przestarzała). Aby odtwarzać zawartość wideo w systemie iOS 9 i nowszych, zamiast tego użyj klasy AVPictureInPictureController lub AVPlayerViewController ze środowiska AVKit albo klasy WKWebView z WebKit.

Skopiowano z referencji MPMoviePlayerController .

AVPlayer

AVPlayerdaje dużo większą elastyczność, ale jest dość słabo udokumentowany. Korzystanie z tego interfejsu API zmusi Cię do stworzenia własnego interfejsu użytkownika. AVFoundation(framework, który cię dostarcza AVPlayer) generalnie jest trochę trudny dla użytkownika (programisty), ponieważ zmusza cię do używania obserwowania kluczowych wartości do sprawdzania stanów. Koncepcja KVO jest świetna, nie zrozumcie mnie źle - jednak dla niedoświadczonych programistów nauka może być bolesna. Apple czasami pomija informacje o tym, które właściwości są w rzeczywistości zgodne z KVO, co zmusi Cię do przeprowadzenia pewnych eksperymentów.

Dużą zaletą AVPlayerponad MPMoviePlayerControllerbyłoby na przykład jego rozszerzoną wersję, AVQueuePlayerponieważ umożliwia ona odtwarzanie bez przerw z wielu źródeł filmowych. Inną zaletą jest z pewnością bogata w funkcje AVFoundationstruktura, która pozwala na takie rzeczy, jak kompozycja / kodowanie / konwersja filmu w locie.

Kolejną ogromną zaletą programu AVPlayerjest fakt, że można bez problemu odtwarzać jednocześnie wiele źródeł wideo (np. Obok siebie).

MPMoviePlayerController

MPMoviePlayerControllerjest łatwy w użyciu i zaspokaja większość potrzeb po wyjęciu z pudełka. Korzystanie z tego interfejsu API zapewni dobrze wyglądający i powszechnie zrozumiały interfejs użytkownika. Interfejs użytkownika można jednak wyłączyć i zastąpić niestandardowym.

W przypadku zmian statusu MPMoviePlayerControllerużywa kilku NSNotificationsobejmujących wszystko, czego potrzebuje zwykła aplikacja.

Pod maską, MPMoviePlayerControllerbuduje się na wierzchu AVPlayer- ale w rzeczywistości dzieje się to całkowicie niewidoczne dla użytkownika - nie masz dostępu do tej warstwy podczas używania MPMoviePlayerController.

MPMoviePlayerControllerużywa podkładania AVPlayerjako pojedynczej instancji, dlatego nie jest możliwe jednoczesne używanie wielu instancji programu MPMoviePlayerControllerdo odtwarzania wideo.

Z drugiej strony, gdy tylko spróbujesz rozszerzyć funkcjonalność o MPMoviePlayerControllerwłasne funkcje, kod szybko stanie się nieprzyjemny - np. Prawdopodobnie zaczniesz używać wielu timerów do pokrycia rzeczy takich jak prawidłowe wykrywanie głodu (w rzeczywistości ta funkcja została dołączona do wersji tej klasy na iOS5), niestandardowe aktualizacje interfejsu użytkownika, ... Lub możesz skończyć mając więcej niż kilka właściwości stanu, próbujących pokryć takie rzeczy, jak wdzięczne przerwanie odtwarzania, podczas gdy odtwarzacz nadal buforuje.


Osobista rekomendacja

Korzystałem z obu i nadal będę korzystać z obu, w zależności od potrzeb aplikacji, którą mam przyjemność zbudować. W przypadku większości (prostych) projektów polecałbym użycie MPMoviePlayerControllerover, AVPlayerponieważ jest bardzo prosty w użyciu i wystarczy kilka wierszy kodu, aby uzyskać pełnoprawny odtwarzacz multimedialny. A jeśli Twoje wymagania dotyczące odtwarzania multimediów są jeszcze prostsze, rzuć okiem na MPMoviePlayerViewController(zwróć uwagę na tę część dotyczącą widoku).

Do
źródło
2
AVPlayer pozwala także automatycznie używać animacji warstw. Jeśli chcesz uruchomić Core Animation w tle, nie używaj MPMoviePlayerController, chociaż może mieć ustawienie umożliwiające ich włączenie, po prostu pamiętaj o tym, jeśli używasz rzeczy CALayer
Stephen J
3
Nie. Odpowiedź jest prawidłowa. Interfejs użytkownika MPMoviePlayerController można wyłączyć i zastąpić niestandardowym.
Dave Batton,
1
@Besi nie, całkowicie poprawne, jak napisano - zdecydowanie można je wyłączyć (za pomocą MPMovieControlStyleNone) i tym samym zastąpić, ponieważ nic nie powstrzymuje Cię przed dodaniem własnego widoku jako rodzeństwa widoku MPMoviePlayerControllera lub bezpośrednio na jego backgroundView.
Do
8
Od iOS 9 MPMoviePlayerController jest przestarzały, więc powinieneś używać AVPlayera w przyszłych projektach
lewis
1
To bardzo cenna informacja @ lewis42 - dodam ją do mojego starożytnego postu :)
Do