Jetpack SceneCore-এর স্থানিক অডিও বৈশিষ্ট্যগুলি আপনাকে আপনার Android XR অ্যাপ্লিকেশনগুলির মধ্যে নিমজ্জিত অডিও অভিজ্ঞতা তৈরি করতে সক্ষম করে।
স্থানিক অডিও সিমুলেট করে কিভাবে ব্যবহারকারীরা 3D পরিবেশে শব্দ বুঝতে পারে। এটি ব্যবহারকারীর উপরে এবং নীচে সহ সমস্ত দিক থেকে নির্গত শব্দের সংবেদন তৈরি করে। সিস্টেমটি 3D স্পেসে নির্দিষ্ট স্থানে এক বা একাধিক "ভার্চুয়াল স্পিকার" অনুকরণ করে এটি করে।
বিদ্যমান অ্যাপ্লিকেশানগুলি যেগুলি Android XR-এর জন্য ডিজাইন বা সংশোধন করা হয়নি সেগুলির অডিও স্বয়ংক্রিয়ভাবে Android XR-এ স্থানান্তরিত হয়৷ ব্যবহারকারী যখন তাদের স্থানের চারপাশে ঘোরে, সমস্ত অ্যাপ অডিও প্যানেল থেকে নির্গত হবে যেটিতে অ্যাপের UI রেন্ডার করা হয়েছে। উদাহরণস্বরূপ, যদি একটি ক্লক অ্যাপ থেকে টাইমার বন্ধ হয়ে যায়, তাহলে অডিওটি অ্যাপ প্যানেলের অবস্থান থেকে আসছে বলে মনে হবে। অবস্থানগত বাস্তবতার জন্য Android XR স্বয়ংক্রিয়ভাবে শব্দ পরিবর্তন করবে। উদাহরণস্বরূপ, অ্যাপ প্যানেল এবং ব্যবহারকারীর মধ্যে অনুভূত দূরত্ব সূক্ষ্মভাবে অডিও ভলিউমকে আরও বেশি বাস্তবতাবোধের জন্য প্রভাবিত করবে।
বিদ্যমান অ্যাপগুলি কীভাবে স্থানিক অডিও রেন্ডার করে সে সম্পর্কে আরও তথ্যের জন্য, এই পৃষ্ঠায় আপনার অ্যাপে স্টেরিও এবং চারপাশের শব্দ যুক্ত করুন পড়ুন।
আপনি যদি আপনার অ্যাপটি XR-এর জন্য অপ্টিমাইজ করে থাকেন, Jetpack SceneCore উন্নত স্থানিক অডিও কাস্টমাইজেশনের জন্য টুল সরবরাহ করে। আপনি 3D পরিবেশে শব্দগুলিকে সুনির্দিষ্টভাবে অবস্থান করতে পারেন, বাস্তবসম্মত শব্দ ক্ষেত্রের জন্য অ্যাম্বিসনিক অডিও ব্যবহার করতে পারেন এবং অন্তর্নির্মিত চারপাশের শব্দ একীকরণের সুবিধা নিতে পারেন।
Android XR-এ উপলব্ধ স্থানিক অডিওর প্রকারগুলি
Android XR অবস্থানগত, স্টেরিও, চারপাশের শব্দ এবং অ্যাম্বিসনিক অডিও সমর্থন করে।
অবস্থানগত অডিও
একটি অবস্থানগত অডিও 3D স্থানের একটি নির্দিষ্ট বিন্দু থেকে প্লে করার জন্য অবস্থান করা যেতে পারে। উদাহরণস্বরূপ, আপনার ভার্চুয়াল পরিবেশের কোণে কুকুরের ঘেউ ঘেউ করার একটি 3D মডেল থাকতে পারে। আপনি একাধিক সত্তা তাদের নিজ নিজ অবস্থান থেকে শব্দ নির্গত হতে পারে. অবস্থানগত অডিও রেন্ডার করতে, ফাইলগুলি অবশ্যই মনো বা স্টেরিও হতে হবে।
স্থানিক স্টেরিও এবং চারপাশের শব্দ
সমস্ত Android মিডিয়া ফর্ম্যাট অবস্থানগত, স্টেরিও এবং চারপাশের শব্দের জন্য সমর্থিত।
স্টেরিও অডিও বলতে বোঝায় দুটি চ্যানেলের অডিও ফরম্যাট এবং চারপাশের শব্দ দুটির বেশি চ্যানেলের অডিও ফরম্যাটকে বোঝায়, যেমন 5.1 চারপাশের শব্দ বা 7.1 চারপাশের শব্দ কনফিগারেশন। প্রতিটি চ্যানেলের সাউন্ড ডেটা একটি স্পিকারের সাথে যুক্ত। উদাহরণস্বরূপ, স্টেরিওতে মিউজিক বাজানোর সময়, বাম স্পিকার চ্যানেল ডানের চেয়ে ভিন্ন যন্ত্র ট্র্যাক নির্গত করতে পারে।
একাধিক স্পিকার চ্যানেল ব্যবহারের মাধ্যমে বাস্তববাদ ও নিমগ্নতা বাড়াতে সিনেমা এবং টেলিভিশন শোতে প্রায়ই চারপাশের শব্দ ব্যবহার করা হয়। উদাহরণস্বরূপ, কথোপকথন প্রায়ই একটি কেন্দ্রের স্পিকার চ্যানেল থেকে বাজানো হয় যখন হেলিকপ্টার উড়ে যাওয়ার শব্দটি ক্রমানুসারে বিভিন্ন চ্যানেল ব্যবহার করতে পারে যে হেলিকপ্টারটি আপনার 3D স্থানের চারপাশে উড়ছে।
অ্যাম্বিসনিক অডিও
অ্যাম্বিসনিক অডিও (বা অ্যাম্বিসনিক্স) অডিওর জন্য একটি স্কাইবক্সের মতো, যা আপনার ব্যবহারকারীদের জন্য একটি নিমজ্জিত সাউন্ডস্কেপ প্রদান করে। পটভূমির পরিবেশগত শব্দ বা অন্যান্য পরিস্থিতির জন্য অ্যাম্বিসনিক্স ব্যবহার করুন যেখানে আপনি শ্রোতাকে ঘিরে একটি পূর্ণ-গোলাকার শব্দ ক্ষেত্র প্রতিলিপি করতে চান। অ্যান্ড্রয়েড এক্সআর অ্যাম্বিক্স অ্যাম্বিসনিক অডিও ফর্ম্যাটকে প্রথম, দ্বিতীয় এবং তৃতীয় ক্রম অ্যাম্বিসনিক্স সমর্থন করে। আমরা Opus ( .ogg
) এবং PCM/Wave ( .wav
) ফাইল প্রকারের সুপারিশ করি৷
জেটপ্যাক সিনকোরের সাথে স্থানিক অডিও ব্যবহার করুন
জেটপ্যাক সিনকোরের সাথে স্থানিক অডিও বাস্তবায়নের মধ্যে স্থানিক ক্ষমতা পরীক্ষা করা এবং স্থানিক অডিও লোড করার জন্য একটি API বেছে নেওয়া জড়িত।
স্থানিক ক্ষমতা পরীক্ষা করুন
স্থানিক অডিও বৈশিষ্ট্যগুলি ব্যবহার করার আগে, Session
স্থানিক অডিও সমর্থন করে কিনা তা পরীক্ষা করুন৷ নিম্নলিখিত বিভাগগুলির সমস্ত কোড স্নিপেটে, স্থানিক অডিও চালানোর চেষ্টা করার আগে ক্ষমতাগুলি পরীক্ষা করা হয়।
স্থানিক অডিও লোড করুন
আপনি Jetpack SceneCore-এ ব্যবহারের জন্য স্থানিক অডিও লোড করতে নিম্নলিখিত APIগুলির যেকোনও ব্যবহার করতে পারেন।
-
SoundPool
: ছোট সাউন্ড ইফেক্টের জন্য আদর্শ যেগুলির আকার 1 MB এর কম, সেগুলি সময়ের আগে লোড হয় এবং শব্দগুলি বারবার ব্যবহার করা যেতে পারে। অবস্থানগত অডিওর জন্য অডিও লোড করার এটি একটি দুর্দান্ত উপায়। -
ExoPlayer
: স্টেরিও এবং চারপাশের সাউন্ড কন্টেন্ট যেমন মিউজিক এবং ভিডিও লোড করার জন্য আদর্শ। এছাড়াও পটভূমি মিডিয়া প্লেব্যাক জন্য অনুমতি দেয়. -
MediaPlayer
: অ্যাম্বিসনিক অডিও লোড করার সবচেয়ে সহজ উপায় প্রদান করে। -
AudioTrack
: অডিও ডেটা কীভাবে লোড করতে হয় তার উপর সর্বাধিক নিয়ন্ত্রণ প্রদান করে। সরাসরি অডিওর বাফার লেখার অনুমতি দেয় বা যদি আপনি আপনার নিজের অডিও ফাইলগুলিকে সংশ্লেষিত বা ডিকোড করেন।
আপনার অ্যাপে অবস্থানগত অডিও যোগ করুন
পজিশনাল সাউন্ড সোর্স PointSourceParams
এবং একটি সংশ্লিষ্ট Entity
দ্বারা সংজ্ঞায়িত করা হয়। Entity
অবস্থান এবং অভিযোজন নির্দেশ করে যেখানে PointSourceParams
3D স্পেসে রেন্ডার করা হয়েছে৷
অবস্থানগত অডিও উদাহরণ
নিম্নলিখিত উদাহরণটি একটি সাউন্ড পুলে একটি সাউন্ড ইফেক্ট অডিও ফাইল লোড করে এবং এটিকে 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
ব্যবহার করে পরীক্ষা করা। -
CONTENT_TYPE_SONIFICATION
এ কনটেন্ট টাইপ সেট করা এবং ব্যবহারUSAGE_ASSISTANCE_SONIFICATION
এ সেট করা সিস্টেমটিকে এই অডিও ফাইলটিকে একটি শব্দ প্রভাব হিসাবে বিবেচনা করতে দেয়৷ - পূর্ববর্তী উদাহরণটি সরলতার জন্য কোডটি একসাথে রাখার জন্য ব্যবহার করার আগে অডিও ফাইলটিকে পুলে লোড করে। আদর্শভাবে, আপনি আপনার অ্যাপ লোড করার সাথে সাথে আপনার সমস্ত সাউন্ড এফেক্টগুলিকে অ্যাসিঙ্ক্রোনাসভাবে লোড করা উচিত যাতে আপনার যখন প্রয়োজন হয় তখন সমস্ত অডিও ফাইল পুলে উপলব্ধ থাকে।
আপনার অ্যাপে স্টেরিও এবং চারপাশের শব্দ যোগ করুন
আপনার অ্যাপে স্টেরিও এবং চারপাশের শব্দ যোগ করার প্রস্তাবিত উপায় হল Exoplayer
ব্যবহার করে৷ Exoplayer
সাথে স্থানিক অডিও কীভাবে ব্যবহার করবেন সে সম্পর্কে আরও তথ্যের জন্য, স্থানিক অডিও নির্দেশিকা পড়ুন।
স্টেরিও এবং চারপাশের সাউন্ড স্পিকারের অবস্থান
চারপাশের সাউন্ড স্পিকারের অবস্থানের সাথে, ভার্চুয়াল চারপাশের সাউন্ড স্পিকারগুলি একটি আদর্শ আইটিইউ কনফিগারেশনে ব্যবহারকারীর চারপাশে একটি কেন্দ্র স্পিকারের সাপেক্ষে অবস্থান এবং ভিত্তিক হয়।
ডিফল্টরূপে, কেন্দ্র চ্যানেল স্পিকার অ্যাপের mainPanelEntity
এ স্থাপন করা হয়। এর মধ্যে রয়েছে এমন মোবাইল অ্যাপ যেগুলির অডিও স্বয়ংক্রিয়ভাবে Android XR দ্বারা স্থানান্তরিত হয়৷
স্টেরিওর জন্য, স্পীকার বসানো চারপাশের শব্দের মতোই, শুধুমাত্র প্যানেলের বাম এবং ডান দিকে যথাক্রমে অবস্থিত বাম এবং ডান চ্যানেলগুলি ছাড়া।
আপনার যদি একাধিক প্যানেল থাকে এবং আপনি কোন প্যানেলটি অডিও নির্গত করতে চান তা চয়ন করতে চান, অথবা আপনি যদি চান যে স্টেরিও বা চারপাশের অডিও অন্য Entity
সাথে রেন্ডার করতে, আপনি কেন্দ্র চ্যানেলের অবস্থান নির্ধারণ করতে [ PointSourceAttributes
][PointSourceAttributes] ব্যবহার করতে পারেন৷ অবশিষ্ট চ্যানেলগুলি পূর্বে উল্লিখিত হিসাবে স্থাপন করা হবে। এই পরিস্থিতিতে, আপনাকে অবশ্যই MediaPlayer
ব্যবহার করতে হবে।
ব্যবহারকারী যখন তাদের স্থানের চারপাশে ঘোরে, স্টেরিও এবং চারপাশের সাউন্ড ভার্চুয়াল স্পিকারগুলি সর্বদা সর্বোত্তম অবস্থানে থাকে তা নিশ্চিত করতে সরে যাবে এবং সামঞ্জস্য করবে।
আপনি যদি পটভূমি থেকে স্টেরিও বা চারপাশের সাউন্ড বাজানো চালিয়ে যেতে MediaPlayer
বা ExoPlayer
কনফিগার করে থাকেন, অ্যাপটি ব্যাকগ্রাউন্ড করা হলে ভার্চুয়াল স্পিকারের অবস্থান পরিবর্তন করা হবে। শব্দটি নোঙ্গর করার জন্য কোনও প্যানেল বা অন্য কোনও স্থান নেই বলে, স্থানিক অডিও ব্যবহারকারীর সাথে চলে (অন্য কথায়, এটি "হেড-লকড")।
চারপাশের শব্দ উদাহরণ
নিম্নলিখিত উদাহরণটি MediaPlayer
ব্যবহার করে একটি 5.1 অডিও ফাইল লোড করে এবং ফাইলের কেন্দ্র চ্যানেলটিকে একটি 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
CONTENT_TYPE_MUSIC এবং ব্যবহার USAGE_MEDIA- এ সেট করা সিস্টেমটিকে এই অডিও ফাইলটিকে চারপাশের শব্দ হিসাবে বিবেচনা করতে দেয়৷
আপনার অ্যাপে অ্যাম্বিসনিক সাউন্ড ফিল্ড যোগ করুন
অ্যাম্বিসনিক সাউন্ড ফিল্ড প্লে ব্যাক করার সবচেয়ে সহজ উপায় হল 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 }
কোড সম্পর্কে মূল পয়েন্ট
- পূর্ববর্তী স্নিপেটগুলির মতো, প্রথম ধাপ হল [
getSpatialCapabilities()
][getSpatialCapabilities()] ব্যবহার করে স্থানিক অডিও ক্ষমতা বর্তমানে উপলব্ধ কিনা তা পরীক্ষা করা। - বিষয়বস্তুর প্রকার এবং ব্যবহার সম্পূর্ণরূপে তথ্যপূর্ণ।
-
AMBISONICS_ORDER_FIRST_ORDER
SceneCore এ সংকেত দেয় যে সাউন্ড ফিল্ড ফাইলটি চারটি চ্যানেলকে সংজ্ঞায়িত করে।