Các tính năng âm thanh không gian trong Jetpack SceneCore giúp bạn tạo ra trải nghiệm âm thanh sống động trong các ứng dụng Android XR.
Âm thanh không gian mô phỏng cách người dùng cảm nhận âm thanh trong môi trường 3D. Công nghệ này tạo ra cảm giác âm thanh phát ra từ mọi hướng, kể cả phía trên và phía dưới người dùng. Hệ thống thực hiện việc này bằng cách mô phỏng một hoặc nhiều "loa ảo" tại các vị trí cụ thể trong không gian 3D.
Các ứng dụng hiện có chưa được thiết kế hoặc sửa đổi cho Android XR sẽ tự động được tạo không gian lập thể cho âm thanh trong Android XR. Khi người dùng di chuyển xung quanh không gian của họ, tất cả âm thanh của ứng dụng sẽ được phát ra từ bảng điều khiển mà giao diện người dùng của ứng dụng được kết xuất. Ví dụ: nếu đồng hồ hẹn giờ tắt trong ứng dụng đồng hồ, thì âm thanh sẽ phát ra từ vị trí của bảng điều khiển ứng dụng. Android XR sẽ tự động thay đổi âm thanh để tạo cảm giác chân thực về vị trí. Ví dụ: khoảng cách mà người dùng cảm nhận được giữa bảng điều khiển ứng dụng và người dùng sẽ ảnh hưởng một cách tinh tế đến âm lượng để mang lại cảm giác chân thực hơn.
Để biết thêm thông tin về cách các ứng dụng hiện có kết xuất âm thanh không gian, hãy đọc phần Thêm âm thanh nổi và âm thanh vòm vào ứng dụng trên trang này.
Nếu bạn đang tối ưu hoá ứng dụng cho XR, Jetpack SceneCore sẽ cung cấp các công cụ để tuỳ chỉnh âm thanh không gian nâng cao. Bạn có thể định vị chính xác âm thanh trong môi trường 3D, sử dụng âm thanh ambisonic để có trường âm thanh chân thực và tận dụng tính năng tích hợp âm thanh vòm có sẵn.
Các loại âm thanh không gian có trong Android XR
Android XR hỗ trợ âm thanh định vị, âm thanh nổi, âm thanh vòm và âm thanh không gian.
Âm thanh định vị
Bạn có thể đặt âm thanh định vị để phát từ một điểm cụ thể trong không gian 3D. Ví dụ: bạn có thể có một mô hình 3D của một chú chó đang sủa ở góc môi trường ảo. Bạn có thể có nhiều thực thể phát ra âm thanh từ mỗi vị trí tương ứng của chúng. Để kết xuất âm thanh theo vị trí, các tệp phải là đơn âm hoặc âm thanh nổi.
Âm thanh nổi và âm thanh vòm không gian
Tất cả định dạng nội dung nghe nhìn của Android đều được hỗ trợ cho âm thanh nổi, âm thanh vòm và âm thanh theo vị trí. Ngoài các định dạng này, thiết bị Android XR có thể hỗ trợ các định dạng âm thanh Dolby Atmos, Dolby Digital và Dolby Digital+.
Âm thanh nổi là định dạng âm thanh có hai kênh và âm thanh vòm là định dạng âm thanh có nhiều hơn hai kênh, chẳng hạn như cấu hình âm thanh vòm 5.1 hoặc âm thanh vòm 7.1. Dữ liệu âm thanh của mỗi kênh được liên kết với một loa. Ví dụ: khi phát nhạc ở chế độ âm thanh nổi, kênh loa trái có thể phát ra các bản nhạc nhạc cụ khác với kênh loa phải.
Âm thanh vòm thường được dùng trong phim và chương trình truyền hình để tăng độ chân thực và sống động thông qua việc sử dụng nhiều kênh loa. Ví dụ: lời thoại thường phát từ kênh loa trung tâm trong khi âm thanh của máy bay trực thăng đang bay có thể sử dụng các kênh khác nhau theo trình tự để tạo cảm giác rằng máy bay trực thăng đang bay quanh không gian 3D của bạn.
Âm thanh Ambisonic
Âm thanh Ambisonic (hoặc ambisonics) giống như một hộp bầu trời cho âm thanh, mang đến cho người dùng một không gian âm thanh sống động. Sử dụng âm thanh không gian bậc cao cho âm thanh môi trường nền hoặc các tình huống khác mà bạn muốn tái tạo trường âm thanh hình cầu hoàn chỉnh bao quanh người nghe. Android XR hỗ trợ định dạng âm thanh không gian AmbiX ở bậc thứ nhất, thứ hai và thứ ba. Bạn nên dùng loại tệp Opus (.ogg) và PCM/Wave (.wav).
Sử dụng âm thanh không gian với Jetpack SceneCore
Để triển khai âm thanh không gian bằng Jetpack SceneCore, bạn cần kiểm tra các chức năng không gian và chọn một API để tải âm thanh không gian.
Kiểm tra các chức năng không gian
Trước khi sử dụng các tính năng âm thanh không gian, hãy kiểm tra để đảm bảo Session có hỗ trợ âm thanh không gian. Trong tất cả đoạn mã ở các phần sau, các chức năng sẽ được kiểm tra trước khi cố gắng phát âm thanh không gian.
Tải âm thanh không gian
Bạn có thể sử dụng bất kỳ API nào sau đây để tải âm thanh không gian nhằm sử dụng trong Jetpack SceneCore.
SoundPool: Lý tưởng cho các hiệu ứng âm thanh ngắn có kích thước dưới 1 MB, các hiệu ứng này được tải trước và có thể sử dụng nhiều lần. Đây là một cách hay để tải âm thanh cho âm thanh định vị.ExoPlayer: Phù hợp để tải nội dung âm thanh nổi và âm thanh vòm, chẳng hạn như nhạc và video. Cũng cho phép phát nội dung nghe nhìn trong nền.MediaPlayer: Cung cấp cách đơn giản nhất để tải âm thanh ambisonic.AudioTrack: Cung cấp quyền kiểm soát cao nhất đối với cách tải dữ liệu âm thanh. Cho phép ghi trực tiếp vùng đệm âm thanh hoặc nếu bạn đã tổng hợp hoặc giải mã tệp âm thanh của riêng mình.
Kiểm tra khả năng hỗ trợ định dạng nội dung nghe nhìn
Một số định dạng nội dung nghe nhìn được nền tảng Android hỗ trợ. Tuy nhiên, một thiết bị Android XR cụ thể có thể hỗ trợ các định dạng khác, chẳng hạn như Dolby Atmos. Để truy vấn thông tin hỗ trợ định dạng nội dung nghe nhìn, hãy sử dụng AudioCapabilities của ExoPlayer:
val audioCapabilities = AudioCapabilities.getCapabilities( context, androidx.media3.common.AudioAttributes.DEFAULT, null, emptyList() ) if (audioCapabilities.supportsEncoding(C.ENCODING_AC3)) { // Device supports playback of the Dolby Digital media format. } if (audioCapabilities.supportsEncoding(C.ENCODING_E_AC3)) { // Device supports playback of the Dolby Digital Plus media format. } if (audioCapabilities.supportsEncoding(C.ENCODING_E_AC3_JOC)) { // Device supports playback of the Dolby Digital Plus with Dolby Atmos media format. }
Việc kiểm tra các chức năng này có thể liên quan đến các lệnh gọi chặn và không nên được gọi trên luồng chính.
Thêm âm thanh định vị vào ứng dụng
Nguồn âm thanh theo vị trí được xác định bằng PointSourceParams và Entity liên kết. Vị trí và hướng của Entity quyết định vị trí hiển thị của PointSourceParams trong không gian 3D. Gọi setPointSourceParams trên SpatialMediaPlayer để đặt PointSourceParams và entity liên kết của nó trên một thực thể MediaPlayer.
Ví dụ về âm thanh định vị
Ví dụ sau đây tải tệp âm thanh hiệu ứng âm thanh vào nhóm âm thanh và phát lại tệp đó ở vị trí của Entity.
// Check spatial capabilities before using spatial audio if (session.scene.spatialCapabilities.contains(SpatialCapability.SPATIAL_AUDIO) ) { // The session has spatial audio capabilities val maxVolume = 1F val lowPriority = 0 val infiniteLoop = -1 val normalSpeed = 1F val soundPool = SoundPool.Builder() .setAudioAttributes( AudioAttributes.Builder() .setContentType(CONTENT_TYPE_SONIFICATION) .setUsage(USAGE_ASSISTANCE_SONIFICATION) .build() ) .build() val pointSource = PointSourceParams() val soundEffect = appContext.assets.openFd("sounds/tiger_16db.mp3") val pointSoundId = soundPool.load(soundEffect, lowPriority) soundPool.setOnLoadCompleteListener { soundPool, sampleId, status -> // wait for the sound file to be loaded into the soundPool if (status == 0) { SpatialSoundPool.play( session = session, entity = entity, soundPool = soundPool, soundID = pointSoundId, params = pointSource, volume = maxVolume, priority = lowPriority, loop = infiniteLoop, rate = normalSpeed ) } } } else { // The session does not have spatial audio capabilities }
Các điểm chính về mã
- Bước đầu tiên là kiểm tra xem các chức năng Âm thanh không gian có sẵn hay không bằng cách sử dụng
spatialCapabilities. - Việc đặt contentType thành
CONTENT_TYPE_SONIFICATIONvà usage thànhUSAGE_ASSISTANCE_SONIFICATIONcho phép hệ thống coi tệp âm thanh này là hiệu ứng âm thanh. - Ví dụ trước tải tệp âm thanh vào nhóm ngay trước khi sử dụng để giữ mã cùng nhau cho đơn giản. Tốt nhất là bạn nên tải tất cả hiệu ứng âm thanh không đồng bộ khi tải ứng dụng để tất cả tệp âm thanh đều có sẵn trong nhóm khi bạn cần.
Thêm âm thanh nổi và âm thanh vòm vào ứng dụng
Bạn nên thêm âm thanh nổi và âm thanh vòm vào ứng dụng bằng cách sử dụng Exoplayer. Để biết thêm thông tin về cách sử dụng Âm thanh không gian với Exoplayer, hãy tham khảo hướng dẫn về Âm thanh không gian.
Vị trí đặt loa âm thanh nổi và loa âm thanh vòm
Với vị trí loa âm thanh vòm, loa âm thanh vòm ảo được đặt và định hướng tương ứng với loa trung tâm, xung quanh người dùng theo cấu hình ITU tiêu chuẩn.
Theo mặc định, loa kênh trung tâm được đặt trên mainPanelEntity của ứng dụng. Điều này bao gồm cả những ứng dụng di động có âm thanh được Android XR tự động tạo không gian lập thể.
Đối với âm thanh nổi, vị trí đặt loa tương tự như âm thanh vòm, ngoại trừ việc chỉ có kênh trái và phải được đặt tương ứng ở bên trái và bên phải của bảng điều khiển.
Nếu có nhiều bảng điều khiển và bạn muốn chọn bảng điều khiển phát âm thanh hoặc nếu bạn muốn âm thanh nổi hoặc âm thanh vòm kết xuất tương ứng với một Entity khác, bạn có thể sử dụng PointSourceAttributes để xác định vị trí của kênh trung tâm. Các kênh còn lại sẽ được đặt như đã đề cập trước đó. Trong những trường hợp này, bạn cũng phải sử dụng MediaPlayer.
Khi người dùng di chuyển trong không gian của họ, loa ảo âm thanh nổi và âm thanh vòm sẽ di chuyển và điều chỉnh để đảm bảo loa luôn ở vị trí tối ưu.
Nếu bạn đã định cấu hình MediaPlayer hoặc ExoPlayer để tiếp tục phát âm thanh nổi hoặc âm thanh vòm ở chế độ nền, thì vị trí loa ảo sẽ thay đổi khi ứng dụng chạy ở chế độ nền. Vì không có bảng điều khiển hoặc điểm nào khác trong không gian để neo âm thanh, nên âm thanh không gian sẽ di chuyển theo người dùng (nói cách khác, âm thanh này "bị khoá theo đầu").
Ví dụ về âm thanh vòm
Ví dụ sau đây tải một tệp âm thanh 5.1 bằng MediaPlayer và đặt kênh trung tâm của tệp thành Entity.
// Check spatial capabilities before using spatial audio if (session.scene.spatialCapabilities.contains(SpatialCapability.SPATIAL_AUDIO)) { // The session has spatial audio capabilities val pointSourceAttributes = PointSourceParams() val mediaPlayer = MediaPlayer() val fivePointOneAudio = appContext.assets.openFd("sounds/aac_51.ogg") mediaPlayer.reset() mediaPlayer.setDataSource(fivePointOneAudio) val audioAttributes = AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .setUsage(AudioAttributes.USAGE_MEDIA) .build() SpatialMediaPlayer.setPointSourceParams( session, mediaPlayer, pointSourceAttributes, entity = session.scene.mainPanelEntity, ) mediaPlayer.setAudioAttributes(audioAttributes) mediaPlayer.prepare() mediaPlayer.start() } else { // The session does not have spatial audio capabilities }
Các điểm chính về mã
- Giống như trong ví dụ về âm thanh vị trí, bước đầu tiên là kiểm tra xem các chức năng âm thanh không gian có sẵn hay không bằng cách sử dụng
spatialCapabilities. - Việc đặt
contentTypethànhAudioAttributes.CONTENT_TYPE_MUSICvà mức sử dụng thànhAudioAttributes.USAGE_MEDIAcho phép hệ thống coi tệp âm thanh này là âm thanh vòm.
Thêm trường âm thanh ambisonic vào ứng dụng
Cách đơn giản nhất để phát lại trường âm thanh ambisonic là tải tệp bằng MediaPlayer. Vì âm thanh ambisonic áp dụng cho toàn bộ không gian âm thanh, nên bạn không cần chỉ định Entity để cung cấp vị trí. Thay vào đó, bạn tạo một thực thể của SoundFieldAttributes với thứ tự ambisonic thích hợp chỉ định số lượng kênh.
Ví dụ về Ambionics
Ví dụ sau đây phát trường âm thanh ambisonic bằng MediaPlayer.
// Check spatial capabilities before using spatial audio if (session.scene.spatialCapabilities.contains(SpatialCapability.SPATIAL_AUDIO)) { // The session has spatial audio capabilities val soundFieldAttributes = SoundFieldAttributes(SpatializerConstants.AmbisonicsOrder.FIRST_ORDER) val mediaPlayer = MediaPlayer() val soundFieldAudio = appContext.assets.openFd("sounds/foa_basketball_16bit.wav") mediaPlayer.reset() mediaPlayer.setDataSource(soundFieldAudio) val audioAttributes = AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .setUsage(AudioAttributes.USAGE_MEDIA) .build() SpatialMediaPlayer.setSoundFieldAttributes( session, mediaPlayer, soundFieldAttributes ) mediaPlayer.setAudioAttributes(audioAttributes) mediaPlayer.prepare() mediaPlayer.start() } else { // The session does not have spatial audio capabilities }
Các điểm chính về mã
- Giống như các đoạn mã trước, bước đầu tiên là kiểm tra xem các chức năng Âm thanh không gian có sẵn hay không bằng cách sử dụng
spatialCapabilities. contentTypevà mức sử dụng chỉ nhằm mục đích cung cấp thông tin.SpatializerConstants.AmbisonicsOrder.FIRST_ORDERbáo hiệu cho SceneCore rằng tệp trường âm thanh xác định 4 kênh.