AVPlayer和MPMoviePlayerController的区别

我正在开发一个需要播放video的iPhone应用程序。 到目前为止,我了解到至less有两个API可以实现这个function。 AVPlayerMPMoviePlayerController

主要区别是什么?

从iOS9开始,Apple已经不赞成使用MPMoviePlayerController:

MPMoviePlayerController类在iOS 9中正式废弃。(MPMoviePlayerViewController类也被正式弃用。)要在iOS 9及更高版本中播放video内容,请使用AVKit框架中的AVPictureInPictureController或AVPlayerViewController类或WebKit中的WKWebView类。

从MPMoviePlayerController参考复制。

AVPlayer

AVPlayer为您提供了更多的灵活性,但相当不完善的logging。 使用这个API将迫使你创build你自己的UI。 AVFoundation (带给你AVPlayer的框架)通常在用户(编码器)上有点困难,因为它迫使你使用Key-Value观察大量的检查状态。 KVO的概念是伟大的,不要误解我的意思 – 对于没有经验的开发者来说,学习可能会很痛苦。 苹果有时会忽略哪些属性实际上符合KVO的信息,这会迫使您做一些实验。

AVPlayer对于MPMoviePlayerController一大优势就是它的扩展版本AVQueuePlayer因为它可以对多个电影源进行无缝播放。 另一个优势当然是function丰富的AVFoundation框架,可以让您执行诸如animation电影合成/编码/转换等操作。

AVPlayer另一个巨大优势是,您可以实际上同时播放多个video源(例如,并排)而没有任何问题。

的MPMoviePlayerController

MPMoviePlayerController易于使用,覆盖了大部分需求。 使用这个API将给你一个很好看和通常理解的用户界面。 然而,用户界面可以被禁用或用自定义的replace。

对于状态更改, MPMoviePlayerController使用一些NSNotifications覆盖常规应用程序所需的一切。

MPMoviePlayerControllerMPMoviePlayerControllerbuild立在AVPlayer之上 – 但实际上对用户来说是完全透明的 – 在使用MPMoviePlayerController时候你不能访问这个层。

MPMoviePlayerController使用底层AVPlayer作为单例实例,因此不可能同时使用多个MPMoviePlayerController实例来播放video。

另一方面,只要你试图用你自己的特性扩展MPMoviePlayerController的function,代码很快就会变得讨厌 – 例如,你可能会开始使用多个定时器来覆盖像正确的starve-detection(事实上,包括到iOS5的这个类的版本中),自定义的UI更新,…或者你可能最终会有超过一些状态属性,试图覆盖这样的东西,如播放器仍在预缓冲时正常放弃播放。


个人推荐

我已经使用了两个,我将继续使用,这取决于我有幸build立的应用程序的需要。 对于大多数(简单)项目,我build议使用MPMoviePlayerController不是AVPlayer因为它使用MPMoviePlayerController非常简单,只需几行代码就可以得到一个完整的媒体播放器。 如果您对媒体播放的要求更简单,请查看MPMoviePlayerViewController (注意View-part)。