صدای مکانی را به برنامه XR خود اضافه کنید، صدای مکانی را به برنامه XR خود اضافه کنید

ویژگی‌های صوتی فضایی در Jetpack SceneCore به شما این امکان را می‌دهد تا تجربه‌های صوتی فراگیر را در برنامه‌های Android XR خود ایجاد کنید.

صدای فضایی نحوه درک کاربران از صدا در یک محیط سه بعدی را شبیه سازی می کند. این حس صدایی را ایجاد می کند که از همه جهات، از جمله بالا و پایین کاربر منتشر می شود. این سیستم با شبیه سازی یک یا چند "بلندگوی مجازی" در مکان های خاص در فضای سه بعدی این کار را انجام می دهد.

برنامه‌های موجود که برای Android XR طراحی یا اصلاح نشده‌اند، صدای آن‌ها به‌طور خودکار در Android XR فضایی می‌شوند. همانطور که کاربر در فضای خود حرکت می کند، تمام صدای برنامه از پانلی که رابط کاربری برنامه روی آن نمایش داده می شود، منتشر می شود. به عنوان مثال، اگر یک تایمر از یک برنامه ساعت خاموش شود، صدا به نظر می رسد که از موقعیت پانل برنامه می آید. Android XR به طور خودکار صدا را برای واقع گرایی موقعیتی تغییر می دهد. به عنوان مثال، فاصله درک شده بین پنل برنامه و کاربر به طور نامحسوسی بر حجم صدا تأثیر می گذارد تا حس واقعی گرایی بیشتری داشته باشد.

برای اطلاعات بیشتر در مورد نحوه ارائه صدای فضایی برنامه های موجود، افزودن صدای استریو و فراگیر به برنامه خود را در این صفحه بخوانید.

اگر برنامه خود را برای XR بهینه می‌کنید، Jetpack SceneCore ابزارهایی را برای سفارشی‌سازی صدای فضایی پیشرفته ارائه می‌دهد. می‌توانید صداها را در محیط سه‌بعدی به‌طور دقیق قرار دهید، از صدای آمبیسونیک برای میدان‌های صوتی واقعی استفاده کنید و از یکپارچه‌سازی صدای فراگیر داخلی بهره ببرید.

انواع صدای فضایی موجود در اندروید XR

اندروید XR از صدای موقعیتی، استریو، فراگیر و صدای آمبیسونیک پشتیبانی می کند.

صدای موضعی

صدای موقعیتی را می توان برای پخش از یک نقطه خاص در فضای سه بعدی قرار داد. برای مثال می توانید یک مدل سه بعدی از پارس سگ در گوشه محیط مجازی خود داشته باشید. شما می توانید چندین موجودیت داشته باشید که از هر یک از موقعیت های مربوطه صدا منتشر می کنند. برای ارائه صدای موقعیتی، فایل ها باید مونو یا استریو باشند.

صدای استریو و فراگیر فضایی

همه فرمت‌های رسانه اندروید برای صدای موقعیتی، استریو و فراگیر پشتیبانی می‌شوند.

صدای استریو به فرمت های صوتی با دو کانال و صدای فراگیر به فرمت های صوتی با بیش از دو کانال، مانند صدای فراگیر 5.1 یا تنظیمات صدای فراگیر 7.1 اشاره دارد. داده های صوتی هر کانال با یک بلندگو مرتبط است. به عنوان مثال، هنگام پخش موسیقی به صورت استریو، کانال بلندگوی چپ ممکن است آهنگ های ساز متفاوتی نسبت به سمت راست منتشر کند.

صدای فراگیر اغلب در فیلم ها و نمایش های تلویزیونی برای تقویت واقع گرایی و غوطه وری از طریق استفاده از چندین کانال بلندگو استفاده می شود. به عنوان مثال، دیالوگ اغلب از یک کانال بلندگوی مرکزی پخش می‌شود، در حالی که صدای پرواز هلیکوپتر ممکن است از کانال‌های مختلفی به‌طور متوالی استفاده کند تا این حس را القا کند که هلیکوپتر در حال پرواز در فضای سه‌بعدی شماست.

صدای آمبیسونیک

صدای Ambisonic (یا ambisonics) مانند یک skybox برای صدا است که یک منظره صوتی فراگیر را برای کاربران شما فراهم می کند. از ambisonics برای صداهای محیطی پس‌زمینه یا سناریوهای دیگری که می‌خواهید یک میدان صوتی کامل کروی را که شنونده را احاطه کرده است، تکرار کنید. Android XR از فرمت صوتی AmbiX ambisonic در آمبیسونیک های درجه اول، دوم و سوم پشتیبانی می کند. ما انواع فایل Opus ( .ogg ) و PCM/Wave ( .wav ) را توصیه می کنیم.

از صدای فضایی با Jetpack SceneCore استفاده کنید

پیاده‌سازی صدای فضایی با Jetpack SceneCore شامل بررسی قابلیت‌های فضایی و انتخاب یک API برای بارگیری صدای مکانی است.

قابلیت های فضایی را بررسی کنید

قبل از استفاده از ویژگی‌های صوتی فضایی، بررسی کنید که Session از صدای مکانی پشتیبانی می‌کند. در تمام قطعات کد در بخش‌های زیر، قبل از اقدام برای پخش صدای فضایی، قابلیت‌ها بررسی می‌شوند.

بارگیری صوتی فضایی

می توانید از هر یک از API های زیر برای بارگیری صدای فضایی برای استفاده در Jetpack SceneCore استفاده کنید.

  • SoundPool : ایده آل برای جلوه های صوتی کوتاه با حجم کمتر از 1 مگابایت، آنها زودتر از موعد بارگذاری می شوند و می توان از صداها به طور مکرر استفاده کرد. این یک راه عالی برای بارگیری صدا برای صدای موقعیتی است.
  • ExoPlayer : ایده آل برای بارگیری محتوای استریو و صدای فراگیر مانند موسیقی و ویدیو. همچنین امکان پخش رسانه در پس زمینه را فراهم می کند.
  • MediaPlayer : ساده ترین راه را برای بارگیری صدای آمبیسونیک ارائه می دهد.
  • AudioTrack : بیشترین کنترل را بر نحوه بارگیری داده های صوتی ارائه می دهد. اجازه می دهد تا به طور مستقیم بافرهای صوتی بنویسید یا اگر فایل های صوتی خود را سنتز یا رمزگشایی کرده اید.

صدای موقعیتی را به برنامه خود اضافه کنید

منابع صوتی موقعیتی توسط PointSourceAttributes و یک Entity مرتبط تعریف می شوند. موقعیت و جهت Entity تعیین می کند که PointSourceAttribute کجا در فضای سه بعدی ارائه شود.

نمونه صوتی موقعیتی

مثال زیر یک فایل صوتی جلوه صوتی را در یک مخزن صدا بارگیری می کند و آن را در موقعیت Entity پخش می کند.

// Check spatial capabilities before using spatial audio
if (xrSession.getSpatialCapabilities().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 = PointSourceAttributes(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 = xrSession,
                soundPool = soundPool,
                soundID = pointSoundId,
                attributes = pointSource,
                volume = maxVolume,
                priority = lowPriority,
                loop = infiniteLoop,
                rate = normalSpeed
            )
        }
    }
} else {
    // The session does not have spatial audio capabilities
}

نکات کلیدی در مورد کد

  • اولین قدم این است که با استفاده از getSpatialCapabilities() بررسی کنید که آیا قابلیت‌های صوتی فضایی در حال حاضر در دسترس هستند یا خیر.
  • تنظیم ContentType روی CONTENT_TYPE_SONIFICATION و استفاده روی USAGE_ASSISTANCE_SONIFICATION به سیستم این امکان را می دهد که این فایل صوتی را به عنوان یک جلوه صوتی در نظر بگیرد.
  • مثال قبل فایل صوتی را بلافاصله قبل از استفاده در استخر بارگذاری می کند تا کد را برای سادگی در کنار هم نگه دارد. در حالت ایده‌آل، هنگام بارگذاری برنامه، باید تمام جلوه‌های صوتی خود را به صورت ناهمزمان بارگیری کنید تا در صورت نیاز، تمام فایل‌های صوتی در استخر در دسترس باشند.

صدای استریو و فراگیر را به برنامه خود اضافه کنید

روش پیشنهادی برای افزودن صدای استریو و فراگیر به برنامه خود استفاده از Exoplayer است. برای اطلاعات بیشتر در مورد نحوه استفاده از Spatial Audio با Exoplayer , به راهنمای Spatial Audio مراجعه کنید .

موقعیت بلندگوی صدای استریو و فراگیر

با موقعیت‌یابی بلندگوی صدای فراگیر، بلندگوهای صدای فراگیر مجازی نسبت به بلندگوی مرکزی، در یک پیکربندی استاندارد ITU در اطراف کاربر قرار گرفته و جهت‌گیری می‌شوند.

