Различия между AVPlayer и MPMoviePlayerController

Я разрабатываю приложение для iPhone, которому нужно воспроизводить видео. До сих пор я узнал, что для этого есть как минимум два API; AVPlayer и MPMoviePlayerController.

В чем основные отличия?

Ответ 1

ПРИМЕЧАНИЕ, начиная с iOS9, Apple устарела MPMoviePlayerController:

Класс MPMoviePlayerController формально не рекомендуется в iOS 9. (Класс MPMoviePlayerViewController также формально не рекомендуется.) Для воспроизведения видеоконтента в iOS 9 и более поздних версиях вместо этого используйте класс AVPictureInPictureController или AVPlayerViewController из инфраструктуры AVKit или класс WKWebView из Web-класса.

Скопировано из ссылки MPMoviePlayerController.

AVPlayer

AVPlayer дает вам гораздо больше гибкости, но довольно плохо документирован. Использование этого API заставит вас создать свой собственный интерфейс. AVFoundation (платформа, которая предоставляет вам AVPlayer), как правило, немного сложна для пользователя (кодера), поскольку вынуждает вас использовать Key-Value Наблюдение за проверкой состояний. Концепция KVO великолепна, не поймите меня неправильно - тем не менее, для неопытных разработчиков может быть больно учиться. Apple иногда пропускает информацию о том, какие свойства на самом деле соответствуют KVO, и это заставит вас поэкспериментировать.

Одним большим преимуществом AVPlayer сравнению с MPMoviePlayerController может быть, например, его расширенная версия AVQueuePlayer как она способна воспроизводить несколько источников видео без AVQueuePlayer. Другим преимуществом, безусловно, является многофункциональная AVFoundation позволяющая выполнять такие вещи, как AVFoundation кодирование/преобразование фильмов на лету.

Еще одним огромным преимуществом AVPlayer является тот факт, что вы можете воспроизводить несколько источников видео одновременно (например, бок о бок) без каких-либо проблем.

MPMoviePlayerController

MPMoviePlayerController прост в использовании и покрывает большинство потребностей из коробки. Использование этого API даст вам красивый и понятный пользовательский интерфейс. Пользовательский интерфейс, однако, может быть отключен и/или заменен пользовательским.

Для изменения статуса MPMoviePlayerController использует несколько NSNotifications охватывающих все, что нужно обычному приложению.

Под капотом MPMoviePlayerController строится поверх AVPlayer - но на самом деле это происходит полностью прозрачно для пользователя - у вас нет доступа к этому слою при использовании MPMoviePlayerController.

MPMoviePlayerController использует MPMoviePlayerController AVPlayer в качестве одноэлементного экземпляра, поэтому невозможно использовать несколько экземпляров MPMoviePlayerController для одновременного воспроизведения видео.

С другой стороны, как только вы пытаетесь расширить функциональность MPMoviePlayerController с помощью своих собственных функций, код быстро становится неприятным - например, вы, возможно, начнете использовать несколько таймеров для покрытия таких вещей, как правильное обнаружение голодания (на самом деле, эта функция получила включены в версию этого класса для iOS5), пользовательские обновления пользовательского интерфейса,... Или вы можете в конечном итоге иметь более чем несколько свойств состояний, пытаясь охватить такие вещи, как постепенное прерывание воспроизведения, пока проигрыватель все еще выполняет предварительную буферизацию.


Персональная рекомендация

Я использовал оба, и я буду продолжать использовать оба, в зависимости от потребностей приложения, которое я имею удовольствие создавать. Для большинства (простых) проектов я бы рекомендовал использовать MPMoviePlayerController поверх AVPlayer поскольку он очень прост в использовании и всего за несколько строк кода вы получаете полноценный медиаплеер. И если ваши требования к воспроизведению мультимедиа еще проще, загляните в MPMoviePlayerViewController (обратите внимание, что View-part).