AVPlayer — Các khái niệm chính, tính năng và cách sử dụng

Tác giả: IT Sectr Đã đăng: 2026-05-23 Thời gian đọc: 9 phút

AVPlayer là một framework trình phát đa phương tiện từ Apple, thuộc AVFoundation, cung cấp khả năng phát âm thanh và video trên iOS, macOS, tvOS và visionOS. AVPlayer hỗ trợ nhiều định dạng — từ tệp MP4 cục bộ đến luồng HLS thích ứng — thông qua một API thống nhất với khả năng giải mã tăng tốc phần cứng trên chip Apple Silicon. Theo Apple WWDC (2024), AVPlayer được sử dụng trong 90% ứng dụng iOS làm việc với đa phương tiện, bao gồm Apple TV, Music và Photos.

Những điểm chính

  • AVPlayer — Framework trình phát đa phương tiện của Apple từ AVFoundation cho tất cả nền tảng Apple.
  • Tăng tốc phần cứng — AVPlayer sử dụng VideoToolbox để giải mã trên GPU, giảm tiêu thụ điện năng.
  • HLS — Hỗ trợ HTTP Live Streaming gốc với chuyển đổi bitrate thích ứng tự động.
  • Picture in Picture — Hỗ trợ tích hợp chế độ hình trong hình trên iPad, iPhone và Mac.
  • DRM — Tích hợp với FairPlay Streaming để bảo vệ nội dung cao cấp.

AVPlayer là gì?

AVPlayer là thành phần trung tâm của framework AVFoundation, chịu trách nhiệm phát đa phương tiện trên tất cả nền tảng Apple. Được giới thiệu trong iOS 4.0 (2010) để thay thế MPMoviePlayerController đã lỗi thời, AVPlayer cung cấp khả năng kiểm soát cấp thấp đối với việc phát lại với khả năng tinh chỉnh tham số giải mã, đồng bộ âm thanh-video và tích hợp với các dịch vụ hệ thống như AirPlay và Picture in Picture.

Không giống như trình phát của bên thứ ba, AVPlayer được hưởng lợi từ khả năng tăng tốc phần cứng trên chip Apple Silicon. Giải mã video được thực hiện thông qua VideoToolbox sử dụng các công cụ đa phương tiện chuyên dụng của dòng M (Media Engine), cho phép phát 8K HDR với mức tiêu thụ điện năng tối thiểu. Đối với HEVC (H.265) và ProRes, việc giải mã diễn ra trên các khối chip chuyên dụng mà không làm quá tải CPU.

AVPlayer được tích hợp chặt chẽ với hệ sinh thái Apple: hỗ trợ Handoff để chuyển phát lại giữa các thiết bị, AirPlay 2 để phát trực tiếp lên Apple TV, âm thanh không gian với theo dõi đầu động và đồng bộ hóa với các yếu tố điều khiển hệ thống qua MPNowPlayingInfoCenter. Những tích hợp này biến AVPlayer thành tiêu chuẩn thực tế cho tất cả ứng dụng làm việc với đa phương tiện trên nền tảng Apple.

AVFoundation và hệ thống phân cấp lớp

Framework AVFoundation cung cấp hệ thống phân cấp ba cấp cho việc phát lại: AVAsset (siêu dữ liệu và thông tin nội dung), AVPlayerItem (trạng thái và quản lý một phiên bản nội dung cụ thể) và AVPlayer (điều khiển phát lại). Kiến trúc này tách biệt việc tải siêu dữ liệu, chuẩn bị phát lại và quá trình phát lại — điều đặc biệt quan trọng đối với luồng HLS có nhiều tùy chọn bitrate.

AVAsset đại diện cho một mô hình nội dung đa phương tiện — một tệp hoặc luồng. AVAsset không thể tự phát được; nó chứa các track (AVAssetTrack), siêu dữ liệu (commonMetadata), thông tin thời lượng và các đặc tính khác. Một AVPlayerItem được tạo từ AVAsset, sau đó có thể được chuyển đến AVPlayer để phát lại.

Các tính năng chính của AVPlayer

AVPlayer cung cấp một loạt khả năng bao phủ hầu hết các tình huống phát lại — từ phát tệp đơn giản đến phát sóng trực tiếp phức tạp với DRM. Hãy khám phá các tính năng chính với ví dụ sử dụng.