به طور پیش فرض، بلندگوی کانال مرکزی روی mainPanelEntity برنامه قرار می گیرد. این شامل برنامه‌های تلفن همراهی می‌شود که صدای آن‌ها به‌طور خودکار توسط Android XR فضاسازی می‌شود.

برای استریو، قرارگیری بلندگو شبیه صدای فراگیر است، به جز اینکه تنها کانال های چپ و راست به ترتیب در سمت چپ و راست پانل قرار دارند.

اگر چندین پنل دارید و می‌خواهید انتخاب کنید کدام پانل صدا منتشر می‌کند، یا اگر می‌خواهید صدای استریو یا فراگیر نسبت به Entity دیگری ارائه شود، می‌توانید از PointSourceAttributes برای تعریف مکان کانال مرکزی استفاده کنید. کانال های باقیمانده همانطور که قبلا ذکر شد قرار خواهند گرفت. در این مواقع، باید از MediaPlayer نیز استفاده کنید.

همانطور که کاربر در فضای خود حرکت می کند، بلندگوهای مجازی صدای استریو و فراگیر حرکت کرده و تنظیم می شوند تا اطمینان حاصل شود که بلندگوها همیشه در موقعیت بهینه قرار دارند.

اگر MediaPlayer یا ExoPlayer برای ادامه پخش صدای استریو یا فراگیر از پس‌زمینه پیکربندی کرده‌اید، وقتی برنامه در پس‌زمینه قرار می‌گیرد، موقعیت بلندگوی مجازی تغییر می‌کند. از آنجایی که هیچ پانل یا نقطه دیگری در فضا وجود ندارد که صدا را به آن متصل کند، صدای فضایی با کاربر حرکت می کند (به عبارت دیگر، "سر قفل" است).

نمونه صدای فراگیر

مثال زیر یک فایل صوتی 5.1 را با استفاده از MediaPlayer بارگیری می کند و کانال مرکزی فایل را به عنوان Entity تنظیم می کند.

