AVPlayerViewController: คืออะไร วิธีการผสานรวมใน iOS

ผู้แต่ง: IT Sectr เผยแพร่เมื่อ: 2026-05-23 เวลาอ่าน: 8 นาที

AVPlayerViewController เป็นตัวควบคุมเครื่องเล่นวิดีโอในตัวในระบบนิเวศของ Apple ออกแบบมาเพื่อเล่นเนื้อหามีเดียบน iOS และ tvOS โดยมีอินเทอร์เฟซแบบเต็มหน้าจอพร้อมการควบคุม รองรับคำบรรยาย และ AirPlay โดยไม่ต้องเขียนอินเทอร์เฟซผู้ใช้แบบกำหนดเอง ตาม เอกสาร Apple Developer, 2026 AVPlayerViewController ผสานรวมได้ในโค้ดเพียงไม่กี่บรรทัดและรองรับ HLS, MP4 และรูปแบบมีเดียส่วนใหญ่

ประเด็นสำคัญ

  • AVPlayerViewController เป็นตัวควบคุมการเล่นวิดีโอมาตรฐานจากเฟรมเวิร์ก AVKit สำหรับ iOS และ tvOS
  • มี อินเทอร์เฟซผู้ใช้ พร้อมใช้งานพร้อมแถบควบคุม ปุ่มเล่น และตัวบ่งชี้ความคืบหน้า
  • ตัวควบคุมรองรับ คำบรรยาย แทร็กเสียง AirPlay และ Picture in Picture โดยอัตโนมัติ
  • การผสานรวมทำผ่าน AVPlayer ซึ่งเป็นออบเจกต์พื้นฐานสำหรับจัดการการเล่น
  • นักพัฒนาสามารถ ปรับแต่ง การแสดงผลการควบคุม เพิ่มมุมมองโอเวอร์เลย์ และจัดการเหตุการณ์ผ่านดีลิเกต

AVPlayerViewController คืออะไร?

AVPlayerViewController เป็นส่วนประกอบของเฟรมเวิร์ก AVKit ที่มีอินเทอร์เฟซพร้อมใช้งานสำหรับการเล่นวิดีโอในแอปพลิเคชันของ Apple ช่วยลดความจำเป็นในการสร้างเครื่องเล่นแบบกำหนดเองตั้งแต่ต้น โดยมีระบบควบคุมมาตรฐาน: เล่น/หยุดชั่วคราว กรอไปข้างหน้า ปรับระดับเสียง และโหมดเต็มหน้าจอ

แตกต่างจาก AVPlayerLayer ระดับต่ำที่ต้องสร้างอินเทอร์เฟซผู้ใช้ด้วยตนเอง AVPlayerViewController จัดการวงจรชีวิตของเครื่องเล่นทั้งหมด ตัวควบคุมจัดการการหมุนหน้าจอโดยอัตโนมัติ ปรับให้เข้ากับพื้นที่ปลอดภัยบน iPhone ที่มีรอยบาก และรองรับการทำงานหลายอย่างพร้อมกันบน iPad

ตามเอกสารของ Apple (2026) AVPlayerViewController เข้ากันได้กับ AVPlayer และ AVQueuePlayer ทำให้สามารถเล่นทั้งไฟล์เดี่ยวและเพลย์ลิสต์ รองรับ URL จากที่จัดเก็บในเครื่อง สตรีมเครือข่าย HLS และเนื้อหา FairPlay ที่เข้ารหัส

ประวัติและเวอร์ชันของ AVPlayerViewController

ส่วนประกอบนี้ปรากฏใน iOS 8 พร้อมกับ AVKit เพื่อแทนที่ MPMoviePlayerController ที่เลิกใช้แล้ว ใน iOS 11 เพิ่มการรองรับ Picture in Picture และการแสดงคำบรรยาย ใน iOS 14 ตัวควบคุมได้รับแถบขนส่งที่ปรับแต่งได้ผ่าน AVPlayerViewControllerDelegate ตั้งแต่ iOS 16 เป็นต้นมา มีการรองรับการเปลี่ยนไฟล์มีเดียแบบไดนามิกโดยไม่ต้องสร้างเครื่องเล่นใหม่

