Audio Session — nó là gì, các danh mục và cấu hình trong iOS

Tác giả: IT Sectr Đã đăng: 2026-05-24 Thời gian đọc: 8 phút

Audio Session là cơ chế trung tâm của iOS để quản lý hành vi âm thanh của ứng dụng: tương tác với hệ thống, xử lý gián đoạn và định tuyến âm thanh. Mỗi ứng dụng iOS nhận một phiên âm thanh duy nhất xác định cách âm thanh hoạt động khi màn hình bị khóa, trong cuộc gọi và khi kết nối Bluetooth. Theo Tài liệu Nhà phát triển Apple, 2026, Audio Session được cấu hình thông qua danh mục và chế độ — nếu không cấu hình đúng, ứng dụng có thể không phát âm thanh trong nền.

Các điểm chính

  • Audio Session (AVAudioSession) là một đối tượng hệ thống trong iOS quản lý hành vi âm thanh của ứng dụng ở cấp hệ điều hành.
  • Danh mục phiên xác định hành vi cơ bản: playback, record, ambient, playAndRecord và các danh mục khác.
  • Các chế độ và tùy chọn làm rõ hành vi: default, voiceChat, videoRecording, allowBluetooth.
  • Khi bị gián đoạn (cuộc gọi, báo thức), phiên nhận được thông báo qua NotificationCenter với loại interruptionType.
  • Để phát trong nền, cần kích hoạt Background Modes — Audio, AirPlay and Picture in Picture.

Audio Session là gì?

Audio Session là một thể hiện AVAudioSession duy nhất được hệ thống tạo ra khi ứng dụng khởi chạy và tồn tại trong suốt vòng đời của nó. Nó hoạt động như một trung gian giữa ứng dụng và hệ thống âm thanh iOS: cấu hình danh mục xác định liệu ứng dụng có được phép phát âm thanh trong nền hay không, âm thanh có bị tắt tiếng trong cuộc gọi hay không và thiết bị nào sẽ xuất âm thanh.

Không giống như Android Audio Focus, nơi mỗi ứng dụng độc lập yêu cầu và giải phóng tiêu điểm, iOS Audio Session được quản lý tập trung thông qua một phiên cho mỗi ứng dụng. Khi một phiên được kích hoạt, hệ thống tự động hủy kích hoạt phiên của ứng dụng trước đó, gửi cho nó một thông báo gián đoạn. Sự khác biệt về kiến trúc này xác định các cách tiếp cận khác nhau để xử lý âm thanh trên hai nền tảng.

Theo Phiên 211 của WWDC 2024, khoảng 40% sự cố âm thanh trong ứng dụng iOS là do cấu hình Audio Session không chính xác. Lỗi phổ biến nhất là chọn danh mục ambient thay vì playback, khiến âm thanh biến mất khi màn hình bị khóa.

Cách AVAudioSession hoạt động

Khi khởi chạy, ứng dụng nhận sharedInstance của phiên, đặt danh mục qua lệnh gọi setCategory(_:mode:options:) và kích hoạt phiên qua setActive(true). Sau khi kích hoạt, iOS xem xét các chính sách danh mục để định tuyến. Nếu một ứng dụng khác kích hoạt phiên của nó, ứng dụng hiện tại nhận được thông báo AudioSessionInterruptionType.began qua Notification.Name.AVAudioSessionInterruption.

Các danh mục Audio Session

Danh mục là tham số chính của Audio Session, xác định sáu tùy chọn hành vi được xác định trước. Chọn danh mục là quyết định đầu tiên và quan trọng nhất khi thiết lập âm thanh trong iOS.

Danh mụcKhi nào sử dụngÂm thanh nềnCông tắc tắt tiếng ảnh hưởng
ambientTrò chơi, hiệu ứng nềnKhông
playbackNhạc, podcast, sách nóiKhông
recordGhi âm giọng nói, ghi âmKhôngKhông áp dụng
playAndRecordVoIP, tin nhắn thoạiKhông
multiRouteBộ trộn DJ, karaokeKhông
soloAmbientMặc định (iOS default)Không

Danh mục Playback — lựa chọn chính cho trình phát

Đối với trình phát nhạc và video, luôn sử dụng playback. Danh mục này cho phép: phát âm thanh khi màn hình bị khóa, khi công tắc tắt tiếng tắt (nút vật lý trên iPhone) và khi ứng dụng ở trong nền. Nếu không có danh mục playback, phiên sẽ bị hủy kích hoạt khi màn hình bị khóa hoặc ứng dụng được thu nhỏ.

