স্পেশ্যাল অডিও

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

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

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

ক্ষমতার জন্য কোয়েরি

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

Kotlin

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-এর সাম্প্রতিক রিলিজের ফলে Spatial Audio ব্যবহার করা আরও সহজ হয়েছে। আপনি যদি স্ট্যান্ডঅ্যালোন ExoPlayer লাইব্রেরি (প্যাকেজের নাম com.google.android.exoplayer2) ব্যবহার করেন, তাহলে ২.১৭ ভার্সন স্পেশিয়ালাইজড অডিও আউটপুট করার জন্য প্ল্যাটফর্ম কনফিগার করে এবং ২.১৮ ভার্সন অডিও চ্যানেল কাউন্ট সংক্রান্ত সীমাবদ্ধতা নিয়ে আসে। আপনি Media3 লাইব্রেরি থেকে ExoPlayer মডিউল (প্যাকেজের নাম androidx.media3) ব্যবহার করলে, 1.0.0-beta01 এবং তার পরবর্তী ভার্সনে একই আপডেট অন্তর্ভুক্ত থাকে।

ExoPlayer ডিপেন্ডেন্সি লেটেস্ট রিলিজে আপডেট করার পরে, আপনার অ্যাপে শুধু এমন কন্টেন্ট অন্তর্ভুক্ত করতে হবে যা স্পেশিয়ালাইজ করা যায়।

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

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

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

Kotlin

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

জাভা

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

একইভাবে, আপনি আগে থেকে থাকা ট্র্যাক সিলেক্টরের প্যারামিটার আপডেট করে অডিও চ্যানেল কাউন্ট সংক্রান্ত সীমাবদ্ধতা বন্ধ করতে পারবেন:

Kotlin

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() ব্যবহার করুন। একইভাবে, আপনি ExoPlayer-এর বর্তমান প্যারামিটার Player.getTrackSelectionParameters()-এর মাধ্যমে পেতে পারেন। যেমন, মিড-প্লেব্যাক চলাকালীন স্টেরিও অডিও ট্র্যাক বেছে নিতে:

Kotlin

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

জাভা

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

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

ডিফল্ট স্পেশিয়ালাইজেশন আচরণ

Android-এ ডিফল্ট স্পেশিয়ালাইজেশন আচরণে নিম্নলিখিত আচরণগুলি অন্তর্ভুক্ত থাকে যা OEM-এর মাধ্যমে কাস্টমাইজ করা হতে পারে:

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

    Kotlin

    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 চ্যানেল (সামনে-বাঁদিকে, সামনে-ডানদিকে, পিছনে-বাঁদিকে এবং পিছনে-ডানদিকে) থাকে। নিচের উদাহরণে, আমরা ৫.১ অডিও ট্র্যাকের জন্য AudioFormat.CHANNEL_OUT_5POINT1 ব্যবহার করি। স্টিরিও অডিও ট্র্যাকের জন্য AudioFormat.CHANNEL_OUT_STEREO ব্যবহার করুন।

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

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

    Kotlin

    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)