ฉันกำลังพัฒนาแอพพลิเคชั่น iPhone ที่ต้องเล่นวิดีโอ จนถึงตอนนี้ฉันได้เรียนรู้ว่ามี API อย่างน้อยสองตัวสำหรับการบรรลุเป้าหมายนี้ AVPlayer
และMPMoviePlayerController
.
อะไรคือความแตกต่างที่สำคัญ?
ฉันกำลังพัฒนาแอพพลิเคชั่น iPhone ที่ต้องเล่นวิดีโอ จนถึงตอนนี้ฉันได้เรียนรู้ว่ามี API อย่างน้อยสองตัวสำหรับการบรรลุเป้าหมายนี้ AVPlayer
และMPMoviePlayerController
.
อะไรคือความแตกต่างที่สำคัญ?
คำตอบ:
หมายเหตุสำหรับ iOS9 Apple ได้เลิกใช้งาน MPMoviePlayerController:
คลาส MPMoviePlayerController เลิกใช้งานอย่างเป็นทางการแล้วใน iOS 9 (คลาส MPMoviePlayerViewController ก็เลิกใช้อย่างเป็นทางการเช่นกัน) ในการเล่นเนื้อหาวิดีโอใน iOS 9 ขึ้นไปให้ใช้คลาส AVPictureInPictureController หรือ AVPlayerViewController จากเฟรมเวิร์ก AVKit หรือคลาส WKWebView จาก WebKit แทน
คัดลอกมาจากการอ้างอิง MPMoviePlayerController
AVPlayer
ช่วยให้คุณมีความยืดหยุ่นมากขึ้น แต่มีเอกสารค่อนข้างไม่ดี การใช้ API นี้จะบังคับให้คุณสร้าง UI ของคุณเอง AVFoundation
(กรอบงานที่นำคุณAVPlayer
) โดยทั่วไปแล้วผู้ใช้ (coder) ค่อนข้างยากเนื่องจากบังคับให้คุณใช้การสังเกตคีย์ - ค่าจำนวนมากเพื่อตรวจสอบสถานะ แนวคิดของ KVO นั้นยอดเยี่ยมอย่าเข้าใจฉันผิด - แต่สำหรับนักพัฒนาที่ไม่มีประสบการณ์อาจเป็นเรื่องยากที่จะเรียนรู้ บางครั้ง Apple จะละเว้นข้อมูลว่าคุณสมบัติใดที่เป็นไปตามข้อกำหนด KVO จริงและนั่นจะบังคับให้คุณทำการทดลองบางอย่าง
ข้อดีอย่างหนึ่งที่ใหญ่AVPlayer
กว่าMPMoviePlayerController
จะยกตัวอย่างเช่นจะเป็นรุ่นที่ขยายของตนAVQueuePlayer
เป็นที่หนึ่งสามารถที่จะทำไม่มีช่องโหว่การเล่นของแหล่งที่มาของภาพยนตร์หลาย ๆ ข้อดีอีกประการหนึ่งคือAVFoundation
เฟรมเวิร์กที่มีคุณลักษณะที่ช่วยให้คุณทำสิ่งต่างๆเช่นการจัดองค์ประกอบ / การเข้ารหัส / การแปลงภาพยนตร์ได้ทันที
ข้อดีอีกอย่างหนึ่งAVPlayer
คือคุณสามารถเล่นวิดีโอหลายแหล่งพร้อมกันได้ (เช่นเคียงข้างกัน) โดยไม่มีปัญหา
MPMoviePlayerController
ใช้งานง่ายและครอบคลุมความต้องการส่วนใหญ่นอกกรอบ การใช้ API นี้จะทำให้คุณมี UI ที่ดูดีและเข้าใจได้ทั่วไป อย่างไรก็ตาม UI สามารถปิดใช้งานและหรือแทนที่ด้วย UI ที่กำหนดเองได้
สำหรับการเปลี่ยนแปลงสถานะให้MPMoviePlayerController
ใช้บางส่วนที่NSNotifications
ครอบคลุมทุกสิ่งที่แอปทั่วไปต้องการ
ภายใต้ประทุน, MPMoviePlayerController
สร้างด้านบนของAVPlayer
- แต่ที่เกิดขึ้นจริงโปร่งใสทั้งหมดให้กับผู้ใช้ - MPMoviePlayerController
คุณมีการเข้าถึงชั้นที่ไม่มีในขณะที่ใช้
MPMoviePlayerController
ใช้การซ้อนทับAVPlayer
เป็นอินสแตนซ์ซิงเกิลตันดังนั้นจึงไม่สามารถใช้หลายอินสแตนซ์MPMoviePlayerController
เพื่อเล่นวิดีโอพร้อมกันได้
ในทางกลับกันทันทีที่คุณพยายามขยายการทำงานของMPMoviePlayerController
ฟีเจอร์ของคุณเองโค้ดจะกลายเป็นสิ่งที่น่ารังเกียจอย่างรวดเร็วเช่นคุณอาจจะเริ่มใช้ตัวจับเวลาหลายตัวเพื่อปกปิดสิ่งต่างๆเช่นการตรวจจับการอดอาหารที่เหมาะสม (อันที่จริงฟีเจอร์นั้นรวมอยู่ด้วย ในคลาสนี้ของ iOS5), การอัปเดต UI ที่กำหนดเอง, ... หรือคุณอาจมีคุณสมบัติสถานะมากกว่าจำนวนหนึ่งที่พยายามจะครอบคลุมสิ่งต่างๆเช่นการยกเลิกการเล่นอย่างสง่างามในขณะที่ผู้เล่นยังคงบัฟเฟอร์ล่วงหน้า
คำแนะนำส่วนบุคคล
ฉันใช้ทั้งสองอย่างแล้วและจะใช้ทั้งสองอย่างต่อไปทั้งนี้ขึ้นอยู่กับความต้องการของแอพที่ฉันมีความยินดีที่จะสร้าง สำหรับโปรเจ็กต์ (ง่าย ๆ ) ส่วนใหญ่ฉันขอแนะนำให้ใช้MPMoviePlayerController
over AVPlayer
เนื่องจากใช้งานง่ายมากและด้วยโค้ดเพียงไม่กี่บรรทัดคุณจะได้รับโปรแกรมเล่นสื่อที่มีคุณสมบัติครบถ้วน และหากความต้องการของคุณในการเล่นสื่อนั้นง่ายยิ่งขึ้นลองดูที่MPMoviePlayerViewController
(โปรดทราบว่า View-part)
backgroundView
หรือโดยตรงในตัวของมัน