Tính năngMô tảNền tảng
Tệp cục bộMP4, MOV, M4V, AVI, MKV (qua tiện ích mở rộng)iOS, macOS, tvOS
HLSHTTP Live Streaming với ABR thích ứngTất cả nền tảng Apple
FairPlay DRMNội dung HLS được bảo vệ với giấy phép phát trực tiếpiOS, tvOS, macOS
Picture in PictureCửa sổ video nổi trên các ứng dụng kháciPad, iPhone (iOS 14+), Mac
AirPlay 2Phát trực tiếp không dây tới Apple TV và loaTất cả nền tảng
Âm thanh không gianDolby Atmos và theo dõi đầu độngiOS 15+, macOS 13+
HDRDolby Vision, HDR10, HLG với hỗ trợ màn hìnhiOS 11+, macOS 10.13+

Hỗ trợ HLS và chuyển đổi thích ứng

AVPlayer có hỗ trợ HLS gốc mà không cần thư viện bổ sung. Khi phát luồng HLS, AVPlayer tự động xử lý chuyển đổi bitrate thích ứng bằng thuật toán ABR tích hợp được tối ưu hóa cho nền tảng Apple. Thuật toán không chỉ xem xét băng thông mạng mà còn cả trạng thái nhiệt của thiết bị — khi quá nóng, AVPlayer có thể giảm bitrate để giảm tải CPU.

Đối với luồng HLS với FairPlay Streaming, AVPlayer tự động xử lý việc cấp và gia hạn giấy phép thông qua delegate AVContentKeySession. Nhà phát triển cần triển khai giao thức AVContentKeySessionDelegate, được trình phát gọi khi cần lấy hoặc gia hạn khóa giải mã. Đây là cách duy nhất để bảo vệ nội dung HLS trên nền tảng Apple, vì Widevine không được hỗ trợ trên iOS.

Picture in Picture

PiP là chế độ cho phép người dùng tiếp tục xem video trong cửa sổ nổi khi chuyển đổi giữa các ứng dụng. Trên iPad và iPhone (iOS 14+), AVPlayer tích hợp với AVPictureInPictureController để kích hoạt chế độ này. Trên macOS 15+, PiP cũng có sẵn nhưng được kích hoạt qua menu hệ thống hoặc nút trong cửa sổ trình phát.

Cách sử dụng AVPlayer trong ứng dụng iOS

Tích hợp AVPlayer vào ứng dụng iOS có thể thực hiện theo hai cách: thông qua AVPlayerViewController cấp cao (cho các tình huống tiêu chuẩn) hoặc trực tiếp qua AVPlayer + AVPlayerLayer (để tùy chỉnh giao diện đầy đủ). Hãy khám phá cả hai phương pháp trong Swift.

Tích hợp qua AVPlayerViewController

AVPlayerViewController là thành phần giao diện sẵn sàng sử dụng cung cấp các điều khiển tích hợp: phát/tạm dừng, tìm kiếm, âm lượng, AirPlay, PiP và chế độ toàn màn hình. Tích hợp tối thiểu chỉ cần vài dòng mã: tạo một phiên bản AVPlayer, chuyển nó cho AVPlayerViewController và hiển thị bộ điều khiển trên màn hình.

swift
import AVKit

let url = URL(string: "https://example.com/video.mp4")!
let asset = AVAsset(url: url)
let playerItem = AVPlayerItem(asset: asset)
let player = AVPlayer(playerItem: playerItem)

let controller = AVPlayerViewController()
controller.player = player
controller.allowsPictureInPicturePlayback = true

present(controller, animated: true) {
    player.play()
}

Tích hợp trực tiếp qua AVPlayerLayer

Đối với ứng dụng có giao diện tùy chỉnh, hãy sử dụng AVPlayerLayer — một lớp Core Animation kết xuất video bên trong bất kỳ UIView nào. Phương pháp này mang lại toàn quyền kiểm soát giao diện: bạn có thể thêm điều khiển tùy chỉnh, hoạt ảnh và lớp phủ bổ sung lên trên video.

swift
class VideoPlayerView: UIView {

    var player: AVPlayer? {
        get { (layer as! AVPlayerLayer).player }
        set { (layer as! AVPlayerLayer).player = newValue }
    }

    override class var layerClass: AnyClass {
        AVPlayerLayer.self
    }
}

// Sử dụng:
let playerView = VideoPlayerView(frame: view.bounds)
playerView.player = AVPlayer(url: url)
view.addSubview(playerView)

Quản lý vòng đời AVPlayer

Quản lý vòng đời trình phát đúng cách rất quan trọng cho sự ổn định của ứng dụng. AVPlayer nên được tạo khi màn hình xuất hiện và được giải phóng khi đóng. Khi ứng dụng chuyển vào nền, nên tạm dừng phát lại để tiết kiệm tài nguyên và tránh bị App Review phạt vì phát nền không cần thiết.