Danh mục ambient phù hợp cho trò chơi và ứng dụng có âm thanh nền — nó cho phép các ứng dụng khác tiếp tục phát. Ví dụ: nếu người dùng đang nghe nhạc và mở một trò chơi có phiên ambient, nhạc sẽ tiếp tục phát trên âm thanh của trò chơi. Đây là sự khác biệt cơ bản so với Android, nơi kịch bản như vậy yêu cầu quyền duck rõ ràng.

Cách cấu hình Audio Session

Việc cấu hình Audio Session nên được thực hiện trước khi bắt đầu bất kỳ phát lại nào. Nên cấu hình phiên trong phương thức application(_:didFinishLaunchingWithOptions:) hoặc trong bộ khởi tạo của trình phát. Sau khi đặt danh mục, phiên phải được kích hoạt.

Thiết lập Audio Session cơ bản trong Swift

swift
import AVFAudio

let session = AVAudioSession.sharedInstance

do {
    try session.setCategory(
        playback,
        mode: default,
        options: [allowBluetooth, defaultToSpeaker]
    )
    try session.setActive(true)
} catch {
    print("Thiết lập Audio Session thất bại: \(error.localizedDescription)")
}

Tham số options bao gồm allowBluetooth (xuất ra tai nghe Bluetooth) và defaultToSpeaker (phát qua loa thay vì tai nghe). Tùy chọn allowBluetooth là bắt buộc đối với ứng dụng hỗ trợ tai nghe Bluetooth — nếu không có tùy chọn này, âm thanh có thể được định tuyến đến loa tích hợp ngay cả khi tai nghe được kết nối.

Cấu hình cho ghi âm và phát lại (VoIP)

swift
let session = AVAudioSession.sharedInstance
try session.setCategory(
    playAndRecord,
    mode: voiceChat,
    options: [allowBluetooth, allowBluetoothA2DP]
)

try session.overrideOutputAudioPort(speaker)
try session.setActive(true)

Danh mục playAndRecord với chế độ voiceChat tối ưu hóa đường dẫn âm thanh cho giao tiếp bằng giọng nói: kích hoạt khử tiếng vang, điều khiển độ lợi tự động (AGC) và chọn codec tối ưu. OverrideOutputAudioPort(.speaker) buộc xuất qua loa ngay cả khi tai nghe được kết nối — hữu ích cho loa ngoài.

Kích hoạt và hủy kích hoạt phiên

Gọi setActive(true) kích hoạt phiên và thông báo cho hệ thống rằng ứng dụng sẽ sử dụng âm thanh. Khi phát lại bị tạm dừng, nên hủy kích hoạt phiên để các ứng dụng khác có thể nhận được luồng âm thanh. Ngoại lệ là các ứng dụng có phát lại nền kéo dài (nhạc, podcast), nơi phiên vẫn hoạt động trong suốt toàn bộ bản nhạc.

Điều quan trọng là phải xử lý lỗi khi gọi setActive. Nếu một phiên khác có mức ưu tiên cao đang hoạt động (ví dụ: Điện thoại trong cuộc gọi), setActive có thể đưa ra lỗi. Trong trường hợp này, bạn cần đợi thông báo AudioSessionInterruptionType.ended và thử kích hoạt lại.

Chế độ và chính sách Audio Session

Chế độ làm rõ danh mục và tối ưu hóa đường dẫn âm thanh cho một trường hợp sử dụng cụ thể. Mỗi chế độ thay đổi hành vi của AGC, khử tiếng vang và codec. Các chế độ không thay thế danh mục mà bổ sung cho nó — một danh mục có thể hoạt động với các chế độ khác nhau.

  • default — chế độ tiêu chuẩn cho nhạc và video. AGC tắt, khử tiếng vang tối thiểu.
  • voiceChat — tối ưu hóa cho VoIP. Kích hoạt khử tiếng vang, AGC, giảm nhiễu. Sử dụng với danh mục playAndRecord.
  • videoRecording — để quay video. Ưu tiên chất lượng ghi hơn phát lại. Sử dụng với danh mục record hoặc playAndRecord.
  • measurement — để đo âm thanh. Xử lý tín hiệu tối thiểu, không có AGC hoặc khử tiếng vang.
  • gameChat — để trò chuyện thoại trong trò chơi. Tương tự voiceChat, nhưng ưu tiên âm thanh trò chơi.
  • moviePlayback — để xem phim. Tối ưu hóa cho âm thanh đa kênh (5.1, 7.1) và Dolby Atmos.

Tùy chọn danh mục Audio Session

Các tùy chọn cung cấp khả năng điều chỉnh tinh vi hành vi của phiên. Mỗi tùy chọn là một cờ có thể kết hợp với các tùy chọn khác trong một mảng. Ví dụ: [.allowBluetooth, .defaultToSpeaker, .interruptSpokenAudioAndMix] cho phép xuất âm thanh ra tai nghe Bluetooth, sử dụng loa theo mặc định và trộn với sách nói.

Trên iOS 17+, tùy chọn spatialAudio đã xuất hiện, cho phép âm thanh không gian được cá nhân hóa cho AirPods thông qua AVAudioSessionSpatialPreferences. Theo WWDC 2024, âm thanh không gian làm tăng mức độ tương tác của người dùng trong ứng dụng nhạc lên 25% trong các thử nghiệm của Apple.

Xử lý gián đoạn và cuộc gọi

Gián đoạn là sự khác biệt chính giữa Audio Session và Android Audio Focus. Trong iOS, gián đoạn được xử lý thông qua NotificationCenter bằng cách đăng ký AVAudioSession.interruptionNotification. Thông báo chứa một từ điển với loại gián đoạn: began hoặc ended.

Đăng ký thông báo gián đoạn

swift
override func viewDidLoad() {
    super.viewDidLoad()
    let center = NotificationCenter.default
    center.addObserver(
        self,
        selector: #selector(handleInterruption),
        name: AVAudioSession.interruptionNotification,
        object: nil
    )
}

@objc func handleInterruption(_ notification: Notification) {
    guard let userInfo = notification.userInfo,
        let type = userInfo[AVAudioSession.interruptionTypeKey]
            as? AVAudioSessionInterruptionType
    else { return }

    switch type {
    case began:
        pausePlayback()
    case ended:
        guard let options = userInfo[AVAudioSession.interruptionOptionKey]
            as? AVAudioSessionInterruptionOptions
        else { return }

        if options.contains(shouldResume) {
            resumePlayback()
        }
    }

Khi nhận được interruptionType.began, trình phát nên tạm dừng phát lại. Khi nhận được interruptionType.ended, thuộc tính interruptionOptionKey cho biết trình phát có thể tự động tiếp tục hay không (shouldResume). Nếu người dùng từ chối cuộc gọi, shouldResume = true. Nếu cuộc gọi kết thúc do hết thời gian chờ — shouldResume = false, không được phép tiếp tục.

Xử lý gián đoạn từ các ứng dụng khác

Khi một ứng dụng khác kích hoạt Audio Session của nó với danh mục playback, phiên hiện tại nhận được thông báo gián đoạn. Nếu ứng dụng khác sử dụng ambient, không có gián đoạn nào xảy ra — âm thanh được trộn lẫn. Hành vi này hoàn toàn khác với Android, nơi bất kỳ kích hoạt Audio Focus nào cũng kích hoạt sự kiện LOSS.

Đối với các ứng dụng cần tiếp tục phát lại khi các phiên khác được kích hoạt (ví dụ: điều hướng trong khi nhạc đang phát), hãy sử dụng tùy chọn .mixWithOthers. Tùy chọn này cho phép trộn âm thanh với các ứng dụng khác và không có gián đoạn nào được gửi. MixWithOthers là tương đương iOS của chế độ duck trong Android.

Định tuyến âm thanh và Bluetooth

Audio Session tự động quản lý định tuyến âm thanh giữa loa tích hợp, tai nghe, tai nghe Bluetooth và thiết bị AirPlay. Ứng dụng có thể theo dõi tuyến đường hiện tại thông qua thuộc tính currentRoute và nhận thông báo về các thay đổi qua AVAudioSession.routeChangeNotification.

Khi tai nghe Bluetooth được kết nối, iOS tự động chuyển đầu ra âm thanh sang chúng nếu phiên được cấu hình với tùy chọn allowBluetooth. Nếu không có tùy chọn này, âm thanh tiếp tục qua loa tích hợp. Bắt đầu từ iOS 16, khi kết nối AirPods Pro, hệ thống tự động bật đồng bộ hóa ProMotion để giảm độ trễ.

Theo dõi thay đổi tuyến đường

Đăng ký routeChangeNotification cho phép phản ứng với việc kết nối và ngắt kết nối tai nghe. Khi tai nghe Bluetooth bị ngắt kết nối, trình phát nên tạm dừng phát lại — người dùng có thể không mong đợi âm thanh bắt đầu phát từ loa điện thoại. Theo Apple HIG (2026), đây là hành vi bắt buộc đối với ứng dụng nhạc.

Các thuộc tính availableInputsavailableOutputs trả về danh sách các thiết bị âm thanh có sẵn cùng với loại của chúng (builtInSpeaker, headphones, bluetoothA2DP, hdmi). Nhà phát triển có thể chọn theo chương trình một thiết bị cụ thể thông qua overrideOutputAudioPort cho các kịch bản định tuyến tùy chỉnh.

Các câu hỏi thường gặp

Audio Session khác Android Audio Focus như thế nào?

Sự khác biệt chính là kiến trúc. Audio Session là một phiên tập trung duy nhất cho mỗi ứng dụng được cấu hình một lần. Android Audio Focus yêu cầu yêu cầu tiêu điểm thủ công mỗi khi phát. Ngoài ra, iOS hỗ trợ trộn qua tùy chọn mixWithOthers, trong khi trên Android duck là lựa chọn thay thế duy nhất cho việc dừng hoàn toàn.

Tại sao âm thanh biến mất khi khóa màn hình iPhone?

Nguyên nhân phổ biến nhất là danh mục Audio Session không chính xác. Nếu ambient hoặc soloAmbient được chọn, âm thanh dừng lại khi màn hình bị khóa. Chuyển danh mục sang playback và đảm bảo rằng Background Modes — Audio, AirPlay, and Picture in Picture đã được thêm vào Info.plist.

Làm thế nào để cho phép hai ứng dụng phát đồng thời trên iOS?

Thêm tùy chọn .mixWithOthers vào setCategory. Điều này sẽ cho phép trộn âm thanh của ứng dụng của bạn với các phiên hoạt động khác. Nếu không có tùy chọn này, một ứng dụng mới sẽ làm gián đoạn ứng dụng hiện tại. MixWithOthers là tương tự như chế độ duck trong Android, nhưng với việc bảo toàn toàn bộ âm lượng.

Làm thế nào để chuyển âm thanh sang loa Bluetooth theo chương trình?

Sử dụng overrideOutputAudioPort với nil để chọn tự động. Để xuất cưỡng bức sang Bluetooth: lấy AVAudioSessionRouteDescription từ availableOutputs, chọn cổng có loại .bluetoothA2DP và truyền nó vào overrideOutputAudioPort. Đảm bảo rằng phiên được cấu hình với allowBluetooth.

Tôi có nên gọi setActive(false) khi tạm dừng trình phát không?

Đối với hầu hết các ứng dụng — . Hủy kích hoạt phiên khi tạm dừng cho phép các ứng dụng khác nhận được tiêu điểm âm thanh. Ngoại lệ là các trình phát nhạc có phát lại nền kéo dài. Nếu tạm dừng ngắn (dưới 5 giây), tốt hơn nên giữ phiên hoạt động để tiếp tục nhanh chóng.

Tổng kết

  • Audio Session (AVAudioSession) là phiên âm thanh duy nhất cho mỗi ứng dụng trong iOS quản lý hành vi âm thanh ở cấp hệ điều hành.
  • Sáu danh mục: ambient, playback, record, playAndRecord, multiRoute, soloAmbient — xác định hành vi âm thanh cơ bản.
  • Để phát trong nền, danh mục playbackBackground Modes trong Info.plist là bắt buộc.
  • Gián đoạn được xử lý thông qua NotificationCenter với các loại began (tạm dừng) và ended (tiếp tục khi shouldResume).
  • Tùy chọn .mixWithOthers cho phép trộn âm thanh với các ứng dụng khác mà không bị gián đoạn.
  • Định tuyến được quản lý tự động nhưng được giám sát qua routeChangeNotification để tạm dừng khi ngắt kết nối tai nghe.
  • Danh mục playAndRecord với chế độ voiceChat là tiêu chuẩn cho ứng dụng VoIP có khử tiếng vang và AGC.

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm