স্থানিক অডিও

স্পেশিয়াল অডিও হল একটি নিমজ্জিত অডিও অভিজ্ঞতা যা আপনার ব্যবহারকারীদের কর্মের কেন্দ্রবিন্দুতে রাখে, আপনার কন্টেন্টকে আরও বাস্তবসম্মত করে তোলে। সাউন্ডটিকে "স্পেশিয়ালাইজড" করা হয়েছে যাতে একটি মাল্টি-স্পিকার এফেক্ট তৈরি করা হয়, যা একটি সার্উন্ড সাউন্ড সেটআপের মতো, তবে হেডফোনের মাধ্যমে।

উদাহরণস্বরূপ, একটি সিনেমায়, একটি গাড়ির শব্দ ব্যবহারকারীর পিছনে থেকে শুরু হতে পারে, এগিয়ে যেতে পারে এবং দূরে চলে যেতে পারে। একটি ভিডিও চ্যাটে, কণ্ঠস্বর আলাদা করা যেতে পারে এবং ব্যবহারকারীর চারপাশে স্থাপন করা যেতে পারে, যার ফলে স্পিকার সনাক্ত করা সহজ হয়।

যদি আপনার কন্টেন্ট একটি সমর্থিত অডিও ফর্ম্যাট ব্যবহার করে, তাহলে আপনি Android 13 (API লেভেল 33) দিয়ে শুরু করে আপনার অ্যাপে স্থানিক অডিও যোগ করতে পারেন।

সক্ষমতার জন্য অনুসন্ধান

ডিভাইসের স্পেশিয়ালাইজেশন ক্ষমতা এবং আচরণ সম্পর্কে জিজ্ঞাসা করতে Spatializer ক্লাস ব্যবহার করুন। AudioManager থেকে Spatializer একটি উদাহরণ পুনরুদ্ধার করে শুরু করুন:

কোটলিন

val spatializer = audioManager.spatializer

জাভা

Spatializer spatializer = AudioManager.getSpatializer();

Spatializer পাওয়ার পর, স্পেশিয়ালাইজড অডিও আউটপুট করার জন্য ডিভাইসটির জন্য যে চারটি শর্ত সত্য হতে হবে তা পরীক্ষা করুন:

মানদণ্ড চেক করুন
ডিভাইসটি কি স্থানিকীকরণ সমর্থন করে? getImmersiveAudioLevel() SPATIALIZER_IMMERSIVE_LEVEL_NONE নয়
স্থানিকীকরণ কি উপলব্ধ?
প্রাপ্যতা বর্তমান অডিও আউটপুট রাউটিংয়ের সাথে সামঞ্জস্যের উপর নির্ভর করে।
isAvailable() true
স্থানিকীকরণ কি সক্রিয় ? isEnabled() true
প্রদত্ত প্যারামিটার সহ একটি অডিও ট্র্যাক কি স্থানিকীকরণ করা যেতে পারে? canBeSpatialized() true

উদাহরণস্বরূপ, যদি বর্তমান অডিও ট্র্যাকের জন্য স্থানিকীকরণ অনুপলব্ধ থাকে অথবা অডিও আউটপুট ডিভাইসে সম্পূর্ণরূপে অক্ষম থাকে, তাহলে এই শর্তগুলি পূরণ নাও হতে পারে।

হেড ট্র্যাকিং

সমর্থিত হেডসেটগুলির সাহায্যে, প্ল্যাটফর্মটি ব্যবহারকারীর হেড অবস্থানের উপর ভিত্তি করে অডিওর স্থানিকীকরণ সামঞ্জস্য করতে পারে। বর্তমান অডিও আউটপুট রাউটিংয়ের জন্য একটি হেড ট্র্যাকার উপলব্ধ কিনা তা পরীক্ষা করতে, isHeadTrackerAvailable() এ কল করুন।

সামঞ্জস্যপূর্ণ কন্টেন্ট

Spatializer.canBeSpatialized() নির্দেশ করে যে প্রদত্ত বৈশিষ্ট্য সহ অডিও বর্তমান আউটপুট ডিভাইস রাউটিং দিয়ে স্থানিকীকরণ করা যেতে পারে কিনা। এই পদ্ধতিতে একটি AudioAttributes এবং একটি AudioFormat লাগে, উভয়ই নীচে আরও বিশদে বর্ণনা করা হয়েছে।

AudioAttributes

একটি AudioAttributes অবজেক্ট একটি অডিও স্ট্রিম (উদাহরণস্বরূপ, গেম অডিও বা স্ট্যান্ডার্ড মিডিয়া ) এর ব্যবহার , এর প্লেব্যাক আচরণ এবং কন্টেন্টের ধরণ সহ বর্ণনা করে।

canBeSpatialized() কল করার সময়, আপনার Player এর জন্য সেট করা AudioAttributes ইনস্ট্যান্সটি ব্যবহার করুন। উদাহরণস্বরূপ, যদি আপনি Jetpack Media3 লাইব্রেরি ব্যবহার করেন এবং AudioAttributes কাস্টমাইজ না করে থাকেন, তাহলে AudioAttributes.DEFAULT ব্যবহার করুন।

স্থানিক অডিও অক্ষম করা হচ্ছে

আপনার কন্টেন্ট ইতিমধ্যেই স্থানিকীকরণ করা হয়েছে তা বোঝাতে, setIsContentSpatialized(true) কল করুন যাতে অডিওটি ডাবল-প্রসেস না হয়। বিকল্পভাবে, setSpatializationBehavior(AudioAttributes.SPATIALIZATION_BEHAVIOR_NEVER) কল করে স্থানিকীকরণ সম্পূর্ণরূপে অক্ষম করতে স্থানিকীকরণ আচরণ সামঞ্জস্য করুন।

AudioFormat

একটি AudioFormat অবজেক্ট একটি অডিও ট্র্যাকের ফর্ম্যাট এবং চ্যানেল কনফিগারেশন সম্পর্কে বিশদ বর্ণনা করে।

canBeSpatialized() এ পাস করার জন্য AudioFormat ইন্সট্যান্ট করার সময়, ডিকোডার থেকে প্রত্যাশিত আউটপুট ফর্ম্যাটের মতো এনকোডিং সেট করুন। আপনার কন্টেন্টের চ্যানেল কনফিগারেশনের সাথে মেলে এমন একটি চ্যানেল মাস্কও সেট করা উচিত। ব্যবহারের জন্য নির্দিষ্ট মান সম্পর্কে নির্দেশনার জন্য ডিফল্ট স্পেশিয়ালাইজেশন আচরণ বিভাগটি দেখুন।

Spatializer পরিবর্তনগুলি শুনুন

Spatializer এর অবস্থার পরিবর্তন শুনতে, আপনি Spatializer.addOnSpatializerStateChangedListener() দিয়ে একজন শ্রোতা যোগ করতে পারেন। একইভাবে, হেড ট্র্যাকারের উপলব্ধতার পরিবর্তন শুনতে, Spatializer.addOnHeadTrackerAvailableListener() এ কল করুন।

লিসেনারের কলব্যাক ব্যবহার করে প্লেব্যাকের সময় আপনার ট্র্যাক নির্বাচন সামঞ্জস্য করতে চাইলে এটি কার্যকর হতে পারে। উদাহরণস্বরূপ, যখন কোনও ব্যবহারকারী ডিভাইস থেকে তাদের হেডসেট সংযোগ বা সংযোগ বিচ্ছিন্ন করে, তখন onSpatializerAvailableChanged কলব্যাক নির্দেশ করে যে নতুন অডিও আউটপুট রাউটিংয়ের জন্য স্প্যাটিলাইজার প্রভাব উপলব্ধ কিনা। এই মুহুর্তে, আপনি ডিভাইসের নতুন ক্ষমতার সাথে মেলে আপনার প্লেয়ারের ট্র্যাক নির্বাচন লজিক আপডেট করার কথা বিবেচনা করতে পারেন। ExoPlayer এর ট্র্যাক নির্বাচন আচরণ সম্পর্কে বিস্তারিত জানতে, ExoPlayer এবং স্প্যাটিয়াল অডিও বিভাগটি দেখুন।

এক্সোপ্লেয়ার এবং স্থানিক অডিও

ExoPlayer এর সাম্প্রতিক রিলিজগুলি স্থানিক অডিও গ্রহণ করা সহজ করে তোলে। যদি আপনি স্বতন্ত্র ExoPlayer লাইব্রেরি (প্যাকেজ নাম com.google.android.exoplayer2 ) ব্যবহার করেন, তাহলে সংস্করণ 2.17 প্ল্যাটফর্মটিকে স্থানিক অডিও আউটপুট করার জন্য কনফিগার করে এবং সংস্করণ 2.18 অডিও চ্যানেল গণনা সীমাবদ্ধতা প্রবর্তন করে। যদি আপনি Media3 লাইব্রেরি (প্যাকেজ নাম androidx.media3 ) থেকে ExoPlayer মডিউল ব্যবহার করেন, তাহলে সংস্করণ 1.0.0-beta01 এবং নতুন সংস্করণগুলিতে এই একই আপডেটগুলি অন্তর্ভুক্ত থাকে।

আপনার ExoPlayer নির্ভরতা সর্বশেষ রিলিজে আপডেট করার পরে, আপনার অ্যাপে কেবল এমন সামগ্রী অন্তর্ভুক্ত করতে হবে যা স্থানিকীকরণ করা যেতে পারে।

অডিও চ্যানেল গণনার সীমাবদ্ধতা

স্পেশিয়াল অডিওর জন্য চারটি শর্ত পূরণ হলে, ExoPlayer একটি মাল্টি-চ্যানেল অডিও ট্র্যাক বেছে নেয়। যদি তা না হয়, তাহলে ExoPlayer পরিবর্তে একটি স্টেরিও ট্র্যাক বেছে নেয়। যদি Spatializer বৈশিষ্ট্য পরিবর্তিত হয়, তাহলে ExoPlayer বর্তমান বৈশিষ্ট্যের সাথে মেলে এমন একটি অডিও ট্র্যাক নির্বাচন করার জন্য একটি নতুন ট্র্যাক নির্বাচন ট্রিগার করবে। মনে রাখবেন যে এই নতুন ট্র্যাক নির্বাচনের ফলে রিবাফারিং সময়কাল সংক্ষিপ্ত হতে পারে।

অডিও চ্যানেল গণনা সীমাবদ্ধতা অক্ষম করতে, নীচে দেখানো হিসাবে প্লেয়ারে ট্র্যাক নির্বাচনের পরামিতি সেট করুন:

কোটলিন

exoPlayer.trackSelectionParameters = DefaultTrackSelector.Parameters.Builder(context)
  .setConstrainAudioChannelCountToDeviceCapabilities(false)
  .build()

জাভা

exoPlayer.setTrackSelectionParameters(
  new DefaultTrackSelector.Parameters.Builder(context)
    .setConstrainAudioChannelCountToDeviceCapabilities(false)
    .build()
);

একইভাবে, আপনি অডিও চ্যানেল গণনা সীমাবদ্ধতা নিষ্ক্রিয় করতে বিদ্যমান ট্র্যাক নির্বাচকের প্যারামিটারগুলি নিম্নরূপ আপডেট করতে পারেন:

কোটলিন

val trackSelector = DefaultTrackSelector(context)
...
trackSelector.parameters = trackSelector.buildUponParameters()
  .setConstrainAudioChannelCountToDeviceCapabilities(false)
  .build()

জাভা

DefaultTrackSelector trackSelector = new DefaultTrackSelector(context);
...
trackSelector.setParameters(
  trackSelector
    .buildUponParameters()
    .setConstrainAudioChannelCountToDeviceCapabilities(false)
    .build()
);