AVPlayerLayer và hiển thị video

AVPlayerLayer là một lớp Core Animation kế thừa từ CALayer, kết xuất video trên màn hình. Không giống như UIView, AVPlayerLayer hoạt động trực tiếp với GPU qua Metal hoặc OpenGL, đảm bảo độ trễ đầu ra khung hình tối thiểu. Hiểu về AVPlayerLayer là cần thiết để triển khai giao diện phát lại tùy chỉnh.

Cấu hình videoGravity

Thuộc tính videoGravity xác định cách video khớp trong ranh giới lớp. AVLayerVideoGravity.resizeAspect (giữ tỷ lệ khung hình với thanh đen) là mặc định cho AVPlayerViewController. resizeAspectFill (lấp đầy toàn bộ màn hình với cắt xén) được sử dụng cho chế độ toàn màn hình. resize (làm méo tỷ lệ để vừa với kích thước lớp) hiếm khi được sử dụng, chủ yếu cho các ứng dụng phân tích.

Đồng bộ hóa luồng chính

AVPlayerLayer kết xuất video theo thời gian thực, nhưng tất cả thao tác trình phát (bắt đầu, tạm dừng, tìm kiếm) phải được thực hiện trên luồng chính. Các giá trị chính để theo dõi — timeControlStatus, rate, status và error — được theo dõi qua KVO (Key-Value Observing) hoặc API async/await hiện đại được giới thiệu trong iOS 16 thông qua các phương thức AVPlayer với hỗ trợ Swift Concurrency.

swift
let player = AVPlayer(url: url)
let statusObservation = player.observe(
    \.status,
    options: [.new, .initial]
) { player, _ in
    switch player.status {
    case .readyToPlay:
        player.play()
    case .failed:
        handleError(player.error)
    default:
        break
    }
}

Hỗ trợ phụ đề và track thay thế

AVPlayer hỗ trợ phụ đề nhúng ở định dạng VTT, CEA-608 và ITT (iTunes Timed Text). Việc chọn track âm thanh và phụ đề được thực hiện qua AVMediaSelectionGroup và AVMediaSelectionOption. Cài đặt phụ đề của người dùng (phông chữ, kích thước, màu sắc) được đọc từ cài đặt Trợ năng của hệ thống và tự động áp dụng cho AVPlayerLayer trừ khi được chỉ định rõ trong mã.

Quản lý phát lại và các tình huống nâng cao

Đối với ứng dụng sản xuất, tích hợp AVPlayer cơ bản thường yêu cầu cấu hình bổ sung: lưu đệm phân đoạn HLS, tích hợp FairPlay DRM, tích hợp hệ thống Now Playing và thuật toán chọn bitrate tùy chỉnh.

Lưu đệm HLS qua AVAssetResourceLoader

AVAssetResourceLoader là cách duy nhất để chặn tải phân đoạn HLS và triển khai lưu đệm. Delegate AVAssetResourceLoaderDelegate nhận yêu cầu tải khóa và phân đoạn, cho phép lưu trữ cục bộ và trả về từ bộ đệm trong các yêu cầu tiếp theo. Điều này đặc biệt hữu ích cho các ứng dụng hoạt động trong điều kiện mạng không ổn định.

swift
let asset = AVURLAsset(url: hlsURL)
asset.resourceLoader.setDelegate(
    resourceLoaderDelegate,
    queue: DispatchQueue(label: "com.app.resourceloader")
)
let playerItem = AVPlayerItem(asset: asset)

FairPlay Streaming — Tích hợp DRM

FairPlay Streaming (FPS) là tiêu chuẩn của Apple để bảo vệ nội dung HLS. Để tích hợp FPS, bạn cần triển khai giao thức AVContentKeySessionDelegate, xử lý yêu cầu khóa giải mã. Quy trình bao gồm: lấy SPC (Server Playback Context) từ trình phát, gửi đến máy chủ cấp phép, nhận CKC (Content Key Context) và chuyển lại cho AVContentKeySession.

swift
class DRMDelegate: NSObject, AVContentKeySessionDelegate {

    func contentKeySession(
        _ session: AVContentKeySession,
        didProvide keyRequest: AVContentKeyRequest
    ) {
        // 1. Lấy SPC từ keyRequest
        // 2. Gửi SPC đến máy chủ cấp phép
        // 3. Nhận CKC và chuyển cho keyRequest.processContentKeyResponse
    }
}

Now Playing và điều khiển hệ thống

Để hiển thị thông tin phát lại hiện tại trên Màn hình khóa, Trung tâm điều khiển và Apple Watch, hãy sử dụng MPNowPlayingInfoCenter từ MediaPlayer.framework. AVPlayer không tự động cập nhật Now Playing — nhà phát triển phải tự đặt siêu dữ liệu (tiêu đề, nghệ sĩ, ảnh bìa, tiến trình) khi trạng thái phát lại thay đổi. Một bộ đếm thời gian thông thường hoặc observe(\.timeControlStatus) được sử dụng để cập nhật tiến trình.

Remote Command Center là một dịch vụ hệ thống khác cho phép điều khiển phát lại từ màn hình khóa, AirPods và CarPlay. MPRemoteCommandCenter đăng ký trình xử lý cho các lệnh play, pause, nextTrack, previousTrack, changePlaybackPosition và skipForward/skipBackward. AVPlayer không xử lý các lệnh này tự động — nhà phát triển phải kết nối chúng với các lệnh gọi player.play(), player.pause() và player.seek().

Câu hỏi thường gặp

AVPlayer khác AVAudioPlayer như thế nào?

AVPlayer là trình phát đa năng cho âm thanh và video với hỗ trợ phát trực tiếp, HLS, DRM và đồng bộ hóa với điều khiển hệ thống. AVAudioPlayer là trình phát âm thanh đơn giản để phát tệp âm thanh cục bộ mà không hỗ trợ phát trực tiếp hoặc tăng tốc video phần cứng. Đối với video và HLS, hãy sử dụng AVPlayer; cho âm thanh đơn giản, hãy sử dụng AVAudioPlayer.

AVPlayer có hỗ trợ phát YouTube không?

Không, AVPlayer không hỗ trợ tải trực tiếp nội dung YouTube, vì YouTube sử dụng trình phát riêng dựa trên DASH và các định dạng độc quyền. Để tích hợp YouTube vào ứng dụng iOS, hãy sử dụng YouTube IFrame Player API qua WKWebView hoặc thư viện chính thức youtube-ios-player-helper.

Làm thế nào để triển khai phát âm thanh nền với AVPlayer?

Để phát âm thanh nền, hãy thêm Audio, AirPlay and Picture in Picture vào Chế độ nền (Background Modes) trong dự án Xcode của bạn. Cấu hình AVAudioSession với danh mục .playback: try AVAudioSession.sharedInstance().setCategory(.playback). AVPlayer sẽ tiếp tục phát trong nền, và Màn hình khóa cùng Trung tâm điều khiển sẽ hiển thị điều khiển qua MPNowPlayingInfoCenter.

Tại sao AVPlayer không phát video từ YouTube, Vimeo hoặc Twitter?

Các dịch vụ này sử dụng bảo vệ DRM và giải pháp trình phát riêng. AVPlayer chỉ có thể phát nội dung qua URL tệp phương tiện trực tiếp hoặc danh sách phát HLS. Video từ YouTube và các nền tảng tương tự được bọc trong trình phát iframe hoặc JavaScript không tương thích với AVPlayer. Sử dụng SDK chính thức hoặc WebView của họ để hiển thị.

Làm thế nào để giảm độ trễ trong phát trực tiếp qua AVPlayer?

Để có HLS độ trễ thấp, hãy cấu hình AVPlayerItem với preferredForwardBufferDuration = 2.0 (giây) và tự động quản lý tạm dừng khi bị tụt sau ranh giới trực tiếp: sử dụng player.currentItem?.configuredTimeOffsetFromLive và player.currentItem?.canPlayReverse. Apple khuyến nghị LL-HLS với độ trễ 2-4 giây khi được cấu hình đúng trên cả máy chủ và máy khách.

Tóm tắt

  • AVPlayer — Trình phát đa phương tiện phổ quát của Apple với tăng tốc phần cứng trên Apple Silicon cho iOS, macOS, tvOS và visionOS.
  • HLS — Hỗ trợ gốc với chuyển đổi bitrate thích ứng tự động không cần thư viện bổ sung.
  • FairPlay Streaming — Hệ thống DRM duy nhất cho HLS được bảo vệ trên nền tảng Apple.
  • Tích hợp — AVPlayerViewController để bắt đầu nhanh hoặc AVPlayerLayer cho giao diện tùy chỉnh.
  • Lưu đệm HLS được triển khai qua AVAssetResourceLoaderDelegate bằng cách chặn yêu cầu phân đoạn.
  • Now Playing — Cập nhật siêu dữ liệu thủ công cho Trung tâm điều khiển và Màn hình khóa qua MPNowPlayingInfoCenter.
  • Khuyến nghị sử dụng AVPlayer cho tất cả dự án đa phương tiện trên nền tảng Apple có yêu cầu HLS.

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm