音頻播放器支持定義音頻系統如何處理指定源的路由、音量和焦點決策的屬性。應用程序可以將屬性附加到音頻播放(例如流媒體服務播放的音樂或新電子郵件的通知),然後將音頻源屬性傳遞給框架,音頻系統使用這些屬性來做出混合決策並通知應用程序關於系統的狀態。
在 Android 4.4 及更早版本中,框架僅使用音頻流類型做出混合決策。但是,基於流類型的此類決策過於局限,無法跨多個應用程序和設備產生高質量的輸出。例如,在移動設備上,某些應用程序(即 Google 地圖)在 STREAM_MUSIC 流類型上播放行車路線;但是,在投影模式的移動設備(即 Android Auto)上,應用程序無法將行車路線與其他媒體流混合。
使用Audio Attribute API ,應用程序向音頻系統提供有關特定音頻源的詳細信息,包括用法(播放源的原因)、內容類型(播放源的內容)、標誌(播放源的方式)、和上下文(Android 9 中的新功能)。句法:
AudioAttributes { mUsage mContentType mSource mFlags mTags / mFormattedTags / mBundle (key value pairs) }
- 用法。指定源播放的原因並控制路由、焦點和音量決策。
- 內容類型。指定源正在播放的內容(音樂、電影、語音、聲化、未知)。
- 上下文。抽象為音頻 HAL 的使用值。
- 標誌。指定應如何播放源。包括對可聽性強制(某些國家/地區需要相機快門聲音)和硬件音頻/視頻同步的支持。
對於動態處理,應用程序必須區分電影、音樂和語音內容。有關數據本身的信息也可能很重要,例如響度和峰值樣本值。
使用屬性
用法指定使用流的上下文,提供有關播放聲音的原因和聲音用途的信息。使用信息比流類型更具表現力,並允許平台或路由策略細化流量或路由決策。
為任何實例提供以下使用值之一:
- USAGE_UNKNOWN
- USAGE_媒體
- 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_MEDIA
和USAGE_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 級別被抽象為Contexts 。
HAL 音頻上下文 | AudioAttributes 用法 |
---|---|
音樂 | 媒體 |
語音控制 | USAGE_ASSISTANT |
導航 | ASSISTANCE_NAVIGATION_GUIDANCE |
稱呼 | VOICE_COMMUNICATION |
鈴聲 | NOTIFICATION_RINGTONE |
通知 | 通知 |
警報 | 警報 |
系統聲音 | 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
定義了新AudioAttributes
實例要使用的AudioTrack
:
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 及更高版本 | 安卓 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
有關詳細信息,請參閱汽車音響。