Я разрабатываю приложение для iPhone, которому нужно воспроизводить видео.
До сих пор я узнал, что для этого есть как минимум два API; AVPlayer
и MPMoviePlayerController
.
В чем основные отличия?
Я разрабатываю приложение для iPhone, которому нужно воспроизводить видео.
До сих пор я узнал, что для этого есть как минимум два API; AVPlayer
и MPMoviePlayerController
.
В чем основные отличия?
ПРИМЕЧАНИЕ, начиная с iOS9, Apple устарела MPMoviePlayerController:
Класс MPMoviePlayerController формально не рекомендуется в iOS 9. (Класс MPMoviePlayerViewController также формально не рекомендуется.) Для воспроизведения видеоконтента в iOS 9 и более поздних версиях вместо этого используйте класс AVPictureInPictureController или AVPlayerViewController из инфраструктуры AVKit или класс WKWebView из Web-класса.
Скопировано из ссылки MPMoviePlayerController.
AVPlayer
дает вам гораздо больше гибкости, но довольно плохо документирован. Использование этого API заставит вас создать свой собственный интерфейс. AVFoundation
(платформа, которая предоставляет вам AVPlayer
), как правило, немного сложна для пользователя (кодера), поскольку вынуждает вас использовать Key-Value Наблюдение за проверкой состояний. Концепция KVO великолепна, не поймите меня неправильно - тем не менее, для неопытных разработчиков может быть больно учиться. Apple иногда пропускает информацию о том, какие свойства на самом деле соответствуют KVO, и это заставит вас поэкспериментировать.
Одним большим преимуществом AVPlayer
сравнению с MPMoviePlayerController
может быть, например, его расширенная версия AVQueuePlayer
как она способна воспроизводить несколько источников видео без AVQueuePlayer
. Другим преимуществом, безусловно, является многофункциональная AVFoundation
позволяющая выполнять такие вещи, как AVFoundation
кодирование/преобразование фильмов на лету.
Еще одним огромным преимуществом AVPlayer
является тот факт, что вы можете воспроизводить несколько источников видео одновременно (например, бок о бок) без каких-либо проблем.
MPMoviePlayerController
прост в использовании и покрывает большинство потребностей из коробки. Использование этого API даст вам красивый и понятный пользовательский интерфейс. Пользовательский интерфейс, однако, может быть отключен и/или заменен пользовательским.
Для изменения статуса MPMoviePlayerController
использует несколько NSNotifications
охватывающих все, что нужно обычному приложению.
Под капотом MPMoviePlayerController
строится поверх AVPlayer
- но на самом деле это происходит полностью прозрачно для пользователя - у вас нет доступа к этому слою при использовании MPMoviePlayerController
.
MPMoviePlayerController
использует MPMoviePlayerController
AVPlayer
в качестве одноэлементного экземпляра, поэтому невозможно использовать несколько экземпляров MPMoviePlayerController
для одновременного воспроизведения видео.
С другой стороны, как только вы пытаетесь расширить функциональность MPMoviePlayerController
с помощью своих собственных функций, код быстро становится неприятным - например, вы, возможно, начнете использовать несколько таймеров для покрытия таких вещей, как правильное обнаружение голодания (на самом деле, эта функция получила включены в версию этого класса для iOS5), пользовательские обновления пользовательского интерфейса,... Или вы можете в конечном итоге иметь более чем несколько свойств состояний, пытаясь охватить такие вещи, как постепенное прерывание воспроизведения, пока проигрыватель все еще выполняет предварительную буферизацию.
Персональная рекомендация
Я использовал оба, и я буду продолжать использовать оба, в зависимости от потребностей приложения, которое я имею удовольствие создавать. Для большинства (простых) проектов я бы рекомендовал использовать MPMoviePlayerController
поверх AVPlayer
поскольку он очень прост в использовании и всего за несколько строк кода вы получаете полноценный медиаплеер. И если ваши требования к воспроизведению мультимедиа еще проще, загляните в MPMoviePlayerViewController
(обратите внимание, что View-part).