AVFoundation คือเฟรมเวิร์กมัลติมีเดียของ Apple ที่ให้เวิร์กโฟลว์ครบวงจรสำหรับการทำงานกับเสียง วิดีโอ และรูปภาพบน iOS, macOS, tvOS และ watchOS ครอบคลุมการจับภาพจากกล้องและไมโครโฟน การเล่นไฟล์สื่อ การแก้ไขแทร็กเสียง การประมวลผลเสียงแบบเรียลไทม์ และการสตรีมผ่านเครือข่าย ตาม Apple AVFoundation Documentation (2026) เฟรมเวิร์กนี้ถูกใช้ใน 90% ของแอปพลิเคชัน App Store ที่ทำงานกับเนื้อหาสื่อ
ประเด็นสำคัญ
AVFoundation คือเฟรมเวิร์กมัลติมีเดียพื้นฐานของ Apple ที่ถูกเปิดตัวใน iOS 4 (2010) เพื่อแทนที่ UIWebView ที่ล้าสมัยสำหรับการเล่นเสียงและวิดีโอ ตั้งแต่นั้นมา AVFoundation ได้พัฒนาเป็นชุดเครื่องมือที่สมบูรณ์สำหรับการทำงานกับสื่อทุกประเภท ตั้งแต่การเล่นไฟล์ MP3 ธรรมดาไปจนถึงการจับภาพวิดีโอระดับมืออาชีพด้วยไมโครโฟนหลายช่องสัญญาณและการแปลงเสียงผ่านเอฟเฟกต์แบบเรียลไทม์
สถาปัตยกรรมของ AVFoundation สร้างขึ้นจากนามธรรมพื้นฐานหลายอย่าง: AVAsset (ข้อมูลสื่อ), AVPlayer (การเล่น), AVCaptureSession (การจับภาพ) และ AVAudioEngine (การประมวลผล) แต่ละส่วนประกอบทำงานแบบอะซิงโครนัส ซึ่งมีความสำคัญอย่างยิ่งต่อการรักษาความลื่นไหลของ UI ในระหว่างการโหลดหรือประมวลผลไฟล์ขนาดใหญ่ ตามข้อมูลของ Apple (WWDC 2025) AVFoundation จัดการวิดีโอสูงสุด 8K บนอุปกรณ์ที่ใช้ชิปซีรีส์ M โดยไม่สูญเสียประสิทธิภาพ
AVFoundation ให้บริการจับภาพวิดีโอจากกล้องที่รองรับ 4K ProRes, HDR และสูงสุด 240 FPS ในโหมดสโลว์โมชั่น การบันทึกและมิกซ์เสียงจากไมโครโฟนในตัวและภายนอก การเล่นสื่อที่รองรับ HLS, MPEG-4, QuickTime, MP3, AAC และ FLAC การส่งออกและแปลงไฟล์ผ่าน AVAssetExportSession การประมวลผลเสียงแบบเรียลไทม์ผ่าน AVAudioEngine พร้อมเอฟเฟกต์รีเวิร์บ อีควอไลเซอร์ และการเปลี่ยนระดับเสียง รวมถึงการสตรีมผ่าน AirPlay และโปรโตคอลเครือข่าย
AVFoundation ประกอบด้วยหลายโมดูล แต่ละโมดูลรับผิดชอบพื้นที่เฉพาะของการทำงานกับสื่อ การเลือกส่วนประกอบขึ้นอยู่กับงาน: การจับภาพ การเล่น การส่งออก หรือการประมวลผลแบบเรียลไทม์
| ส่วนประกอบ | วัตถุประสงค์ | คลาสหลัก |
|---|---|---|
| การจับภาพ | ทำงานกับกล้องและไมโครโฟน | AVCaptureSession |
| การเล่น | เครื่องเล่นเสียงและวิดีโอ | AVPlayer / AVAudioPlayer |
| การแก้ไข | การประกอบและตัดต่อ | AVMutableComposition |
| การส่งออก | การแปลงเป็นรูปแบบอื่น | AVAssetExportSession |
| เอนจินเสียง | การประมวลผลเสียงแบบเรียลไทม์ | AVAudioEngine |
| เมทาดาตา | การอ่าน ID3, EXIF และ XMP | AVMetadataItem |
AVCaptureSession คือออบเจกต์ศูนย์กลางสำหรับการจับภาพวิดีโอและเสียง มันจัดการสตรีมข้อมูลขาเข้าจากอุปกรณ์จริง (กล้อง ไมโครโฟน) กำหนดค่าการตั้งค่า (ความละเอียด FPS รูปแบบ) และส่งต่อไปยังเอาต์พุต: การแสดงตัวอย่าง (AVCaptureVideoPreviewLayer) การบันทึกไฟล์ (AVCaptureMovieFileOutput) หรือการประมวลผลแบบเฟรมต่อเฟรม (AVCaptureVideoDataOutput)
AVPlayer คือเครื่องเล่น AVFoundation อเนกประสงค์ที่สามารถเล่นเนื้อหาสื่อทั้งในเครื่องและผ่านเครือข่าย AVPlayer รองรับการสตรีม HLS, MPEG-4, QuickTime Movie และรูปแบบเสียงส่วนใหญ่ การควบคุมการเล่นทำแบบอะซิงโครนัสผ่าน AVPlayerItem AVPlayerViewController ให้อินเทอร์เฟซผู้ใช้สำเร็จรูปพร้อมตัวควบคุม: เล่น/หยุดชั่วคราว การกรอ AirPlay และ PiP
การจับภาพวิดีโอและเสียงเป็นหนึ่งในความสามารถที่เป็นที่ต้องการมากที่สุดของ AVFoundation การตั้งค่าเซสชันการจับภาพมีหลายขั้นตอน: การสร้าง AVCaptureSession การเพิ่มอินพุต (กล้อง ไมโครโฟน) การกำหนดค่าเอาต์พุต และการเริ่มเซสชัน
มาดูการตั้งค่า AVCaptureSession ทีละขั้นตอนสำหรับการจับภาพวิดีโอจากกล้องหลังของ iPhone และบันทึกเสียงจากไมโครโฟนพร้อมกัน กระบวนการประกอบด้วยสี่ขั้นตอนใน Swift
import AVFoundation
// 1. การสร้างและกำหนดค่าเซสชัน
let session = AVCaptureSession()
session.sessionPreset = .hd1920x1080
// 2. การเพิ่มอินพุตกล้อง
guard let camera = AVCaptureDevice.default(
for: .video
) else { return }
let cameraInput = try? AVCaptureDeviceInput(device: camera)
guard let input = cameraInput,
session.canAddInput(input)
else { return }
session.addInput(input)
// 3. การเพิ่มเอาต์พุตสำหรับบันทึก
let output = AVCaptureMovieFileOutput()
guard session.canAddOutput(output) else { return }
session.addOutput(output)
// 4. การเริ่มเซสชัน
session.startRunning()
โค้ด Swift สร้าง AVCaptureSession ด้วยพรีเซ็ต Full HD เชื่อมต่อกล้องหลังเป็นแหล่งวิดีโอ และเพิ่มเอาต์พุตสำหรับการบันทึกไฟล์ หลังจาก session.startRunning() กล้องจะเริ่มส่งเฟรมไปยังตัวอย่างและไฟล์เอาต์พุต การบันทึกจะหยุดผ่าน output.stopRecording() พร้อมตัวเลือกในการบันทึกลงแกลเลอรี
สำหรับการจับภาพ เฉพาะเสียง (ไม่มีวิดีโอ) จะเพิ่มเฉพาะไมโครโฟนไปยัง AVCaptureSession ผ่าน AVCaptureDevice.default(.audio) เอาต์พุตคือ AVAudioFileOutput หรือ AVCaptureAudioDataOutput สำหรับการประมวลผลเสียงแบบเรียลไทม์ AVFoundation รองรับการจับภาพหลายช่องสัญญาณ: สูงสุด 8 ช่องสัญญาณเสียงบน iPad Pro และสูงสุด 2 บน iPhone ทำให้สามารถบันทึกเสียงสเตอริโอจากไมโครโฟนภายนอกผ่าน Lightning, USB-C หรือ Bluetooth การเลือกแหล่งอินพุตทำผ่าน AVAudioSession.sharedInstance().setPreferredInput ซึ่งมีความสำคัญสำหรับแอปพลิเคชันที่ทำงานกับหูฟังภายนอกและไมโครโฟน Bluetooth
AVFoundation มีสองวิธีหลักในการเล่นสื่อ: AVPlayer สำหรับวิดีโอและ AVAudioPlayer สำหรับเสียง มาดูตัวอย่างการเล่นสตรีม HLS ระยะไกลโดยใช้ AVPlayer
โค้ดสร้าง AVPlayer โหลดสตรีม HLS จาก URL และเริ่มเล่นที่ระดับเสียงต่ำ AVPlayerItem จัดการสถานะการโหลดและการบัฟเฟอร์ และการสังเกต KVO เกี่ยวกับสถานะช่วยให้จัดการข้อผิดพลาดได้
import AVFoundation
import AVKit
// 1. การสร้าง AVPlayer ด้วยสตรีม HLS
let url = URL(
string: "https://example.com/stream.m3u8"
) !
let player = AVPlayer(url: url)
player.volume = 0.7
// 2. การเล่น
player.play()
// 3. การแสดงเครื่องเล่น
let playerVC = AVPlayerViewController()
playerVC.player = player
present(playerVC, animated: true)
// 4. การตรวจสอบสถานะ
player.currentItem?.addObserver(
self,
forKeyPath: "status",
options: .new,
context: nil
)
โค้ดสร้าง AVPlayer ด้วย URL HLS ตั้งระดับเสียงเป็น 70% และเริ่มเล่น AVPlayerViewController ให้อินเทอร์เฟซผู้ใช้ในตัวพร้อมตัวควบคุม AirPlay และโหมดภาพซ้อนภาพ สถานะของเครื่องเล่นถูกตรวจสอบผ่าน KVO เพื่อจัดการกรณีที่สตรีม HLS ไม่พร้อมใช้งานชั่วคราว
สำหรับการเล่นเสียงที่ไม่มีอินเทอร์เฟซวิดีโอจะใช้ AVAudioPlayer ซึ่งเป็นเครื่องเล่นน้ำหนักเบาที่ไม่ต้องการ AVPlayerItem AVAudioPlayer รองรับรูปแบบเสียง MP3, AAC, ALAC, FLAC, WAV และ AIFF มีเมธอด play(), pause() และ stop() รวมถึง AVAudioPlayerDelegate สำหรับติดตามการเล่นเสร็จสิ้นและข้อผิดพลาดในการถอดรหัส AVAudioPlayer เหมาะสำหรับการเล่นเพลงพื้นหลัง พอดแคสต์ และเอฟเฟกต์เสียงในเกมบน iOS และ macOS
มาดูอีกสองสถานการณ์ทั่วไปในการทำงานกับ AVFoundation: การประมวลผลเสียงผ่าน AVAudioEngine และการส่งออกวิดีโอเป็นรูปแบบอื่น
AVAudioEngine ช่วยให้ประมวลผลเสียงแบบเรียลไทม์โดยการเชื่อมต่อโหนดในกราฟประมวลผล: โหนดอินพุต (ไมโครโฟน) → เอฟเฟกต์ → โหนดเอาต์พุต (ลำโพง) ในตัวอย่างด้านล่างนี้ มีการเพิ่มรีเวิร์บให้กับเสียง
let engine = AVAudioEngine()
let reverb = AVAudioUnitReverb()
// การตั้งค่ารีเวิร์บ
reverb.loadFactoryPreset(.largeHall)
reverb.wetDryMix = 40
// การเชื่อมต่อ: ไมโครโฟน -> รีเวิร์บ -> ลำโพง
engine.attach(reverb)
engine.connect(
engine.inputNode,
to: reverb,
format: nil
)
engine.connect(
reverb,
to: engine.mainMixerNode,
format: nil
)
try? engine.start()
AVAudioEngine สร้างกราฟของ สามโหนด: อินพุต (ไมโครโฟน) เอฟเฟกต์ (รีเวิร์บด้วยพรีเซ็ตห้องโถงใหญ่) และเอาต์พุต (ลำโพง) หลังจาก engine.start() เสียงจากไมโครโฟนจะถูกประมวลผลโดยเอฟเฟกต์แบบเรียลไทม์และส่งออกไปยังหูฟังหรือลำโพงของอุปกรณ์ ความหน่วงในการประมวลผลน้อยกว่า 10 มิลลิวินาทีบนอุปกรณ์ Apple สมัยใหม่ทั้งหมด
ความสามารถเพิ่มเติมของ AVAudioEngine คือการวิเคราะห์เสียงผ่าน AVAudioUnitEQ และ AVAudioUnitMixer นักพัฒนาสามารถเพิ่มอีควอไลเซอร์ คอมเพรสเซอร์ และลิมิตเตอร์ให้กับสตรีมเสียงใดก็ได้ สำหรับแอปพลิเคชันเพลง AVFoundation มี AVAudioSequencer สำหรับเล่นไฟล์ MIDI และ AVSpeechSynthesizer สำหรับสังเคราะห์เสียงพูด ส่วนประกอบทั้งหมดทำงานในกราฟเสียงเดียว ให้ความหน่วงระหว่างการจับภาพและการประมวลผลน้อยกว่า 5 มิลลิวินาทีบนอุปกรณ์ Apple
เมื่อทำงานกับ AVFoundation สิ่งสำคัญคือต้องพิจารณา สิทธิ์ของระบบ: การเข้าถึงกล้องต้องใช้ NSCameraUsageDescription ใน Info.plist และสำหรับไมโครโฟนต้องใช้ NSMicrophoneUsageDescription AVFoundation จะแสดงไดอะล็อกขอสิทธิ์ของระบบโดยอัตโนมัติเมื่อพยายามเข้าถึงอุปกรณ์ครั้งแรก การปฏิเสธของผู้ใช้จะถูกจัดการผ่าน AVCaptureDevice.authorizationStatus() ซึ่งช่วยให้แสดงข้อความที่เหมาะสมเกี่ยวกับการไม่พร้อมใช้งานของกล้องพร้อมคำแนะนำให้ไปที่การตั้งค่า
AVFoundation รองรับ การเล่นเสียงพื้นหลัง ผ่านโหมด Audio Background Mode ใน Capabilities ของโปรเจกต์ ในการเปิดใช้งาน เพียงเพิ่มรายการ audio ใน UIBackgroundModes Info.plist และกำหนดค่า AVAudioSession ด้วยหมวดหมู่ .playback วิดีโอจะไม่เล่นในพื้นหลังตามค่าเริ่มต้น แต่คุณสามารถใช้ AVPlayer กับโหมดภาพซ้อนภาพเพื่อเล่นวิดีโอต่อในแอปที่ย่อเล็กสุดบน iPad ได้ ไอคอนโหมด PiP ถูกกำหนดค่าผ่าน AVPictureInPictureController ร่วมกับดีลิเกตของโปรโตคอล
คำถามที่พบบ่อย
iOS 4+ สำหรับการเล่นและการจับภาพพื้นฐาน iOS 8+ สำหรับ AVAudioEngine iOS 17+ สำหรับ AVAssetWriter ในโหมด HDR เฟรมเวิร์กเวอร์ชันปัจจุบันรองรับอุปกรณ์ iPhone, iPad และ Mac ทุกรุ่น
ได้ AVPlayer รองรับ HLS (HTTP Live Streaming) ซึ่งเป็นโปรโตคอลสตรีมหลักของ Apple ในการส่งสื่อไปยังเซิร์ฟเวอร์ ให้ใช้ AVAssetWriter กับโปรโตคอลที่กำหนดเองบน URLSession
AVFoundation คือเฟรมเวิร์กระดับต่ำสำหรับทำงานกับสื่อ AVKit คือเลเยอร์เหนือ AVFoundation ที่ให้ส่วนประกอบอินเทอร์เฟซผู้ใช้สำเร็จรูป: AVPlayerViewController, AVPictureInPictureController และ AVPipView
ได้ ตั้งแต่ iOS 11 AVFoundation รองรับ FLAC (Free Lossless Audio Codec) สำหรับการเล่น ALAC (Apple Lossless) รองรับตั้งแต่ iOS 4 โคเดกทั้งสองทำงานผ่าน AVAudioPlayer และ AVPlayer
ผ่าน RPScreenRecorder จาก ReplayKit ซึ่งใช้ AVFoundation ภายใน ตั้งแต่ iOS 9 เป็นต้นไป การบันทึกหน้าจอสามารถใช้ได้ผ่าน RPScreenRecorder.shared().startRecording() พร้อมไมโครโฟนเสริม
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