AVPlayerViewController สมัยใหม่ได้รับการปรับให้เหมาะสมกับจอแสดงผล ProMotion — อัตราเฟรมวิดีโอจะซิงโครไนซ์กับอัตรารีเฟรชหน้าจอโดยอัตโนมัติ บน tvOS ส่วนประกอบจะปรับให้เข้ากับอินเทอร์เฟซโฟกัสของ Siri Remote และบน macOS จะปรับให้เข้ากับโหมดหน้าต่างของ QuickTime Player

AVPlayerViewController ทำงานอย่างไร

แกนหลักของตัวควบคุมคือการจับคู่ระหว่าง 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

คุณสมบัติหลักของ AVPlayerViewController

ส่วนประกอบมีชุดคุณสมบัติมากมายพร้อมใช้งานทันที ทำให้เหมาะสำหรับโปรเจกต์ส่วนใหญ่ ด้านล่างคือความสามารถหลักที่ไม่ต้องใช้โค้ดเพิ่มเติม

  • แถบขนส่ง พร้อมเล่น/หยุดชั่วคราว ข้าม 15 วินาที ควบคุมระดับเสียง และแถบเลื่อนความคืบหน้า
  • รองรับคำบรรยาย — การแสดงคำบรรยายในตัวและภายนอกโดยอัตโนมัติในรูปแบบ VTT, SRT และ iTunes Timed Text
  • AirPlay — ความสามารถในการสตรีมวิดีโอไปยัง Apple TV และอุปกรณ์อื่นๆ ที่รองรับ AirPlay
  • Picture in Picture — การเล่นในหน้าต่างลอยเมื่อแตะปุ่มพิเศษ (บน iPad และ iPhone ที่ใช้ iOS 14+)
  • โหมดเต็มหน้าจอ — การสลับอัตโนมัติเมื่อหมุนอุปกรณ์และเมื่อแตะปุ่มขยาย
  • ควบคุมความเร็ว — ระบบควบคุมในตัวสำหรับเลือกความเร็วในการเล่น (0.5x, 1.0x, 1.5x, 2.0x)
  • เนื้อหาที่ได้รับการป้องกัน — รองรับ FairPlay Streaming สำหรับเนื้อหา HLS ที่มี DRM

แถบขนส่งของ AVPlayerViewController

แถบขนส่งคือส่วนล่างของอินเทอร์เฟซที่มีปุ่มควบคุมหลัก โดยค่าเริ่มต้น แถบจะซ่อนหลังจากไม่มีการใช้งาน 3 วินาทีและปรากฏเมื่อแตะ ใน iOS 16+ สามารถใช้ดีลิเกตเพื่อควบคุมการแสดงผลของแต่ละองค์ประกอบ

ในโหมดดีบัก แถบขนส่งสามารถบังคับให้แสดงได้โดยใช้คุณสมบัติ AVPlayerViewController.requiresLinearPlayback ซึ่งป้องกันไม่ให้วิดีโอหยุดชั่วคราว มีประโยชน์สำหรับการโฆษณาคั่นและเนื้อหาการศึกษา

การผสานรวม AVPlayerViewController เข้ากับโปรเจกต์ของคุณ

การผสานรวมพื้นฐานของตัวควบคุมใช้โค้ดไม่เกิน 10 บรรทัด ขั้นแรก สร้างอินสแตนซ์ AVPlayer พร้อม URL ของไฟล์มีเดีย จากนั้นส่งต่อไปยัง AVPlayerViewController และแสดงตัวควบคุมบนหน้าจอ

การสร้างเครื่องเล่นพื้นฐานใน Swift

swift
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()

การกำหนดค่า AVPlayerItem สำหรับการควบคุมขั้นสูง

swift
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 แถบขนส่งจะหายไปทั้งหมด เหลือเพียงสตรีมวิดีโอ มีประโยชน์สำหรับองค์ประกอบโอเวอร์เลย์แบบกำหนดเอง

