AVPlayer
MPMoviePlayerController
iOS development
media playback
video streaming

AVPlayer and MPMoviePlayerController differences

Master System Design with Codemia

Enhance your system design skills with over 120 practice problems, detailed solutions, and hands-on exercises.

Introduction

MPMoviePlayerController and AVPlayer both play media, but they belong to different eras of iOS development. MPMoviePlayerController was the older high-level playback controller, while AVPlayer is the modern playback engine in AVFoundation.

For current development, the real comparison is usually not MPMoviePlayerController versus AVPlayer alone. It is MPMoviePlayerController versus AVPlayer plus either your own UI or AVPlayerViewController from AVKit.

The Biggest Difference: Status and Direction

The most important difference is architectural and historical:

  • 'MPMoviePlayerController was a ready-made player UI with limited flexibility'
  • 'AVPlayer is a lower-level playback object with much more control'
  • 'MPMoviePlayerController is deprecated and should not be used for new code'

So if you are maintaining old code, you may still see MPMoviePlayerController. If you are writing new code, you should be using AVFoundation-based APIs.

MPMoviePlayerController Was the Easy Old Wrapper

MPMoviePlayerController handled playback and bundled a built-in media UI. That made it convenient when you wanted something quick and standard, but it also limited customization and tied your architecture closely to an older API design.

That convenience was its strength and its long-term weakness. Once you needed more control over playback state, composition, custom overlays, or integration with newer media features, the old API became restrictive.

AVPlayer Is the Modern Playback Engine

AVPlayer focuses on playback logic rather than prebuilt controls. It works with AVPlayerItem, AVAsset, and other AVFoundation pieces and gives you much finer control over media behavior.

A minimal example looks like this:

swift
1import AVFoundation
2
3let url = URL(string: "https://example.com/video.m3u8")!
4let player = AVPlayer(url: url)
5player.play()

This is powerful, but on its own it does not give you a full playback UI. That is why many apps pair it with AVPlayerLayer or AVPlayerViewController.

If You Want Built-In Controls, Use AVPlayerViewController

The closest modern replacement for the old "player plus controls" experience is AVPlayerViewController:

swift
1import UIKit
2import AVKit
3import AVFoundation
4
5class VideoViewController: UIViewController {
6    override func viewDidLoad() {
7        super.viewDidLoad()
8
9        let url = URL(string: "https://example.com/video.m3u8")!
10        let player = AVPlayer(url: url)
11
12        let controller = AVPlayerViewController()
13        controller.player = player
14
15        present(controller, animated: true) {
16            player.play()
17        }
18    }
19}

This gives you a modern system playback UI without going back to deprecated APIs.

Control and Customization

This is where AVPlayer clearly wins.

With AVFoundation, you can:

  • observe playback status and buffering state
  • seek precisely
  • manage player items and assets directly
  • build a custom playback UI
  • integrate with broader media frameworks more naturally

That flexibility is the main reason Apple moved developers toward AVFoundation.

By contrast, MPMoviePlayerController was simpler to drop in, but you got much less control over how the player fit into the rest of the app.

Streaming and Modern Media Workflows

For HTTP Live Streaming and other modern Apple media workflows, AVFoundation is the correct foundation. It is the actively supported path and integrates better with current platform behavior.

That does not mean AVPlayer is always simpler. It often requires more structure because you are assembling the playback system more explicitly. But that extra structure is exactly what makes it more capable.

Migration Mindset

If you are replacing old MPMoviePlayerController code, do not try to find a one-line equivalent and assume the API model stayed the same. Instead:

  • move playback responsibility to AVPlayer
  • use AVPlayerViewController if you want standard controls
  • use AVPlayerLayer or a custom UI if you need full control

That gives you a cleaner migration path than trying to imitate the old controller API exactly.

Common Pitfalls

The biggest pitfall is thinking AVPlayer and MPMoviePlayerController are direct drop-in equivalents. They are not. One is a playback engine, and the other was an older controller-style wrapper.

Another common mistake is using AVPlayer and then wondering where the controls went. AVPlayer does not provide a full standard UI by itself.

Developers also sometimes keep MPMoviePlayerController in new code because it feels easier. That creates technical debt immediately because the API is deprecated.

Finally, do not forget the modern replacement pattern. If you liked the convenience of the old controller, AVPlayerViewController is usually what you actually want.

Summary

  • 'MPMoviePlayerController is the older deprecated media playback controller.'
  • 'AVPlayer is the modern AVFoundation playback engine.'
  • 'AVPlayer gives much more control, but it does not provide a full playback UI by itself.'
  • If you want built-in controls in modern iOS code, use AVPlayerViewController with AVPlayer.
  • For new projects, choose the AVFoundation path rather than the deprecated movie player controller.

Course illustration
Course illustration

All Rights Reserved.