// Check spatial capabilities before using spatial audio
if (xrSession.getSpatialCapabilities().hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_SPATIAL_AUDIO)) {
    // The session has spatial audio capabilities

    val pointSourceAttributes = PointSourceAttributes(xrSession.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.setPointSourceAttributes(
        xrSession,
        mediaPlayer,
        pointSourceAttributes)

    mediaPlayer.setAudioAttributes(audioAttributes)
    mediaPlayer.prepare()
    mediaPlayer.start()

} else {
    // The session does not have spatial audio capabilities
}

نکات کلیدی در مورد کد

  • مانند مثال صوتی موقعیتی ، اولین قدم این است که با استفاده از getSpatialCapabilities() بررسی کنید که آیا قابلیت های صوتی apatial در حال حاضر در دسترس هستند یا خیر.
  • تنظیم contentType روی CONTENT_TYPE_MUSIC و استفاده روی USAGE_MEDIA به سیستم امکان می‌دهد این فایل صوتی را به عنوان صدای فراگیر در نظر بگیرد.

فیلدهای صوتی ambisonic را به برنامه خود اضافه کنید

ساده ترین راه برای پخش فیلدهای صوتی ambisonic، بارگیری فایل با MediaPlayer است. از آنجایی که صدای آمبیسونیک برای کل منظره صدا اعمال می شود، برای ارائه موقعیت، نیازی به تعیین Entity ندارید. در عوض، شما یک نمونه از SoundFieldAttributes با ترتیب ambisonic مناسب که تعداد کانال ها را مشخص می کند ایجاد می کنید.

نمونه آمبیونیک

مثال زیر یک میدان صوتی ambisonic را با استفاده از MediaPlayer پخش می کند.

// Check spatial capabilities before using spatial audio
if (xrSession.getSpatialCapabilities().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(
        xrSession,
        mediaPlayer,
        soundFieldAttributes)

    mediaPlayer.setAudioAttributes(audioAttributes)
    mediaPlayer.prepare()
    mediaPlayer.start()

} else {
    // The session does not have spatial audio capabilities
}

نکات کلیدی در مورد کد

  • همانند قطعه‌های قبلی، اولین قدم این است که با استفاده از getSpatialCapabilities() بررسی کنید که آیا قابلیت‌های صوتی فضایی در حال حاضر در دسترس هستند یا خیر.
  • نوع محتوا و استفاده صرفاً اطلاعاتی است.
  • AMBISONICS_ORDER_FIRST_ORDER به SceneCore سیگنال می دهد که فایل فیلد صدا چهار کانال را تعریف می کند.
،

ویژگی‌های صوتی فضایی در Jetpack SceneCore به شما این امکان را می‌دهد تا تجربه‌های صوتی فراگیر را در برنامه‌های Android XR خود ایجاد کنید.

صدای فضایی نحوه درک کاربران از صدا در یک محیط سه بعدی را شبیه سازی می کند. این حس صدایی را ایجاد می کند که از همه جهات، از جمله بالا و پایین کاربر منتشر می شود. این سیستم با شبیه سازی یک یا چند "بلندگوی مجازی" در مکان های خاص در فضای سه بعدی این کار را انجام می دهد.

برنامه‌های موجود که برای Android XR طراحی یا اصلاح نشده‌اند، صدای آن‌ها به‌طور خودکار در Android XR فضایی می‌شوند. همانطور که کاربر در فضای خود حرکت می کند، تمام صدای برنامه از پانلی که رابط کاربری برنامه روی آن نمایش داده می شود، منتشر می شود. به عنوان مثال، اگر یک تایمر از یک برنامه ساعت خاموش شود، صدا به نظر می رسد که از موقعیت پانل برنامه می آید. Android XR به طور خودکار صدا را برای واقع گرایی موقعیتی تغییر می دهد. به عنوان مثال، فاصله درک شده بین پنل برنامه و کاربر به طور نامحسوسی بر حجم صدا تأثیر می گذارد تا حس واقعی گرایی بیشتری داشته باشد.

برای اطلاعات بیشتر در مورد نحوه ارائه صدای فضایی برنامه های موجود، افزودن صدای استریو و فراگیر به برنامه خود را در این صفحه بخوانید.

اگر برنامه خود را برای XR بهینه می‌کنید، Jetpack SceneCore ابزارهایی را برای سفارشی‌سازی صدای فضایی پیشرفته ارائه می‌دهد. می‌توانید صداها را در محیط سه‌بعدی به‌طور دقیق قرار دهید، از صدای آمبیسونیک برای میدان‌های صوتی واقعی استفاده کنید و از یکپارچه‌سازی صدای فراگیر داخلی بهره ببرید.

انواع صدای فضایی موجود در اندروید XR

اندروید XR از صدای موقعیتی، استریو، فراگیر و صدای آمبیسونیک پشتیبانی می کند.

صدای موضعی

صدای موقعیتی را می توان برای پخش از یک نقطه خاص در فضای سه بعدی قرار داد. برای مثال می توانید یک مدل سه بعدی از پارس سگ در گوشه محیط مجازی خود داشته باشید. شما می توانید چندین موجودیت داشته باشید که از هر یک از موقعیت های مربوطه صدا منتشر می کنند. برای ارائه صدای موقعیتی، فایل ها باید مونو یا استریو باشند.

صدای استریو و فراگیر فضایی

همه فرمت‌های رسانه اندروید برای صدای موقعیتی، استریو و فراگیر پشتیبانی می‌شوند.

صدای استریو به فرمت های صوتی با دو کانال و صدای فراگیر به فرمت های صوتی با بیش از دو کانال، مانند صدای فراگیر 5.1 یا تنظیمات صدای فراگیر 7.1 اشاره دارد. داده های صوتی هر کانال با یک بلندگو مرتبط است. به عنوان مثال، هنگام پخش موسیقی به صورت استریو، کانال بلندگوی چپ ممکن است آهنگ های ساز متفاوتی نسبت به سمت راست منتشر کند.

صدای فراگیر اغلب در فیلم ها و نمایش های تلویزیونی برای تقویت واقع گرایی و غوطه وری از طریق استفاده از چندین کانال بلندگو استفاده می شود. به عنوان مثال، دیالوگ اغلب از یک کانال بلندگوی مرکزی پخش می‌شود، در حالی که صدای پرواز هلیکوپتر ممکن است از کانال‌های مختلفی به‌طور متوالی استفاده کند تا این حس را القا کند که هلیکوپتر در حال پرواز در فضای سه‌بعدی شماست.

صدای آمبیسونیک

صدای Ambisonic (یا ambisonics) مانند یک skybox برای صدا است که یک منظره صوتی فراگیر را برای کاربران شما فراهم می کند. از ambisonics برای صداهای محیطی پس‌زمینه یا سناریوهای دیگری که می‌خواهید یک میدان صوتی کامل کروی را که شنونده را احاطه کرده است، تکرار کنید. Android XR از فرمت صوتی AmbiX ambisonic در آمبیسونیک های درجه اول، دوم و سوم پشتیبانی می کند. ما انواع فایل Opus ( .ogg ) و PCM/Wave ( .wav ) را توصیه می کنیم.

از صدای فضایی با Jetpack SceneCore استفاده کنید

پیاده‌سازی صدای فضایی با Jetpack SceneCore شامل بررسی قابلیت‌های فضایی و انتخاب یک API برای بارگیری صدای مکانی است.

قابلیت های فضایی را بررسی کنید

قبل از استفاده از ویژگی‌های صوتی فضایی، بررسی کنید که Session از صدای مکانی پشتیبانی می‌کند. در تمام قطعات کد در بخش‌های زیر، قبل از اقدام برای پخش صدای فضایی، قابلیت‌ها بررسی می‌شوند.

بارگیری صوتی فضایی

می توانید از هر یک از API های زیر برای بارگیری صدای فضایی برای استفاده در Jetpack SceneCore استفاده کنید.

  • SoundPool : ایده آل برای جلوه های صوتی کوتاه با حجم کمتر از 1 مگابایت، آنها زودتر از موعد بارگذاری می شوند و می توان از صداها به طور مکرر استفاده کرد. این یک راه عالی برای بارگیری صدا برای صدای موقعیتی است.
  • ExoPlayer : ایده آل برای بارگیری محتوای استریو و صدای فراگیر مانند موسیقی و ویدیو. همچنین امکان پخش رسانه در پس زمینه را فراهم می کند.
  • MediaPlayer : ساده ترین راه را برای بارگیری صدای آمبیسونیک ارائه می دهد.
  • AudioTrack : بیشترین کنترل را بر نحوه بارگیری داده های صوتی ارائه می دهد. اجازه می دهد تا به طور مستقیم بافرهای صوتی بنویسید یا اگر فایل های صوتی خود را سنتز یا رمزگشایی کرده اید.

صدای موقعیتی را به برنامه خود اضافه کنید

منابع صوتی موقعیتی توسط PointSourceAttributes و یک Entity مرتبط تعریف می شوند. موقعیت و جهت Entity تعیین می کند که PointSourceAttribute کجا در فضای سه بعدی ارائه شود.

نمونه صوتی موقعیتی

مثال زیر یک فایل صوتی جلوه صوتی را در یک مخزن صدا بارگیری می کند و آن را در موقعیت Entity پخش می کند.

// Check spatial capabilities before using spatial audio
if (xrSession.getSpatialCapabilities().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 = PointSourceAttributes(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 = xrSession,
                soundPool = soundPool,
                soundID = pointSoundId,
                attributes = pointSource,
                volume = maxVolume,
                priority = lowPriority,
                loop = infiniteLoop,
                rate = normalSpeed
            )
        }
    }
} else {
    // The session does not have spatial audio capabilities
}

