2011-11-16 19 views
85

Tôi đang phát triển một ứng dụng iPhone cần phát video. Cho đến nay, tôi đã học được rằng có ít nhất hai API để đạt được điều này; AVPlayerMPMoviePlayerController.AVPlayer và MPMoviePlayerĐiều khác biệt của bộ điều khiển

Sự khác biệt chính là gì?

+4

Cố gắng viết lại câu hỏi này để đảm bảo câu hỏi đó không tạo ra các câu trả lời dựa trên ý kiến. – Till

Trả lời

172

LƯU Ý như của iOS9, Apple đã phản đối các MPMoviePlayerController:

Lớp MPMoviePlayerController được chính thức phản đối trong iOS 9. (. Lớp MPMoviePlayerViewController cũng được chính thức phản đối) Để phát nội dung video trong iOS 9 và sau đó, thay vào đó sử dụng lớp AVPictureInPictureController hoặc AVPlayerViewController từ khung công tác AVKit hoặc lớp WKWebView từ WebKit.

Được sao chép từ MPMoviePlayerController reference.

AVPlayer

AVPlayer cung cấp cho bạn rất nhiều linh hoạt hơn nhưng khá kém tài liệu. Sử dụng API này sẽ buộc bạn phải tạo giao diện người dùng của riêng mình. AVFoundation (khung mang đến cho bạn AVPlayer) nói chung là một chút khó khăn đối với người dùng (coder) vì nó buộc bạn phải sử dụng Key-Value Observing rất nhiều để kiểm tra trạng thái. Khái niệm về KVO là tuyệt vời, đừng làm cho tôi sai - vẫn còn, cho các nhà phát triển không có kinh nghiệm nó có thể được đau đớn để tìm hiểu. Đôi khi Apple bỏ qua thông tin về các thuộc tính thực sự tuân thủ KVO và điều đó sẽ buộc bạn phải thực hiện một số thử nghiệm.

Một lợi thế lớn của AVPlayer trên MPMoviePlayerController chẳng hạn như phiên bản mở rộng, AVQueuePlayer vì phiên bản đó có thể phát lại nhiều nguồn phim. Một ưu điểm khác chắc chắn là tính năng phong phú khung hình AVFoundation cho phép bạn làm những việc như thành phần phim/mã hóa/chuyển đổi đang hoạt động.

Tuy nhiên, một lợi thế lớn khác của AVPlayer là thực tế rằng bạn thực sự có thể phát nhiều nguồn video đồng thời (ví dụ: cạnh nhau) mà không gặp bất kỳ sự cố nào.

MPMoviePlayerController

MPMoviePlayerController là dễ sử dụng và bao gồm hầu hết nhu cầu ra khỏi hộp. Sử dụng API này sẽ cung cấp cho bạn giao diện người dùng có giao diện đẹp và được hiểu rõ. Tuy nhiên, giao diện người dùng có thể bị tắt và được thay thế bằng giao diện người dùng tùy chỉnh.

Để thay đổi trạng thái, MPMoviePlayerController sử dụng một số ít NSNotifications bao gồm mọi thứ mà ứng dụng thông thường cần.

Dưới mui xe, MPMoviePlayerController được xây dựng trên đầu trang AVPlayer - nhưng điều đó thực sự xảy ra hoàn toàn minh bạch cho người dùng - bạn không có quyền truy cập vào lớp đó khi đang sử dụng MPMoviePlayerController.

MPMoviePlayerController sử dụng lớp lót AVPlayer làm trường hợp đơn lẻ, do đó không thể sử dụng nhiều phiên bản MPMoviePlayerController để phát video đồng thời.

Mặt khác, ngay khi bạn đang cố gắng mở rộng chức năng của MPMoviePlayerController với các tính năng của riêng bạn, mã nhanh chóng trở nên khó chịu - ví dụ:bạn có thể bắt đầu sử dụng nhiều bộ tính giờ để bao gồm những thứ như phát hiện chết đói đúng cách (thực tế, tính năng này được đưa vào phiên bản iOS5 của lớp này), cập nhật giao diện người dùng tùy chỉnh, ... Hoặc bạn có thể có nhiều hơn một số trạng thái các thuộc tính cố gắng bao gồm những thứ như xóa bỏ hoàn toàn việc phát lại trong khi trình phát vẫn đang lưu vào bộ đệm trước.


Khuyến nghị cá nhân

Tôi đã sử dụng cả hai và tôi sẽ tiếp tục sử dụng cả hai, tùy thuộc vào nhu cầu của App Tôi có những niềm vui để xây dựng. Đối với hầu hết các dự án (đơn giản), tôi khuyên bạn nên sử dụng MPMoviePlayerController trên AVPlayer vì nó rất đơn giản để sử dụng và chỉ với một vài dòng mã, bạn sẽ có được một trình phát đa phương tiện. Và nếu nhu cầu phát lại phương tiện truyền thông của bạn thậm chí còn đơn giản hơn, hãy xem tại MPMoviePlayerViewController (lưu ý rằng phần Xem).

+0

+1 Cảm ơn bạn đã làm rõ điều này !! – bentford

+2

AVPlayer cũng tự động cho phép bạn sử dụng hoạt ảnh lớp. Nếu bạn muốn chạy Core Animation trong nền, không sử dụng MPMoviePlayerController, mặc dù nó có thể có một thiết lập để kích hoạt chúng, chỉ cần nhận thức được rằng nếu bạn đang sử dụng công cụ CALayer –

+0

Không nên là: Giao diện người dùng tuy nhiên ** không thể ** bị vô hiệu hóa và được thay thế bằng tùy chỉnh? – Besi