AVPlayerViewController เป็นตัวควบคุมเครื่องเล่นวิดีโอในตัวในระบบนิเวศของ Apple ออกแบบมาเพื่อเล่นเนื้อหามีเดียบน iOS และ tvOS โดยมีอินเทอร์เฟซแบบเต็มหน้าจอพร้อมการควบคุม รองรับคำบรรยาย และ AirPlay โดยไม่ต้องเขียนอินเทอร์เฟซผู้ใช้แบบกำหนดเอง ตาม เอกสาร Apple Developer, 2026 AVPlayerViewController ผสานรวมได้ในโค้ดเพียงไม่กี่บรรทัดและรองรับ HLS, MP4 และรูปแบบมีเดียส่วนใหญ่
ประเด็นสำคัญ
AVPlayerViewController เป็นส่วนประกอบของเฟรมเวิร์ก AVKit ที่มีอินเทอร์เฟซพร้อมใช้งานสำหรับการเล่นวิดีโอในแอปพลิเคชันของ Apple ช่วยลดความจำเป็นในการสร้างเครื่องเล่นแบบกำหนดเองตั้งแต่ต้น โดยมีระบบควบคุมมาตรฐาน: เล่น/หยุดชั่วคราว กรอไปข้างหน้า ปรับระดับเสียง และโหมดเต็มหน้าจอ
แตกต่างจาก AVPlayerLayer ระดับต่ำที่ต้องสร้างอินเทอร์เฟซผู้ใช้ด้วยตนเอง AVPlayerViewController จัดการวงจรชีวิตของเครื่องเล่นทั้งหมด ตัวควบคุมจัดการการหมุนหน้าจอโดยอัตโนมัติ ปรับให้เข้ากับพื้นที่ปลอดภัยบน iPhone ที่มีรอยบาก และรองรับการทำงานหลายอย่างพร้อมกันบน iPad
ตามเอกสารของ Apple (2026) AVPlayerViewController เข้ากันได้กับ AVPlayer และ AVQueuePlayer ทำให้สามารถเล่นทั้งไฟล์เดี่ยวและเพลย์ลิสต์ รองรับ URL จากที่จัดเก็บในเครื่อง สตรีมเครือข่าย HLS และเนื้อหา FairPlay ที่เข้ารหัส
ส่วนประกอบนี้ปรากฏใน iOS 8 พร้อมกับ AVKit เพื่อแทนที่ MPMoviePlayerController ที่เลิกใช้แล้ว ใน iOS 11 เพิ่มการรองรับ Picture in Picture และการแสดงคำบรรยาย ใน iOS 14 ตัวควบคุมได้รับแถบขนส่งที่ปรับแต่งได้ผ่าน AVPlayerViewControllerDelegate ตั้งแต่ iOS 16 เป็นต้นมา มีการรองรับการเปลี่ยนไฟล์มีเดียแบบไดนามิกโดยไม่ต้องสร้างเครื่องเล่นใหม่
AVPlayerViewController สมัยใหม่ได้รับการปรับให้เหมาะสมกับจอแสดงผล ProMotion — อัตราเฟรมวิดีโอจะซิงโครไนซ์กับอัตรารีเฟรชหน้าจอโดยอัตโนมัติ บน tvOS ส่วนประกอบจะปรับให้เข้ากับอินเทอร์เฟซโฟกัสของ Siri Remote และบน macOS จะปรับให้เข้ากับโหมดหน้าต่างของ QuickTime Player
แกนหลักของตัวควบคุมคือการจับคู่ระหว่าง AVPlayer และ AVPlayerItem AVPlayer คือออบเจกต์การเล่นที่จัดการไทม์ไลน์ ความเร็ว และสถานะ AVPlayerItem คือตัวห่อหุ้มรอบไฟล์มีเดียเฉพาะที่มีข้อมูลเมตา แทร็ก และข้อมูลการโหลด
เมื่อเริ่มต้น AVPlayerViewController จะได้รับการอ้างอิงไปยัง AVPlayer และสร้าง AVPlayerLayer สำหรับแสดงวิดีโอโดยอัตโนมัติ ตัวควบคุมสมัครรับการแจ้งเตือน KVO ของ AVPlayer เกี่ยวกับการเปลี่ยนแปลงสถานะ เช่น readyToPlay ข้อผิดพลาดในการโหลด และการสิ้นสุดการเล่น
ระบบควบคุม (แถบขนส่ง) จะแสดงเมื่อแตะหน้าจอ ใน iOS 15+ รองรับการปรับแต่งผ่าน AVPlayerViewControllerCustomizationDelegate ทำให้สามารถซ่อนหรือแทนที่ปุ่มมาตรฐานได้
หลังจากสร้างตัวควบคุมและกำหนด AVPlayer แล้ว เมธอด viewDidLoad จะถูกเรียก ซึ่งเริ่มเตรียมสตรีมวิดีโอ เมื่อ AVPlayerItem เปลี่ยนเป็นสถานะ AVPlayerItemStatusReadyToPlay เครื่องเล่นพร้อมที่จะแสดงเฟรม เมื่อเรียกเมธอด play() การถอดรหัสสตรีมวิดีโอจะเริ่มผ่าน Video Toolbox
เมื่อออกจากหน้าจอ ตัวควบคุมจะหยุดการเล่นชั่วคราวและปล่อยทรัพยากรตัวถอดรหัสโดยอัตโนมัติ บน iOS 13+ เพื่อรักษาการเล่นเมื่อแอปถูกย่อเล็กสุด ต้องกำหนดค่าโหมดพื้นหลังและเซสชันเสียง ตาม WWDC 2024 แนะนำให้ใช้ AVPlayerPlaybackCoordinator สำหรับการซิงโครไนซ์กับศูนย์มีเดียของ iOS
ส่วนประกอบมีชุดคุณสมบัติมากมายพร้อมใช้งานทันที ทำให้เหมาะสำหรับโปรเจกต์ส่วนใหญ่ ด้านล่างคือความสามารถหลักที่ไม่ต้องใช้โค้ดเพิ่มเติม
แถบขนส่งคือส่วนล่างของอินเทอร์เฟซที่มีปุ่มควบคุมหลัก โดยค่าเริ่มต้น แถบจะซ่อนหลังจากไม่มีการใช้งาน 3 วินาทีและปรากฏเมื่อแตะ ใน iOS 16+ สามารถใช้ดีลิเกตเพื่อควบคุมการแสดงผลของแต่ละองค์ประกอบ
ในโหมดดีบัก แถบขนส่งสามารถบังคับให้แสดงได้โดยใช้คุณสมบัติ AVPlayerViewController.requiresLinearPlayback ซึ่งป้องกันไม่ให้วิดีโอหยุดชั่วคราว มีประโยชน์สำหรับการโฆษณาคั่นและเนื้อหาการศึกษา
การผสานรวมพื้นฐานของตัวควบคุมใช้โค้ดไม่เกิน 10 บรรทัด ขั้นแรก สร้างอินสแตนซ์ AVPlayer พร้อม URL ของไฟล์มีเดีย จากนั้นส่งต่อไปยัง AVPlayerViewController และแสดงตัวควบคุมบนหน้าจอ
import AVKit
let player = AVPlayer(url: URL(string: "https://example.com/video.mp4")!)
let playerVC = AVPlayerViewController()
playerVC.player = player
present(playerVC, animated: true) {
player.play()
}
หลังจากเรียก present ตัวควบคุมจะแสดงแบบเต็มหน้าจอ วิดีโอเริ่มโหลดจากเครือข่าย และเมื่อบัฟเฟอร์ถึงเกณฑ์ readyToPlay การเล่นจะเริ่มโดยอัตโนมัติหลังจากเรียก play()
let asset = AVAsset(url: videoURL)
let item = AVPlayerItem(asset: asset)
let metadata = AVMutableMetadataItem()
metadata.key = AVMetadataKey.commonKeyTitle
metadata.value = "วิดีโอของฉัน"
item.addMetadata(metadata)
let player = AVPlayer(playerItem: item)
let playerVC = AVPlayerViewController()
playerVC.player = player
การใช้ AVPlayerItem ช่วยให้คุณควบคุมข้อมูลเมตา รหัสเวลา การเลือกแทร็กเสียง และคำบรรยาย ผ่าน AVPlayerItem คุณยังสามารถตรวจสอบความคืบหน้าในการโหลด การบัฟเฟอร์ และข้อผิดพลาดเครือข่ายโดยใช้ KVO บนคุณสมบัติ status
ตั้งแต่ iOS 11 นักพัฒนาสามารถปรับแต่งแถบขนส่งผ่านโปรโตคอล AVPlayerViewControllerDelegate เมธอด playerViewController(_:willBeginFullScreenPresentationWithAnimationCoordinator:) ถูกเรียกก่อนเข้าโหมดเต็มหน้าจอและช่วยให้เตรียมอินเทอร์เฟซผู้ใช้
ในการซ่อนปุ่มแต่ละปุ่ม ให้ใช้คุณสมบัติ AVPlayerViewController.showsPlaybackControls หากตั้งค่าเป็น false แถบขนส่งจะหายไปทั้งหมด เหลือเพียงสตรีมวิดีโอ มีประโยชน์สำหรับองค์ประกอบโอเวอร์เลย์แบบกำหนดเอง
class CustomPlayerViewController: UIViewController {
private let playerVC = AVPlayerViewController()
override func viewDidLoad() {
super.viewDidLoad()
playerVC.delegate = self
playerVC.showsPlaybackControls = true
playerVC.entersFullScreenWhenPlaybackBegins = true
}
}
extension CustomPlayerViewController: AVPlayerViewControllerDelegate {
func playerViewController(
_ playerViewController: AVPlayerViewController,
willBeginFullScreenPresentationWithAnimationCoordinator coordinator: UIViewControllerTransitionCoordinator
) {
// เพิ่มปุ่มโอเวอร์เลย์
}
func playerViewController(
_ playerViewController: AVPlayerViewController,
didUpdate legibleMediaSelection: AVMediaSelectionGroup
) {
print("เลือกภาษาคำบรรยายใหม่แล้ว")
}
}
ดีลิเกตช่วยให้สกัดกั้นเหตุการณ์การเปลี่ยน คำบรรยาย การเข้าและออกจากโหมดเต็มหน้าจอ รวมถึงการเริ่มและสิ้นสุด Picture in Picture ใน WWDC 2024 Apple แนะนำให้ใช้ดีลิเกตสำหรับการวิเคราะห์ — บันทึกการเปลี่ยนแต่ละครั้งภายใน 100 มิลลิวินาที
AVPlayerViewController แสดง คำบรรยาย และแทร็กเสียงที่มีทั้งหมดโดยอัตโนมัติหากฝังอยู่ในไฟล์มีเดียหรือระบุในไฟล์ประกาศ HLS ผู้ใช้สามารถสลับผ่านเมนูที่ปรากฏเมื่อแตะไอคอนคำบรรยายในแถบขนส่ง
สำหรับสตรีม HLS ไฟล์ประกาศ M3U8 มีรายการตัวเลือกภาษาที่มี AVPlayer โหลดส่วนคำบรรยาย WebVTT ที่เกี่ยวข้องและส่งไปยัง AVPlayerLayer สำหรับการเรนเดอร์ iOS 16+ รองรับการจัดรูปแบบคำบรรยายผ่าน AVTextStyleRule
func selectAudioTrack(languageCode: String) {
guard let group = player.currentItem?
.asset.mediaSelectionGroup(forMediaCharacteristic: AVMediaCharacteristic.audible)
else { return }
for option in group.options {
if option.extendedLanguageTag?.hasPrefix(languageCode) == true {
player.currentItem?.select(option, in: group)
}
}
}
เมธอด selectAudioTrack ค้นหาในหมู่ ตัวเลือกเสียง ของกลุ่ม audible สำหรับตัวเลือกที่ extendedLanguageTag ตรงกับรหัสภาษาที่ต้องการ ซึ่งช่วยให้สามารถ implement คุณสมบัติ “เสียงต้นฉบับ” ในแอปที่มีเนื้อหาหลายภาษา
โหมด Picture in Picture (PiP) ช่วยให้แสดงวิดีโอในหน้าต่างลอยเหนือแอปอื่นๆ บน iPad คุณสมบัตินี้มีให้ใช้ตั้งแต่ iOS 9 บน iPhone — ตั้งแต่ iOS 14 AVPlayerViewController จะเพิ่มปุ่ม PiP ในแถบขนส่งโดยอัตโนมัติเมื่อสมัครรับ UIBackgroundModes
ในการเปิดใช้งาน PiP ให้เพิ่มคีย์ UIBackgroundModes ด้วยค่า audio และ airplay ใน Info.plist หลังจากนั้น ปุ่ม PiP จะปรากฏในตัวควบคุม ซึ่งเมื่อแตะจะย่อวิดีโอเป็นหน้าต่างลอยขนาด 192x108 จุด
เหตุการณ์ PiP จัดการผ่านดีลิเกต: playerViewController(_:willStartPictureInPictureFromFullScreen:) และ playerViewController(_:didStopPictureInPicture:) ตาม Apple HIG ขนาดหน้าต่าง PiP ขั้นต่ำควรอย่างน้อย 120x68 จุดเพื่อรักษาความอ่านได้ของเนื้อหา
คำถามที่พบบ่อย
ไม่ วิดีโอ YouTube ต้องใช้ มุมมองเว็บ WKWebView หรือไลบรารี YouTube iOS Helper เนื่องจาก YouTube ใช้ระบบ DRM ของตัวเอง AVPlayerViewController ออกแบบมาสำหรับสตรีมมีเดียโดยตรงผ่าน URL
ตั้งค่าคุณสมบัติ showsPlaybackControls เป็น false หลังจากนั้น หน้าจอจะว่างเปล่า — มีเพียงสตรีมวิดีโอ หากต้องการนำปุ่มแบบกำหนดเองกลับมา ให้เพิ่มโอเวอร์เลย์ผ่าน addSubview ทับบนตัวควบคุม
ใช่ ตัวควบคุมรองรับ HLS Live อย่างสมบูรณ์ แถบขนส่งแสดงตัวบ่งชี้สดแทนแถบเลื่อนความคืบหน้า ความหน่วงขึ้นอยู่กับการกำหนดค่า HLS — ขั้นต่ำ 6 วินาทีเมื่อตั้งค่า low-latency
สมัครรับ KVO บนคุณสมบัติ AVPlayerItem.status เมื่อเกิดข้อผิดพลาด สถานะจะเปลี่ยนเป็น .failed รับรายละเอียดผ่านคุณสมบัติ error ของ AVPlayerItem และแสดงการแจ้งเตือนให้ผู้ใช้ทราบ — มักเป็นปัญหาเครือข่ายหรือ URL ไม่ถูกต้อง
ได้ ใช้ AVAsset พร้อม AVAssetResourceLoader แบบกำหนดเองเพื่อป้อนข้อมูลจาก RAM implement AVAssetResourceLoaderDelegate และส่งคืนไบต์จากบัฟเฟอร์แทนการอ่านจากดิสก์
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