การปรับแต่งโดยใช้ดีลิเกต

swift
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

การเลือกแทร็กเสียงโดยโปรแกรม

swift
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 บน iPad

โหมด 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 จุดเพื่อรักษาความอ่านได้ของเนื้อหา

คำถามที่พบบ่อย

AVPlayerViewController รองรับการเล่นวิดีโอ YouTube หรือไม่?

ไม่ วิดีโอ YouTube ต้องใช้ มุมมองเว็บ WKWebView หรือไลบรารี YouTube iOS Helper เนื่องจาก YouTube ใช้ระบบ DRM ของตัวเอง AVPlayerViewController ออกแบบมาสำหรับสตรีมมีเดียโดยตรงผ่าน URL

จะปิดการใช้งานแถบขนส่งของ AVPlayerViewController ได้อย่างไร?

ตั้งค่าคุณสมบัติ showsPlaybackControls เป็น false หลังจากนั้น หน้าจอจะว่างเปล่า — มีเพียงสตรีมวิดีโอ หากต้องการนำปุ่มแบบกำหนดเองกลับมา ให้เพิ่มโอเวอร์เลย์ผ่าน addSubview ทับบนตัวควบคุม

AVPlayerViewController ทำงานกับสตรีมสด HLS หรือไม่?

ใช่ ตัวควบคุมรองรับ HLS Live อย่างสมบูรณ์ แถบขนส่งแสดงตัวบ่งชี้สดแทนแถบเลื่อนความคืบหน้า ความหน่วงขึ้นอยู่กับการกำหนดค่า HLS — ขั้นต่ำ 6 วินาทีเมื่อตั้งค่า low-latency

จะจัดการข้อผิดพลาดการโหลดวิดีโอใน AVPlayerViewController ได้อย่างไร?

สมัครรับ KVO บนคุณสมบัติ AVPlayerItem.status เมื่อเกิดข้อผิดพลาด สถานะจะเปลี่ยนเป็น .failed รับรายละเอียดผ่านคุณสมบัติ error ของ AVPlayerItem และแสดงการแจ้งเตือนให้ผู้ใช้ทราบ — มักเป็นปัญหาเครือข่ายหรือ URL ไม่ถูกต้อง

ฉันสามารถโหลดวิดีโอจากหน่วยความจำใน AVPlayerViewController ได้หรือไม่?

ได้ ใช้ AVAsset พร้อม AVAssetResourceLoader แบบกำหนดเองเพื่อป้อนข้อมูลจาก RAM implement AVAssetResourceLoaderDelegate และส่งคืนไบต์จากบัฟเฟอร์แทนการอ่านจากดิสก์

สรุป

  • AVPlayerViewController เป็นส่วนประกอบ AVKit พร้อมใช้งานสำหรับการเล่นวิดีโอบน iOS, iPadOS และ tvOS ด้วยโค้ดการผสานรวมที่น้อยที่สุด
  • ตัวควบคุมรองรับ HLS, MP4, เนื้อหา FairPlay ที่ได้รับการป้องกัน, คำบรรยาย และแทร็กเสียงพร้อมใช้งานทันที
  • สำหรับการใช้งานพื้นฐาน เพียงสร้าง AVPlayer และส่งต่อไปยังตัวควบคุม — อินเทอร์เฟซผู้ใช้จะแสดงผลโดยอัตโนมัติ
  • ดีลิเกต AVPlayerViewControllerDelegate ช่วยให้ปรับแต่งแถบขนส่ง จัดการ PiP และการเปลี่ยนคำบรรยาย
  • แถบขนส่งจะซ่อนหลังจากไม่มีการใช้งาน 3 วินาที แต่ showsPlaybackControls ให้ควบคุมการแสดงผลได้อย่างสมบูรณ์
  • สำหรับ Picture in Picture ต้องเปิดใช้งาน UIBackgroundModes audio และ airplay ใน Info.plist
  • เมื่อเกิดข้อผิดพลาด ให้ใช้ KVO บน AVPlayerItem.status เพื่อรับรายละเอียดและแสดงต่อผู้ใช้

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม