ฟีเจอร์เสียงรอบทิศทางใน Jetpack SceneCore ช่วยให้คุณสร้างประสบการณ์เสียงที่สมจริงภายในแอปพลิเคชัน Android XR ได้
เสียงรอบทิศทางจำลองวิธีที่ผู้ใช้รับรู้เสียงในสภาพแวดล้อม 3 มิติ ซึ่งจะสร้าง ความรู้สึกว่าเสียงมาจากทุกทิศทาง รวมถึงด้านบนและด้านล่าง ของผู้ใช้ ระบบจะทำเช่นนี้โดยจำลอง "ลำโพงเสมือน" อย่างน้อย 1 ตัวที่ ตำแหน่งที่เฉพาะเจาะจงในพื้นที่ 3 มิติ
แอปที่มีอยู่ซึ่งไม่ได้ออกแบบหรือแก้ไขสำหรับ Android XR จะมีเสียงที่ปรับให้เป็นเสียงเชิงพื้นที่โดยอัตโนมัติใน Android XR ขณะที่ผู้ใช้เคลื่อนที่ไปรอบๆ พื้นที่ของตน เสียงทั้งหมดของแอปจะออกมาจากแผงที่ UI ของแอปแสดง เช่น หากตัวจับเวลาจากแอปนาฬิกาหมดเวลา เสียง จะดังเหมือนมาจากตำแหน่งแผงแอป Android XR จะ เปลี่ยนเสียงโดยอัตโนมัติเพื่อให้สมจริงตามตำแหน่ง เช่น ระยะทางที่รับรู้ได้ ระหว่างแผงแอปกับผู้ใช้จะส่งผลต่อระดับเสียง เพื่อเพิ่มความสมจริง
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีที่แอปที่มีอยู่แสดงเสียงเชิงพื้นที่ได้ที่เพิ่มเสียงสเตอริโอ และเสียงเซอร์ราวด์ลงในแอปในหน้านี้
หากคุณกำลังเพิ่มประสิทธิภาพแอปสำหรับ XR อยู่ Jetpack SceneCore มีเครื่องมือสำหรับการปรับแต่งเสียงรอบทิศทางขั้นสูง คุณสามารถจัดตำแหน่งเสียงใน สภาพแวดล้อม 3 มิติได้อย่างแม่นยำ ใช้เสียง Ambisonic สำหรับฟิลด์เสียงที่สมจริง และใช้ประโยชน์จากการผสานรวมเสียงเซอร์ราวด์ในตัว
ประเภทเสียงรอบทิศทางที่พร้อมใช้งานใน Android XR
Android XR รองรับเสียงแบบระบุตำแหน่ง สเตอริโอ เซอร์ราวด์ และ Ambisonic
เสียงตามตำแหน่ง
คุณกำหนดตำแหน่งของเสียงตามตำแหน่งให้เล่นจากจุดที่เฉพาะเจาะจงในพื้นที่ 3 มิติได้ เช่น คุณอาจมีโมเดล 3 มิติของสุนัขเห่าที่มุมของสภาพแวดล้อมเสมือน คุณสามารถมีเอนทิตีหลายรายการที่ส่งเสียงจากตำแหน่งของแต่ละรายการได้ หากต้องการแสดงเสียงตามตำแหน่ง ไฟล์ต้องเป็นแบบโมโนหรือ สเตอริโอ
เสียงสเตอริโอและเสียงเซอร์ราวด์เชิงพื้นที่
รูปแบบสื่อ Android ทั้งหมดรองรับเสียงตามตำแหน่ง เสียงสเตอริโอ และเสียง เซอร์ราวด์
เสียงสเตอริโอหมายถึงรูปแบบเสียงที่มี 2 ช่อง และเสียงเซอร์ราวด์หมายถึงรูปแบบเสียงที่มีมากกว่า 2 ช่อง เช่น การกำหนดค่าเสียงเซอร์ราวด์ 5.1 หรือเสียงเซอร์ราวด์ 7.1 ข้อมูลเสียงของแต่ละช่องจะเชื่อมโยงกับลำโพง 1 ตัว เช่น เมื่อเล่นเพลงในระบบสเตอริโอ ช่องลำโพงซ้ายอาจส่งแทร็กเครื่องดนตรีที่แตกต่างจากช่องลำโพงขวา
ระบบเสียงเซอร์ราวด์มักใช้ในภาพยนตร์และรายการทีวีเพื่อเพิ่มความสมจริง และดื่มด่ำไปกับเนื้อหาผ่านการใช้ช่องลำโพงหลายช่อง ตัวอย่างเช่น บทสนทนามักจะเล่นจากช่องลำโพงกลาง ขณะที่เสียง เฮลิคอปเตอร์บินอาจใช้ช่องต่างๆ ตามลำดับเพื่อให้ความรู้สึกว่า เฮลิคอปเตอร์กำลังบินอยู่รอบๆ พื้นที่ 3 มิติ
เสียง Ambisonic
เสียง Ambisonic (หรือ Ambisonics) เปรียบเสมือนกล่องท้องฟ้าสำหรับเสียง
ซึ่งมอบซาวด์สเคปที่สมจริงให้แก่ผู้ใช้ ใช้ Ambisonics สำหรับเสียงรอบข้าง
ในพื้นหลังหรือสถานการณ์อื่นๆ ที่คุณต้องการจำลอง
ฟิลด์เสียงทรงกลมเต็มที่ล้อมรอบผู้ฟัง Android XR รองรับรูปแบบเสียง Ambisonics AmbiX ใน Ambisonics ระดับที่ 1, 2 และ 3
เราขอแนะนำให้ใช้ประเภทไฟล์ Opus (.ogg
) และ
PCM/Wave (.wav
)
ใช้เสียงรอบทิศทางกับ Jetpack SceneCore
การใช้เสียงรอบทิศทางกับ Jetpack SceneCore เกี่ยวข้องกับการตรวจสอบความสามารถด้านเสียงรอบทิศทาง และการเลือก API สำหรับโหลดเสียงรอบทิศทาง
ตรวจสอบความสามารถเชิงพื้นที่
ก่อนใช้ฟีเจอร์เสียงรอบทิศทาง ให้ตรวจสอบว่า Session
รองรับ
เสียงรอบทิศทาง ในข้อมูลโค้ดทั้งหมดในส่วนต่อไปนี้
จะมีการตรวจสอบความสามารถก่อนที่จะพยายามเล่นเสียงเชิงพื้นที่
โหลดเสียงรอบทิศทาง
คุณใช้ API ต่อไปนี้เพื่อโหลดเสียงรอบทิศทางสำหรับใช้ใน Jetpack SceneCore ได้
SoundPool
: เหมาะสำหรับซาวด์เอฟเฟกต์สั้นๆ ที่มีขนาดไม่เกิน 1 MB โดยจะโหลดไว้ล่วงหน้าและใช้เสียงซ้ำได้ ซึ่งเป็นวิธีที่ยอดเยี่ยมในการโหลดเสียงสำหรับเสียงตามตำแหน่งExoPlayer
: เหมาะสำหรับการโหลดเนื้อหาสเตอริโอและเสียงรอบทิศทาง เช่น เพลงและวิดีโอ นอกจากนี้ยังอนุญาตให้เล่นสื่อในเบื้องหลังได้ด้วยMediaPlayer
: เป็นวิธีที่ง่ายที่สุดในการโหลดเสียงอัมบิโซนิคAudioTrack
: ให้การควบคุมวิธีโหลดข้อมูลเสียงมากที่สุด อนุญาตให้เขียนบัฟเฟอร์ของเสียงโดยตรง หรือหากคุณสังเคราะห์หรือ ถอดรหัสไฟล์เสียงของคุณเอง
เพิ่มเสียงตามตำแหน่งลงในแอป
แหล่งกำเนิดเสียงตามตำแหน่งกำหนดโดย PointSourceParams
และ Entity
ที่เกี่ยวข้อง ตำแหน่งและทิศทางของ Entity
จะกำหนด
ตำแหน่งที่ PointSourceParams
แสดงในพื้นที่ 3 มิติ
ตัวอย่างเสียงตามตำแหน่ง
ตัวอย่างต่อไปนี้จะโหลดไฟล์เสียงเอฟเฟกต์เสียงลงในพูลเสียงและ
เล่นซ้ำที่ตำแหน่งของ Entity
// Check spatial capabilities before using spatial audio if (session.scene.spatialCapabilities .hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_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(entity) 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, soundPool = soundPool, soundID = pointSoundId, params = pointSource, volume = maxVolume, priority = lowPriority, loop = infiniteLoop, rate = normalSpeed ) } } } else { // The session does not have spatial audio capabilities }
ประเด็นสำคัญเกี่ยวกับโค้ด
- ขั้นตอนแรกคือการตรวจสอบว่าความสามารถของเสียงรอบทิศทางพร้อมใช้งานอยู่ในขณะนี้หรือไม่โดยใช้
spatialCapabilities
- การตั้งค่า contentType เป็น
CONTENT_TYPE_SONIFICATION
และการใช้งานเป็นUSAGE_ASSISTANCE_SONIFICATION
จะทำให้ระบบถือว่าไฟล์เสียงนี้ เป็นซาวด์เอฟเฟกต์ - ตัวอย่างก่อนหน้าจะโหลดไฟล์เสียงลงในพูลทันทีก่อนที่จะใช้ไฟล์เสียงนั้นเพื่อให้โค้ดอยู่ด้วยกันเพื่อความสะดวก ในอุดมคติ คุณควรโหลด เอฟเฟกต์เสียงทั้งหมดแบบไม่พร้อมกันขณะโหลดแอป เพื่อให้ไฟล์เสียงทั้งหมด พร้อมใช้งานในพูลเมื่อคุณต้องการ
เพิ่มเสียงสเตอริโอและเสียงเซอร์ราวด์ลงในแอป
วิธีที่แนะนำในการเพิ่มเสียงสเตอริโอและเสียงเซอร์ราวด์ลงในแอปคือการใช้
Exoplayer
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีใช้เสียงรอบทิศทางกับ Exoplayer
ได้ที่คู่มือเสียงรอบทิศทาง
การวางตำแหน่งลำโพงสเตอริโอและเสียงเซอร์ราวด์
เมื่อจัดวางลำโพงเสียงเซอร์ราวด์ ลำโพงเสียงเซอร์ราวด์เสมือนจะ จัดวางและกำหนดทิศทางเทียบกับลำโพงกลางรอบๆ ผู้ใช้ในการกำหนดค่า ITU มาตรฐาน
โดยค่าเริ่มต้น ลำโพงช่องกลางจะวางอยู่บนmainPanelEntity
ของแอป ซึ่งรวมถึงแอปบนอุปกรณ์เคลื่อนที่ที่ Android XR จะปรับเสียง
ให้เป็นแบบ 3 มิติโดยอัตโนมัติ
สำหรับสเตอริโอ การจัดวางลำโพงจะคล้ายกับเสียงเซอร์ราวด์ ยกเว้นจะมีเพียง ช่องซ้ายและขวาที่วางไว้ทางด้านซ้ายและขวาของแผง ตามลำดับ
หากมีหลายแผงและต้องการเลือกแผงที่ส่งเสียง หรือ
หากต้องการให้เสียงสเตอริโอหรือเสียงเซอร์ราวด์แสดงผลเทียบกับEntity
อื่น
คุณสามารถใช้ PointSourceAttributes
เพื่อกำหนดตำแหน่งของช่อง
สัญญาณกลางได้ ส่วนช่องที่เหลือจะอยู่ในตำแหน่งตามที่กล่าวไว้ก่อนหน้านี้ ในกรณีเหล่านี้ คุณต้องใช้ MediaPlayer
ด้วย
เมื่อผู้ใช้เคลื่อนที่ไปรอบๆ พื้นที่ ลำโพงเสมือนแบบสเตอริโอและเซอร์ราวด์ จะเคลื่อนที่และปรับเพื่อให้ลำโพงอยู่ในตำแหน่งที่ เหมาะสมที่สุดเสมอ
หากคุณกำหนดค่า MediaPlayer
หรือ ExoPlayer
ให้เล่นเสียงสเตอริโอหรือเสียงเซอร์ราวด์จากเบื้องหลังต่อไป
การวางตำแหน่งลำโพงเสมือนจะเปลี่ยนไปเมื่อแอปทำงานในเบื้องหลัง เนื่องจากไม่มีแผงหรือจุดอื่นในพื้นที่เพื่อยึดเสียงไว้ เสียงเชิงพื้นที่จึงเคลื่อนที่ไปพร้อมกับผู้ใช้ (กล่าวคือ "ล็อกไว้กับศีรษะ")
ตัวอย่างเสียงเซอร์ราวด์
ตัวอย่างต่อไปนี้โหลดไฟล์เสียง 5.1 โดยใช้ MediaPlayer
และตั้งค่า
ช่องกลางของไฟล์ให้เป็น Entity
// Check spatial capabilities before using spatial audio if (session.scene.spatialCapabilities.hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_SPATIAL_AUDIO)) { // The session has spatial audio capabilities val pointSourceAttributes = PointSourceParams(session.scene.mainPanelEntity) 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 ) mediaPlayer.setAudioAttributes(audioAttributes) mediaPlayer.prepare() mediaPlayer.start() } else { // The session does not have spatial audio capabilities }
ประเด็นสำคัญเกี่ยวกับโค้ด
- เช่นเดียวกับในตัวอย่างเสียงตามตำแหน่ง ขั้นตอนแรกคือการตรวจสอบว่าความสามารถของ
เสียงรอบทิศทางพร้อมใช้งานหรือไม่โดยใช้
spatialCapabilities
- การตั้งค่า
contentType
เป็นAudioAttributes.CONTENT_TYPE_MUSIC
และการใช้งาน เป็นAudioAttributes.USAGE_MEDIA
จะทำให้ระบบ ถือว่าไฟล์เสียงนี้เป็นเสียงเซอร์ราวด์
เพิ่มฟิลด์เสียง Ambisonic ลงในแอป
วิธีที่ง่ายที่สุดในการเล่นฟิลด์เสียงแบบอัมบิโซนิคคือการโหลดไฟล์ด้วย
MediaPlayer
เนื่องจากเสียงรอบทิศทางมีผลกับซาวด์สเคปทั้งหมด คุณจึงไม่จำเป็นต้องระบุ Entity
เพื่อระบุตำแหน่ง แต่คุณจะสร้างอินสแตนซ์ของ SoundFieldAttributes
ที่มีลำดับแอมบิโซนิกระดับที่เหมาะสมซึ่งระบุจำนวนช่องแทน
ตัวอย่าง Ambionics
ตัวอย่างต่อไปนี้จะเล่นฟิลด์เสียงแบบอัมบิโซนิคโดยใช้ MediaPlayer
// Check spatial capabilities before using spatial audio if (session.scene.spatialCapabilities.hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_SPATIAL_AUDIO)) { // The session has spatial audio capabilities val soundFieldAttributes = SoundFieldAttributes(SpatializerConstants.AMBISONICS_ORDER_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 }
ประเด็นสำคัญเกี่ยวกับโค้ด
- เช่นเดียวกับข้อมูลโค้ดก่อนหน้า ขั้นตอนแรกคือการตรวจสอบว่าความสามารถของเสียงรอบทิศทาง
พร้อมใช้งานหรือไม่โดยใช้
hasCapability()
contentType
และการใช้งานเป็นเพียงข้อมูลเท่านั้นAMBISONICS_ORDER_FIRST_ORDER
จะส่งสัญญาณไปยัง SceneCore ว่าไฟล์ฟิลด์เสียง กำหนด 4 แชแนล