نکات کلیدی در مورد کد

  • اولین قدم این است که با استفاده از getSpatialCapabilities() بررسی کنید که آیا قابلیت‌های صوتی فضایی در حال حاضر در دسترس هستند یا خیر.
  • تنظیم ContentType روی CONTENT_TYPE_SONIFICATION و استفاده روی USAGE_ASSISTANCE_SONIFICATION به سیستم این امکان را می دهد که این فایل صوتی را به عنوان یک جلوه صوتی در نظر بگیرد.
  • مثال قبل فایل صوتی را بلافاصله قبل از استفاده در استخر بارگذاری می کند تا کد را برای سادگی در کنار هم نگه دارد. در حالت ایده‌آل، هنگام بارگذاری برنامه، باید تمام جلوه‌های صوتی خود را به صورت ناهمزمان بارگیری کنید تا در صورت نیاز، تمام فایل‌های صوتی در استخر در دسترس باشند.

صدای استریو و فراگیر را به برنامه خود اضافه کنید

روش پیشنهادی برای افزودن صدای استریو و فراگیر به برنامه خود استفاده از Exoplayer است. برای اطلاعات بیشتر در مورد نحوه استفاده از Spatial Audio با Exoplayer , به راهنمای Spatial Audio مراجعه کنید .

موقعیت بلندگوی صدای استریو و فراگیر

با موقعیت‌یابی بلندگوی صدای فراگیر، بلندگوهای صدای فراگیر مجازی نسبت به بلندگوی مرکزی، در یک پیکربندی استاندارد ITU در اطراف کاربر قرار گرفته و جهت‌گیری می‌شوند.

به طور پیش فرض، بلندگوی کانال مرکزی روی mainPanelEntity برنامه قرار می گیرد. این شامل برنامه‌های تلفن همراهی می‌شود که صدای آن‌ها به‌طور خودکار توسط Android XR فضاسازی می‌شود.

برای استریو، قرارگیری بلندگو شبیه صدای فراگیر است، به جز اینکه تنها کانال های چپ و راست به ترتیب در سمت چپ و راست پانل قرار دارند.

اگر چندین پنل دارید و می‌خواهید انتخاب کنید کدام پانل صدا منتشر می‌کند، یا اگر می‌خواهید صدای استریو یا فراگیر نسبت به Entity دیگری ارائه شود، می‌توانید از PointSourceAttributes برای تعریف مکان کانال مرکزی استفاده کنید. کانال های باقیمانده همانطور که قبلا ذکر شد قرار خواهند گرفت. در این مواقع، باید از MediaPlayer نیز استفاده کنید.

همانطور که کاربر در فضای خود حرکت می کند، بلندگوهای مجازی صدای استریو و فراگیر حرکت کرده و تنظیم می شوند تا اطمینان حاصل شود که بلندگوها همیشه در موقعیت بهینه قرار دارند.

اگر MediaPlayer یا ExoPlayer برای ادامه پخش صدای استریو یا فراگیر از پس‌زمینه پیکربندی کرده‌اید، وقتی برنامه در پس‌زمینه قرار می‌گیرد، موقعیت بلندگوی مجازی تغییر می‌کند. از آنجایی که هیچ پانل یا نقطه دیگری در فضا وجود ندارد که صدا را به آن متصل کند، صدای فضایی با کاربر حرکت می کند (به عبارت دیگر، "سر قفل" است).

نمونه صدای فراگیر

مثال زیر یک فایل صوتی 5.1 را با استفاده از MediaPlayer بارگیری می کند و کانال مرکزی فایل را به عنوان Entity تنظیم می کند.

// Check spatial capabilities before using spatial audio
if (xrSession.getSpatialCapabilities().hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_SPATIAL_AUDIO)) {
    // The session has spatial audio capabilities

    val pointSourceAttributes = PointSourceAttributes(xrSession.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.setPointSourceAttributes(
        xrSession,
        mediaPlayer,
        pointSourceAttributes)

    mediaPlayer.setAudioAttributes(audioAttributes)
    mediaPlayer.prepare()
    mediaPlayer.start()

} else {
    // The session does not have spatial audio capabilities
}

نکات کلیدی در مورد کد

  • مانند مثال صوتی موقعیتی ، اولین قدم این است که با استفاده از getSpatialCapabilities() بررسی کنید که آیا قابلیت های صوتی apatial در حال حاضر در دسترس هستند یا خیر.
  • تنظیم contentType روی CONTENT_TYPE_MUSIC و استفاده روی USAGE_MEDIA به سیستم امکان می‌دهد این فایل صوتی را به عنوان صدای فراگیر در نظر بگیرد.

فیلدهای صوتی ambisonic را به برنامه خود اضافه کنید

ساده ترین راه برای پخش فیلدهای صوتی ambisonic، بارگیری فایل با MediaPlayer است. از آنجایی که صدای آمبیسونیک برای کل منظره صدا اعمال می شود، برای ارائه موقعیت، نیازی به تعیین Entity ندارید. در عوض، شما یک نمونه از SoundFieldAttributes با ترتیب ambisonic مناسب که تعداد کانال ها را مشخص می کند ایجاد می کنید.

نمونه آمبیونیک

مثال زیر یک میدان صوتی ambisonic را با استفاده از MediaPlayer پخش می کند.

// Check spatial capabilities before using spatial audio
if (xrSession.getSpatialCapabilities().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(
        xrSession,
        mediaPlayer,
        soundFieldAttributes)

    mediaPlayer.setAudioAttributes(audioAttributes)
    mediaPlayer.prepare()
    mediaPlayer.start()

} else {
    // The session does not have spatial audio capabilities
}

نکات کلیدی در مورد کد

  • همانند قطعه‌های قبلی، اولین قدم این است که با استفاده از getSpatialCapabilities() بررسی کنید که آیا قابلیت‌های صوتی فضایی در حال حاضر در دسترس هستند یا خیر.
  • نوع محتوا و استفاده صرفاً اطلاعاتی است.
  • AMBISONICS_ORDER_FIRST_ORDER به SceneCore سیگنال می دهد که فایل فیلد صدا چهار کانال را تعریف می کند.