Tính năng Âm thanh không gian là trải nghiệm âm thanh sống động, mang đến cho người dùng tâm điểm của hành động, giúp nội dung nghe chân thực hơn. Âm thanh "không gian hoá" để tạo hiệu ứng nhiều loa, tương tự như âm thanh vòm thiết lập, mà hãy chuyển sang qua tai nghe.
Ví dụ: trong một bộ phim, âm thanh từ ô tô có thể bắt đầu phát ra từ phía sau người dùng, di chuyển tiến và lùi về phía xa. Trong một cuộc trò chuyện video, giọng nói có thể là được tách riêng và đặt xung quanh người dùng, giúp xác định loa dễ dàng hơn.
Nếu nội dung sử dụng định dạng âm thanh được hỗ trợ, bạn có thể thêm âm thanh không gian vào ứng dụng bắt đầu bằng Android 13 (API cấp 33).
Truy vấn quyền truy cập
Sử dụng lớp Spatializer
để
truy vấn khả năng và hành vi về không gian của thiết bị. Bắt đầu bằng cách truy xuất
một thực thể của Spatializer
từ
AudioManager
:
Kotlin
val spatializer = audioManager.spatializer
Java
Spatializer spatializer = AudioManager.getSpatializer();
Sau khi bạn nhận được Spatializer
, hãy kiểm tra 4 điều kiện phải duy trì
true cho thiết bị để xuất âm thanh không gian:
Tiêu chí | Kiểm tra |
---|---|
Thiết bị có hỗ trợ tính năng không gian không? |
getImmersiveAudioLevel() không phải là SPATIALIZER_IMMERSIVE_LEVEL_NONE
|
Có thể sử dụng tính năng không gian không? Khả năng sử dụng phụ thuộc vào khả năng tương thích với định tuyến đầu ra âm thanh hiện tại. |
isAvailable() là true |
Tính năng tạo không gian có được bật không? | isEnabled() là true |
Có thể tạo không gian cho bản âm thanh có các thông số nhất định không? | canBeSpatialized() là true |
Những điều kiện này có thể không được đáp ứng, chẳng hạn như trong trường hợp không có tính năng tạo không gian cho bản âm thanh hiện tại hoặc tắt hoàn toàn trên thiết bị đầu ra âm thanh.
Theo dõi chuyển động của đầu
Với những tai nghe được hỗ trợ, nền tảng có thể điều chỉnh
tạo không gian dựa trên vị trí đầu của người dùng. Để kiểm tra xem thiết bị theo dõi chuyển động của đầu có phải là
có sẵn cho việc định tuyến đầu ra âm thanh hiện tại, hãy gọi
isHeadTrackerAvailable()
.
Nội dung tương thích
Spatializer.canBeSpatialized()
cho biết liệu âm thanh có các thuộc tính nhất định có thể tạo không gian bằng
định tuyến thiết bị đầu ra hiện tại. Phương thức này sử dụng một AudioAttributes
và AudioFormat
, cả hai đều
được mô tả chi tiết hơn bên dưới.
AudioAttributes
Đối tượng AudioAttributes
mô tả cách sử dụng của một
luồng âm thanh (ví dụ: âm thanh trò chơi
hoặc nội dung nghe nhìn chuẩn),
cùng với hành vi phát và loại nội dung.
Khi gọi canBeSpatialized()
, hãy sử dụng cùng một
Thực thể AudioAttributes
đã được thiết lập cho Player
của bạn. Ví dụ: nếu
bạn đang sử dụng thư viện Jetpack Media3 và chưa tuỳ chỉnh
AudioAttributes
, sử dụng AudioAttributes.DEFAULT
.
Tắt âm thanh không gian
Để cho biết rằng nội dung của bạn đã được tạo không gian, hãy gọi
setIsContentSpatialized(true)
để âm thanh không được xử lý hai lần. Ngoài ra, hãy điều chỉnh
để vô hiệu hoá hoàn toàn tính năng không gian bằng cách gọi
setSpatializationBehavior(AudioAttributes.SPATIALIZATION_BEHAVIOR_NEVER)
.
AudioFormat
Đối tượng AudioFormat
mô tả
thông tin chi tiết về định dạng và cấu hình kênh của bản âm thanh.
Khi tạo thực thể cho AudioFormat
để truyền vào canBeSpatialized()
,
đặt phương thức mã hoá
giống với định dạng đầu ra dự kiến từ bộ giải mã. Bạn cũng nên đặt
mặt nạ kênh
khớp với cấu hình kênh của nội dung. Tham khảo
Phần Hành vi tạo không gian mặc định để hướng dẫn về
các giá trị cụ thể để sử dụng.
Nghe những thay đổi đối với Spatializer
Để theo dõi các thay đổi về trạng thái của Spatializer
, bạn có thể thêm một trình nghe
cùng với Spatializer.addOnSpatializerStateChangedListener()
.
Tương tự, để theo dõi những thay đổi về khả năng sử dụng công cụ theo dõi chuyển động của đầu,
gọi Spatializer.addOnHeadTrackerAvailableListener()
.
Điều này có thể hữu ích nếu bạn muốn điều chỉnh lựa chọn bản nhạc trong khi phát
bằng cách dùng lệnh gọi lại của trình nghe. Ví dụ: khi người dùng kết nối hoặc ngắt kết nối
tai nghe của thiết bị, onSpatializerAvailableChanged
lệnh gọi lại cho biết liệu có hiệu ứng tạo không gian cho phiên bản mới
định tuyến đầu ra âm thanh. Tại thời điểm này, bạn có thể cân nhắc việc cập nhật
theo dõi logic lựa chọn để phù hợp với khả năng mới của thiết bị. Để biết thông tin chi tiết về
Hành vi chọn bản nhạc của ExoPlayer, tham khảo ExoPlayer và âm thanh không gian
.
ExoPlayer và âm thanh không gian
Các bản phát hành gần đây của ExoPlayer giúp bạn dễ dàng sử dụng âm thanh không gian hơn. Nếu bạn sử dụng
thư viện ExoPlayer độc lập (tên gói com.google.android.exoplayer2
),
phiên bản 2.17 định cấu hình nền tảng để xuất âm thanh không gian và phiên bản
Phiên bản 2.18 đưa ra các hạn chế về số lượng kênh âm thanh.
Nếu bạn sử dụng mô-đun ExoPlayer từ thư viện Media3, (tên gói)
androidx.media3
), phiên bản 1.0.0-beta01
và phiên bản mới hơn có những nội dung cập nhật tương tự.
Sau khi cập nhật phần phụ thuộc ExoPlayer lên bản phát hành mới nhất, ứng dụng của bạn cần bao gồm nội dung có thể tạo không gian.
Các quy tắc ràng buộc về số lượng kênh âm thanh
Khi đáp ứng cả bốn điều kiện cho âm thanh không gian, ExoPlayer sẽ chọn
bản âm thanh đa kênh. Nếu không, ExoPlayer sẽ chọn một bản âm thanh nổi.
Nếu thuộc tính Spatializer
thay đổi, ExoPlayer
sẽ kích hoạt lựa chọn bản nhạc mới để chọn bản âm thanh khớp với
các thuộc tính hiện tại. Xin lưu ý rằng lựa chọn bản nhạc mới này có thể gây ra
khoảng thời gian đệm lại.
Để tắt các giới hạn về số lượng kênh âm thanh, hãy đặt thông số chọn bản nhạc trên trình phát như minh hoạ dưới đây:
Kotlin
exoPlayer.trackSelectionParameters = DefaultTrackSelector.Parameters.Builder(context) .setConstrainAudioChannelCountToDeviceCapabilities(false) .build()
Java
exoPlayer.setTrackSelectionParameters( new DefaultTrackSelector.Parameters.Builder(context) .setConstrainAudioChannelCountToDeviceCapabilities(false) .build() );
Tương tự, bạn có thể cập nhật các thông số của bộ chọn bản nhạc hiện có để tắt các quy tắc ràng buộc về số lượng kênh âm thanh như sau:
Kotlin
val trackSelector = DefaultTrackSelector(context) ... trackSelector.parameters = trackSelector.buildUponParameters() .setConstrainAudioChannelCountToDeviceCapabilities(false) .build()
Java
DefaultTrackSelector trackSelector = new DefaultTrackSelector(context); ... trackSelector.setParameters( trackSelector .buildUponParameters() .setConstrainAudioChannelCountToDeviceCapabilities(false) .build() );
Khi giới hạn số lượng kênh âm thanh bị tắt, nếu nội dung có nhiều âm thanh thì ban đầu, ExoPlayer chọn bản nhạc có nhiều kênh nhất và có thể phát từ thiết bị này. Ví dụ: nếu nội dung chứa bản âm thanh đa kênh và bản âm thanh nổi, thiết bị hỗ trợ khi phát cả hai bản nhạc, ExoPlayer sẽ chọn bản nhạc đa kênh. Xem Lựa chọn bản âm thanh để biết thông tin chi tiết về cách tuỳ chỉnh hoạt động này.
Lựa chọn bản âm thanh
Khi các hạn chế về số lượng kênh âm thanh của ExoPlayer hành vi bị tắt, ExoPlayer không tự động chọn bản âm thanh khớp với thuộc tính của bộ tạo âm thanh không gian trên thiết bị. Thay vào đó, bạn có thể tuỳ chỉnh logic lựa chọn bản nhạc của ExoPlayer bằng cách đặt lựa chọn bản nhạc các tham số trước hoặc trong khi phát. Theo mặc định, ExoPlayer sẽ chọn âm thanh các bản nhạc giống với bản nhạc ban đầu có liên quan đến loại MIME (mã hoá), số lượng kênh và tốc độ lấy mẫu.
Thay đổi thông số lựa chọn bản nhạc
Để thay đổi tham số lựa chọn bản nhạc của ExoPlayer, hãy sử dụng
Player.setTrackSelectionParameters()
.
Tương tự, bạn có thể nhận được các tham số hiện tại của ExoPlayer bằng
Player.getTrackSelectionParameters()
.
Ví dụ: để chọn một bản âm thanh nổi khi đang phát:
Kotlin
exoPlayer.trackSelectionParameters = exoPlayer.trackSelectionParameters .buildUpon() .setMaxAudioChannelCount(2) .build()
Java
exoPlayer.setTrackSelectionParameters( exoPlayer.getTrackSelectionParameters() .buildUpon() .setMaxAudioChannelCount(2) .build() );
Xin lưu ý rằng việc thay đổi thông số lựa chọn bản nhạc trong quá trình phát có thể gây ra lỗi bị gián đoạn trong quá trình phát. Thông tin khác về cách chỉnh bản nhạc của người chơi các thông số lựa chọn có sẵn trong lựa chọn bản nhạc trong phần tài liệu về ExoPlayer.
Hành vi sử dụng không gian mặc định
Hành vi mặc định về không gian trong Android bao gồm các hành vi sau có thể được tuỳ chỉnh bởi OEM:
Chỉ nội dung đa kênh mới được hoá không gian chứ không phải nội dung âm thanh nổi. Nếu bạn không sử dụng ExoPlayer, tuỳ thuộc vào định dạng của kênh đa kênh nội dung âm thanh, bạn có thể cần định cấu hình số kênh tối đa có thể được bộ giải mã âm thanh xuất ra một số lượng lớn. Điều này giúp đảm bảo rằng bộ giải mã âm thanh sẽ xuất ra PCM đa kênh để nền tảng tạo không gian.
Kotlin
val mediaFormat = MediaFormat() mediaFormat.setInteger(MediaFormat.KEY_MAX_OUTPUT_CHANNEL_COUNT, 99)
Java
MediaFormat mediaFormat = new MediaFormat(); mediaFormat.setInteger(MediaFormat.KEY_MAX_OUTPUT_CHANNEL_COUNT, 99);
Để xem ví dụ thực tế, hãy xem
MediaCodecAudioRenderer.java
của ExoPlayer. Để tự tắt tính năng không gian, bất kể OEM (Nhà sản xuất thiết bị gốc) tùy chỉnh, xem phần Tắt âm thanh không gian.AudioAttributes
: Âm thanh đủ điều kiện để dùng tính năng không gian nếuusage
được đặt thànhUSAGE_MEDIA
hoặcUSAGE_GAME
.AudioFormat
: Sử dụng mặt nạ kênh có chứa ít nhấtAudioFormat.CHANNEL_OUT_QUAD
kênh (trước-trái, trước-phải, sau-trái và sau-phải) dành cho âm thanh đủ điều kiện để sử dụng các tính năng không gian. Trong ví dụ bên dưới, chúng tôi sẽ sử dụngAudioFormat.CHANNEL_OUT_5POINT1
cho bản âm thanh 5.1. Đối với bản âm thanh nổi, hãy sử dụngAudioFormat.CHANNEL_OUT_STEREO
.Nếu đang dùng Media3, bạn có thể dùng
Util.getAudioTrackChannelConfig(int channelCount)
để chuyển đổi số lượng kênh thành mặt nạ kênh.Ngoài ra, hãy đặt bộ mã hoá thành
AudioFormat.ENCODING_PCM_16BIT
nếu bạn đã định cấu hình bộ giải mã để xuất PCM đa kênh.Kotlin
val audioFormat = AudioFormat.Builder() .setEncoding(AudioFormat.ENCODING_PCM_16BIT) .setChannelMask(AudioFormat.CHANNEL_OUT_5POINT1) .build()
Java
AudioFormat audioFormat = new AudioFormat.Builder() .setEncoding(AudioFormat.ENCODING_PCM_16BIT) .setChannelMask(AudioFormat.CHANNEL_OUT_5POINT1) .build();
Kiểm tra âm thanh không gian
Đảm bảo rằng bạn đã bật tính năng âm thanh không gian trên thiết bị thử nghiệm:
- Đối với tai nghe có dây, hãy chuyển đến phần Cài đặt hệ thống > Âm thanh và rung > Không gian âm thanh.
- Đối với tai nghe không dây, hãy chuyển đến phần Cài đặt hệ thống > Thiết bị đã kết nối > Biểu tượng bánh răng cho thiết bị không dây của bạn > Âm thanh không gian.
Để kiểm tra tính sẵn có của Âm thanh không gian cho định tuyến hiện tại, hãy chạy
Lệnh adb shell dumpsys audio
trên thiết bị. Bạn sẽ thấy như sau
các tham số ở đầu ra trong khi chế độ phát đang hoạt động:
Spatial audio:
mHasSpatializerEffect:true (effect present)
isSpatializerEnabled:true (routing dependent)