音訊屬性

音訊播放器支援屬性,可定義音訊系統如何處理指定來源的路徑、音量和焦點決策。應用程式可以將屬性附加至音訊播放內容 (例如串流服務播放的音樂或新電子郵件通知),然後將音訊來源屬性傳遞至架構,讓音訊系統使用這些屬性做出混音決策,並通知應用程式系統狀態。

在 Android 4.4 以下版本中,這個架構只會使用音訊串流類型做出混合決策。不過,根據串流類型做出這類決策的限制太多,無法在多個應用程式和裝置上產生高品質的輸出內容。舉例來說,在行動裝置上,部分應用程式 (例如 Google 地圖) 會使用 STREAM_MUSIC 串流類型播放行車路線;不過,在投放模式 (例如 Android Auto) 的行動裝置上,應用程式無法將行車路線與其他媒體串流混合。

應用程式可使用 Audio Attribute API,為音訊系統提供特定音訊來源的詳細資訊,包括用途 (來源播放的原因)、內容類型 (來源播放的內容)、標記 (來源應如何播放) 和內容 (Android 9 的新功能)。語法:

AudioAttributes {
    mUsage
    mContentType
    mSource
    mFlags
    mTags / mFormattedTags / mBundle    (key value pairs)
}
  • 使用方式。指定來源播放的原因,並控制路徑、焦點和音量決策。
  • 內容類型。指定來源播放的內容 (音樂、電影、語音、音訊、不明)。
  • 背景資訊。使用值已抽象化為 Audio HAL。
  • 標記。指定來源的播放方式。包括支援可聽性強制執行 (部分國家/地區要求相機快門聲) 和硬體音訊/視訊同步。

針對動態處理,應用程式必須區分電影、音樂和語音內容。資料本身的資訊也可能很重要,例如音量和峰值取樣值。

使用屬性

使用情形會指定串流的使用情境,並提供音訊播放的原因和用途。使用資訊比串流類型更能表達意義,可讓平台或路由政策精進音量或路由決策。

請為任何例項提供下列其中一個用途值:

  • USAGE_UNKNOWN
  • USAGE_MEDIA
  • USAGE_VOICE_COMMUNICATION
  • USAGE_VOICE_COMMUNICATION_SIGNALLING
  • USAGE_ALARM
  • USAGE_NOTIFICATION
  • USAGE_NOTIFICATION_TELEPHONY_RINGTONE
  • USAGE_NOTIFICATION_COMMUNICATION_REQUEST
  • USAGE_NOTIFICATION_COMMUNICATION_INSTANT
  • USAGE_NOTIFICATION_COMMUNICATION_DELAYED
  • USAGE_NOTIFICATION_EVENT
  • USAGE_ASSISTANCE_ACCESSIBILITY
  • USAGE_ASSISTANCE_NAVIGATION_GUIDANCE
  • USAGE_ASSISTANCE_SONIFICATION
  • USAGE_GAME
  • USAGE_VIRTUAL_SOURCE
  • USAGE_ASSISTANT

音訊屬性使用值彼此互斥。如需範例,請參閱 USAGE_MEDIAUSAGE_ALARM 定義;如需例外狀況,請參閱 AudioAttributes.Builder 定義。

內容類型

內容類型定義了聲音的內容,並表達內容的一般類別,例如電影、語音或嗶聲/鈴聲。音訊架構會使用內容類型資訊,有選擇地設定音訊後製區塊。雖然提供內容類型並非必要,但只要您知道內容類型,就應一併提供類型資訊,例如為電影串流服務使用 CONTENT_TYPE_MOVIE,或為音樂播放應用程式使用 CONTENT_TYPE_MUSIC

請為任何例項提供下列任一內容類型值:

  • CONTENT_TYPE_UNKNOWN (預設)
  • CONTENT_TYPE_MOVIE
  • CONTENT_TYPE_MUSIC
  • CONTENT_TYPE_SONIFICATION
  • CONTENT_TYPE_SPEECH

音訊屬性內容類型值彼此互斥。如要進一步瞭解內容類型,請參閱 音訊屬性 API

背景

Android 中的每個音效都會透過負責應用程式和產生音效的原因進行識別;Android 裝置會使用這項資訊,決定如何呈現音效。在 Android 8.x 以下版本中,應用程式可以使用舊版串流類型 (例如 AudioSystem.STREAM_MUSIC) 或 AudioAttributes 回報產生聲音的原因。在 Android 9 中,AudioAttributes.usage 值會在 HAL 層級抽象化為 Context

HAL 音訊環境 AudioAttributes 用法
音樂 媒體
VOICE_COMMAND USAGE_ASSISTANT
導航 ASSISTANCE_NAVIGATION_GUIDANCE
致電 VOICE_COMMUNICATION
RINGTONE NOTIFICATION_RINGTONE
通知 通知
鬧鐘 鬧鐘
SYSTEM_SOUND ASSISTANCE_SONIFICATION
不明 不明

您可以為任何例項提供下列任一 CONTEXT_NUMBER 值:

  • MUSIC_CONTEXT // 音樂播放
  • NAVIGATION_CONTEXT // 導航路線
  • VOICE_COMMAND_CONTEXT // 語音指令工作階段
  • CALL_RING_CONTEXT // 語音通話響鈴
  • CALL_CONTEXT // 語音通話
  • ALARM_CONTEXT // 來自 Android 的鬧鐘音效
  • NOTIFICATION_CONTEXT // 通知
  • SYSTEM_SOUND_CONTEXT // 使用者互動音效 (按鈕點擊等)

旗幟

標記可指定音訊架構如何將音效套用至音訊播放作業。為執行個體提供一或多個下列標記:

  • FLAG_AUDIBILITY_ENFORCED:要求系統確保音效可聽見。用於滿足舊版 STREAM_SYSTEM_ENFORCED 的需求 (例如強制啟用相機快門聲)。
  • HW_AV_SYNC:要求系統選取支援硬體 A/V 同步的輸出串流。

音訊屬性標記並非專屬,可以合併使用。如要進一步瞭解這些旗標,請參閱 音訊屬性 API

範例

在本例中,AudioAttributes.Builder 會定義新 AudioTrack 執行個體要使用的 AudioAttributes

AudioTrack myTrack = new AudioTrack(
  new AudioAttributes.Builder()
 .setUsage(AudioAttributes.USAGE_MEDIA)
    .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
    .build(),
  myFormat, myBuffSize, AudioTrack.MODE_STREAM, mySession);

相容性

應用程式開發人員應在建立或更新 Android 5.0 以上版本的應用程式時使用音訊屬性。不過,應用程式不必利用屬性;它們可以只處理舊版串流類型,或不瞭解屬性 (也就是不瞭解播放內容的一般媒體播放器)。

在這種情況下,架構會自動將舊版音訊串流類型轉譯為音訊屬性,以便與舊版裝置和 Android 版本維持回溯相容性。不過,此架構不會強制執行或保證跨裝置、製造商或 Android 版本的對應關係。

相容性對應:

Android 5.0 以上版本 Android 4.4 以下版本
CONTENT_TYPE_SPEECH
USAGE_VOICE_COMMUNICATION
STREAM_VOICE_CALL
CONTENT_TYPE_SONIFICATION
USAGE_ASSISTANCE_SONIFICATION
STREAM_SYSTEM
CONTENT_TYPE_SONIFICATION
USAGE_NOTIFICATION_RINGTONE
STREAM_RING
CONTENT_TYPE_MUSIC
USAGE_UNKNOWN
USAGE_MEDIA
USAGE_GAME
USAGE_ASSISTANCE_ACCESSIBILITY
USAGE_ASSISTANCE_NAVIGATION_GUIDANCE
STREAM_MUSIC
CONTENT_TYPE_SONIFICATION
USAGE_ALARM
STREAM_ALARM
CONTENT_TYPE_SONIFICATION
USAGE_NOTIFICATION
USAGE_NOTIFICATION_COMMUNICATION_REQUEST
USAGE_NOTIFICATION_COMMUNICATION_INSTANT
USAGE_NOTIFICATION_COMMUNICATION_DELAYED
USAGE_NOTIFICATION_EVENT
STREAM_NOTIFICATION
CONTENT_TYPE_SPEECH (@hide) STREAM_BLUETOOTH_SCO
FLAG_AUDIBILITY_ENFORCED (@hide) STREAM_SYSTEM_ENFORCED
CONTENT_TYPE_SONIFICATION
USAGE_VOICE_COMMUNICATION_SIGNALLING
(@hide) STREAM_DTMF

已淘汰的串流類型

Android 9 已淘汰下列車用串流類型:

  • STREAM_DEFAULT
  • STREAM_VOICE_CALL
  • STREAM_SYSTEM
  • STREAM_RING
  • STREAM_MUSIC
  • STREAM_ALARM
  • STREAM_NOTIFICATION
  • STREAM_BLUETOOTH_SCO
  • STREAM_SYSTEM_ENFORCED
  • STREAM_DTMF
  • STREAM_TTS
  • STREAM_ACCESSIBILITY

詳情請參閱Automotive Audio