অডিও চ্যানেল গণনা সীমাবদ্ধতা অক্ষম থাকায়, যদি কন্টেন্টে একাধিক অডিও ট্র্যাক থাকে, তাহলে ExoPlayer প্রাথমিকভাবে সেই ট্র্যাকটি নির্বাচন করে যেটিতে সর্বাধিক সংখ্যক চ্যানেল রয়েছে এবং ডিভাইস থেকে প্লে করা যায়। উদাহরণস্বরূপ, যদি কন্টেন্টে একটি মাল্টি-চ্যানেল অডিও ট্র্যাক এবং একটি স্টেরিও অডিও ট্র্যাক থাকে এবং ডিভাইসটি উভয়ের প্লেব্যাক সমর্থন করে, তাহলে ExoPlayer মাল্টি-চ্যানেল ট্র্যাকটি নির্বাচন করে। এই আচরণটি কীভাবে কাস্টমাইজ করবেন সে সম্পর্কে বিস্তারিত জানতে অডিও ট্র্যাক নির্বাচন দেখুন।

অডিও ট্র্যাক নির্বাচন

যখন ExoPlayer-এর অডিও চ্যানেল কাউন্ট কনস্ট্রেইনমেন্ট আচরণ অক্ষম করা থাকে, তখন ExoPlayer স্বয়ংক্রিয়ভাবে এমন কোনও অডিও ট্র্যাক নির্বাচন করে না যা ডিভাইসের স্প্যাটিলাইজারের বৈশিষ্ট্যের সাথে মেলে। পরিবর্তে, আপনি প্লেব্যাকের আগে বা চলাকালীন ট্র্যাক নির্বাচন প্যারামিটার সেট করে ExoPlayer-এর ট্র্যাক নির্বাচন লজিক কাস্টমাইজ করতে পারেন। ডিফল্টরূপে, ExoPlayer এমন অডিও ট্র্যাক নির্বাচন করে যা MIME টাইপ (এনকোডিং), চ্যানেল গণনা এবং নমুনা হারের ক্ষেত্রে প্রাথমিক ট্র্যাকের মতো।

ট্র্যাক নির্বাচনের পরামিতি পরিবর্তন করা হচ্ছে

ExoPlayer এর ট্র্যাক নির্বাচনের প্যারামিটার পরিবর্তন করতে, Player.setTrackSelectionParameters() ব্যবহার করুন। একইভাবে, আপনি Player.getTrackSelectionParameters() ব্যবহার করে ExoPlayer এর বর্তমান প্যারামিটার পেতে পারেন। উদাহরণস্বরূপ, প্লেব্যাকের মাঝখানে একটি স্টেরিও অডিও ট্র্যাক নির্বাচন করতে:

কোটলিন

exoPlayer.trackSelectionParameters = exoPlayer.trackSelectionParameters
  .buildUpon()
  .setMaxAudioChannelCount(2)
  .build()

জাভা

exoPlayer.setTrackSelectionParameters(
  exoPlayer.getTrackSelectionParameters()
    .buildUpon()
    .setMaxAudioChannelCount(2)
    .build()
);

মনে রাখবেন যে প্লেব্যাকের মাঝামাঝি সময়ে ট্র্যাক নির্বাচনের প্যারামিটার পরিবর্তন করলে প্লেব্যাকে বাধা সৃষ্টি হতে পারে। প্লেয়ারের ট্র্যাক নির্বাচনের প্যারামিটার টিউন করার বিষয়ে আরও তথ্য ExoPlayer ডক্সের ট্র্যাক নির্বাচন বিভাগে পাওয়া যাবে।

ডিফল্ট স্থানিকীকরণ আচরণ

অ্যান্ড্রয়েডের ডিফল্ট স্থানিকীকরণ আচরণে নিম্নলিখিত আচরণগুলি অন্তর্ভুক্ত থাকে যা OEM দ্বারা কাস্টমাইজ করা যেতে পারে:

  • শুধুমাত্র মাল্টি-চ্যানেল কন্টেন্ট স্পেশালাইজ করা হয়, স্টেরিও কন্টেন্ট নয়। যদি আপনি এক্সোপ্লেয়ার ব্যবহার না করেন, তাহলে আপনার মাল্টি-চ্যানেল অডিও কন্টেন্টের ফর্ম্যাটের উপর নির্ভর করে, আপনাকে অডিও ডিকোডার দ্বারা সর্বোচ্চ কত সংখ্যক চ্যানেল আউটপুট করা যাবে তা কনফিগার করতে হতে পারে। এটি নিশ্চিত করে যে অডিও ডিকোডার প্ল্যাটফর্মটিকে স্পেশালাইজ করার জন্য মাল্টি-চ্যানেল PCM আউটপুট করে।

    কোটলিন

    val mediaFormat = MediaFormat()
    mediaFormat.setInteger(MediaFormat.KEY_MAX_OUTPUT_CHANNEL_COUNT, 99)

    জাভা

    MediaFormat mediaFormat = new MediaFormat();
    mediaFormat.setInteger(MediaFormat.KEY_MAX_OUTPUT_CHANNEL_COUNT, 99);

    বাস্তব উদাহরণের জন্য, ExoPlayer এর MediaCodecAudioRenderer.java দেখুন। OEM কাস্টমাইজেশন নির্বিশেষে, নিজেকে স্পেশালাইজেশন বন্ধ করতে, স্পেশাল অডিও নিষ্ক্রিয় করা দেখুন।

  • AudioAttributes : যদি usage USAGE_MEDIA অথবা USAGE_GAME তে সেট করা থাকে, তাহলে অডিও স্থানিকীকরণের জন্য যোগ্য।

  • AudioFormat : এমন একটি চ্যানেল মাস্ক ব্যবহার করুন যাতে কমপক্ষে AudioFormat.CHANNEL_OUT_QUAD চ্যানেল (সামনে-বাম, সামনে-ডান, পিছনে-বাম এবং পিছনে-ডান) থাকে যাতে অডিওটি স্থানিকীকরণের জন্য যোগ্য হয়। নীচের উদাহরণে, আমরা 5.1 অডিও ট্র্যাকের জন্য AudioFormat.CHANNEL_OUT_5POINT1 ব্যবহার করি। একটি স্টেরিও অডিও ট্র্যাকের জন্য, AudioFormat.CHANNEL_OUT_STEREO ব্যবহার করি।

    যদি আপনি Media3 ব্যবহার করেন, তাহলে আপনি Util.getAudioTrackChannelConfig(int channelCount) ব্যবহার করে একটি চ্যানেল কাউন্টকে একটি চ্যানেল মাস্কে রূপান্তর করতে পারেন।

    এছাড়াও, যদি আপনি ডিকোডারটিকে মাল্টি-চ্যানেল PCM আউটপুট করার জন্য কনফিগার করে থাকেন, তাহলে এনকোডিংটি AudioFormat.ENCODING_PCM_16BIT এ সেট করুন।

    কোটলিন

    val audioFormat = AudioFormat.Builder()
      .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
      .setChannelMask(AudioFormat.CHANNEL_OUT_5POINT1)
      .build()

    জাভা

    AudioFormat audioFormat = new AudioFormat.Builder()
      .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
      .setChannelMask(AudioFormat.CHANNEL_OUT_5POINT1)
      .build();

স্থানিক অডিও পরীক্ষা করুন

আপনার পরীক্ষামূলক ডিভাইসে স্থানিক অডিও সক্ষম আছে কিনা তা নিশ্চিত করুন:

  • তারযুক্ত হেডসেটের জন্য, সিস্টেম সেটিংস > শব্দ এবং কম্পন > স্থানিক অডিও এ যান।
  • ওয়্যারলেস হেডসেটের জন্য, সিস্টেম সেটিংস > সংযুক্ত ডিভাইস > আপনার ওয়্যারলেস ডিভাইসের জন্য গিয়ার আইকন > স্থানিক অডিও এ যান।

বর্তমান রাউটিংয়ের জন্য স্পেশিয়াল অডিওর উপলব্ধতা পরীক্ষা করতে, আপনার ডিভাইসে adb shell dumpsys audio কমান্ডটি চালান। প্লেব্যাক সক্রিয় থাকাকালীন আউটপুটে নিম্নলিখিত প্যারামিটারগুলি দেখতে পাবেন:

Spatial audio:
mHasSpatializerEffect:true (effect present)
isSpatializerEnabled:true (routing dependent)