xHE-AAC দিয়ে উচ্চ মানের, কম বিটরেটের অডিও রেকর্ড করুন।

Android 17 QPR1 (API লেভেল 37.1 বা Build.VERSION_CODES_FULL.CINNAMON_BUN_1 ) থেকে, Android এক্সটেন্ডেড হাই এফিশিয়েন্সি অ্যাডভান্সড অডিও কোডিং (xHE-AAC) এনকোডিং-এর জন্য প্ল্যাটফর্ম সাপোর্ট চালু করেছে।

ISO/IEC 23003-3 (MPEG-D USAC) এবং ISO/IEC 23003-4 (MPEG-D DRC) -তে সংজ্ঞায়িত, xHE-AAC হলো ইউনিফাইড স্পিচ অ্যান্ড অডিও কোডিং-এর একটি সমন্বয়, যার সাথে বাধ্যতামূলক লাউডনেস নর্মালাইজেশন এবং বিল্ট-ইন ডাইনামিক রেঞ্জ কন্ট্রোল যুক্ত থাকে। যদিও অ্যান্ড্রয়েড কম্প্যাটিবিলিটি ডেফিনিশন ডকুমেন্ট (CDD) দ্বারা একাধিক প্ল্যাটফর্ম সংস্করণে xHE-AAC ডিকোডিং সমর্থিত এবং বাধ্যতামূলক করা হয়েছে, একটি xHE-AAC এনকোডার ( c2.android.xheaac.encoder এবং OEM হার্ডওয়্যার ইমপ্লিমেন্টেশন) যুক্ত করার ফলে আপনি উন্নত স্পিচ ক্ল্যারিটি এবং বিভিন্ন ডিভাইসে সামঞ্জস্যপূর্ণ ভলিউম সহ লো-বিটরেট ভয়েস ও অডিও মেসেজ, লাইভ অডিও স্ট্রিম এবং কমিউনিকেশন পেলোড রেকর্ড করতে পারবেন।

xHE-AAC এর সুবিধাগুলি

অ্যান্ড্রয়েড মেসেজিং অ্যাপে প্রচলিত ভয়েস রেকর্ডিং-এর জন্য সাধারণত ২৮ কেবিপিএস-এর পুরোনো AAC-LC (AAC Low Complexity) ব্যবহার করা হয়। কম বিটরেটে (<৩২ কেবিপিএস), AAC-LC-তে লক্ষণীয় ব্যান্ড-লিমিটিং আর্টিফ্যাক্ট, অস্পষ্ট কথার মান এবং নিম্নমানের কম্প্রেশন দক্ষতা দেখা যায়। এর ফলে ব্যবহারকারীরা এমন অডিও পান যা অস্পষ্ট ও কর্কশ শোনায় এবং ব্যঞ্জনবর্ণগুলো আলাদা করে বোঝা কঠিন হয়ে পড়ে। তাই শ্রোতাদের মেসেজ পুনরায় শুনতে হয় অথবা কোলাহলপূর্ণ পরিবেশে কথা বোঝার জন্য কান পাততে হয়। এছাড়াও, ভয়েস ক্লিপগুলোতে ভলিউমের তারতম্যের কারণে ব্যবহারকারীদের ঘন ঘন ডিভাইসের ভলিউম অ্যাডজাস্ট করতে হয়।

xHE-AAC আরও উন্নত অডিও কোডিং অ্যালগরিদম প্রয়োগের মাধ্যমে এই সীমাবদ্ধতাগুলো কাটিয়ে ওঠে; যেমন, এটি ডেডিকেটেড স্পিচ কোডিং এবং সাধারণ অডিও কোডিং টুলের মধ্যে গতিশীলভাবে পরিবর্তন করে, এনহ্যান্সড স্পেকট্রাল ব্যান্ড রেপ্লিকেশন (eSBR) দ্বারা ফ্রিকোয়েন্সি পরিসর প্রসারিত করে এবং খুব সামান্য অতিরিক্ত কোডিং ওভারহেডের মাধ্যমে প্যারামেট্রিক স্টেরিও কোডিং সক্ষমতা প্রদান করে।

অন্তর্নির্মিত MPEG-D DRC, xHE-AAC-এর জন্য বাধ্যতামূলক লাউডনেস কন্ট্রোল প্রদান করে, যার ফলে কন্টেন্ট একটি সামঞ্জস্যপূর্ণ ভলিউমে প্লেব্যাক করা যায়। এছাড়াও, এটি ডাইনামিক রেঞ্জ কন্ট্রোল প্রসেসিংয়ের সুবিধা দেয়, যা যেকোনো প্ল্যাটফর্মে এবং যেকোনো পরিবেশে শোনার জন্য ব্যবহারকারীকে সর্বোত্তম অভিজ্ঞতা প্রদান করে।

লক্ষ্য ব্যবহারের ক্ষেত্র

  • রিচ কমিউনিকেশন সার্ভিসেস (RCS) এবং ভয়েস মেসেজিং: GSMA RCC.71 ইউনিভার্সাল প্রোফাইল সংস্করণ 3.1 এবং তার পরবর্তী সংস্করণের সাথে সঙ্গতিপূর্ণ, যা লো-বিটরেট অডিও মেসেজিংয়ের জন্য xHE-AAC বাধ্যতামূলক করে।
  • লাইভ অডিও স্ট্রিমিং এবং পডকাস্ট: দুর্বল মোবাইল বা স্যাটেলাইট নেটওয়ার্ক সংযোগেও স্থিতিশীল অডিও গুণমান প্রদান করে।

প্ল্যাটফর্মের প্রাপ্যতা (এপিআই লেভেল ৩৭.১+)

প্ল্যাটফর্মে xHE-AAC এনকোডিং সমর্থনের জন্য API লেভেল 37.1 প্রয়োজন ( Build.VERSION.SDK_INT_FULL >= Build.VERSION_CODES_FULL.CINNAMON_BUN_1 / SDK 3700001 বা তার চেয়ে উচ্চতর)।

xHE-AAC এনকোডার সমর্থনের জন্য অনুসন্ধান করুন

MediaCodec.createByCodecName(...) ফাংশনে "c2.android.xheaac.encoder" ব্যবহার করে কল করলেই যে প্রতিটি ডিভাইসে xHE-AAC এনকোডিং উপলব্ধ থাকবে, তা ধরে নেওয়া উচিত নয়।

  • কিছু ডিভাইস প্ল্যাটফর্ম সফটওয়্যার এনকোডারের পরিবর্তে চিপসেট বিক্রেতার কাছ থেকে একটি হার্ডওয়্যার-অ্যাক্সিলারেটেড xHE-AAC এনকোডার সরবরাহ করতে পারে।
  • পুরানো ওএস রিলিজ বা কাস্টমাইজড রমগুলোতে xHE-AAC এনকোডিং সাপোর্ট নেই।
  • পিয়ার-টু-পিয়ার মেসেজিং (যেমন RCS বা চ্যাট)-এর জন্য কোনো অ্যাটাচমেন্ট এনকোড করার আগে, অ্যাপগুলির এটাও যাচাই করে দেখা উচিত যে গ্রহণকারী ক্লায়েন্ট USAC/xHE-AAC ডিকোডিং সমর্থনের বিজ্ঞাপন দেয় কিনা (উদাহরণস্বরূপ, SDP ক্যাপাবিলিটি ডিসকভারি profile-level-id=55 / object=42 ব্যবহার করে), যাতে পুরোনো রিসিভারগুলিতে আন্তঃকার্যক্ষমতার ব্যর্থতা প্রতিরোধ করা যায়।

মিডিয়া কোডেক লিস্টের ক্ষমতাগুলি পরিদর্শন করুন

বর্তমান ডিভাইসটি xHE-AAC এনকোডিং সমর্থন করে কিনা তা যাচাই করতে, MediaFormat.MIMETYPE_AUDIO_AAC সমর্থনকারী এনকোডারগুলির profileLevels পরীক্ষা করুন:

কোটলিন

import android.media.MediaCodecInfo.CodecProfileLevel
import android.media.MediaCodecList
import android.media.MediaFormat
import android.os.Build

/**
 * Checks if the current device supports xHE-AAC audio encoding.
 */
fun isXheAacEncodingSupported(): Boolean {
    // Verify API Level >= 37.1 (CINNAMON_BUN_1 / SDK 3700001)
    if (Build.VERSION.SDK_INT_FULL < Build.VERSION_CODES_FULL.CINNAMON_BUN_1) {
        return false
    }

    val codecList = MediaCodecList(MediaCodecList.REGULAR_CODECS)
    for (codecInfo in codecList.codecInfos) {
        if (!codecInfo.isEncoder) continue

        if (MediaFormat.MIMETYPE_AUDIO_AAC in codecInfo.supportedTypes) {
            val capabilities =
                codecInfo.getCapabilitiesForType(MediaFormat.MIMETYPE_AUDIO_AAC)
            // Check if AACObjectXHE (42) is present in profileLevels
            val supportsXhe = capabilities.profileLevels.any { profileLevel ->
                profileLevel.profile == CodecProfileLevel.AACObjectXHE
            }
            if (supportsXhe) {
                return true
            }
        }
    }
    return false
}

জাভা

import android.media.MediaCodecInfo;
import android.media.MediaCodecInfo.CodecProfileLevel;
import android.media.MediaCodecList;
import android.media.MediaFormat;
import android.os.Build;

/**
 * Checks if the current device supports xHE-AAC audio encoding.
 */
public boolean isXheAacEncodingSupported() {
    // Verify API Level >= 37.1 (CINNAMON_BUN_1 / SDK 3700001)
    if (Build.VERSION.SDK_INT_FULL < Build.VERSION_CODES_FULL.CINNAMON_BUN_1) {
        return false;
    }

    MediaCodecList codecList = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
    for (MediaCodecInfo codecInfo : codecList.getCodecInfos()) {
        if (!codecInfo.isEncoder()) continue;

        for (String type : codecInfo.getSupportedTypes()) {
            if (MediaFormat.MIMETYPE_AUDIO_AAC.equals(type)) {
                MediaCodecInfo.CodecCapabilities capabilities =
                        codecInfo.getCapabilitiesForType(MediaFormat.MIMETYPE_AUDIO_AAC);
                for (CodecProfileLevel profileLevel : capabilities.profileLevels) {
                    if (profileLevel.profile == CodecProfileLevel.AACObjectXHE) {
                        return true;
                    }
                }
            }
        }
    }
    return false;
}

xHE-AAC এনকোডার কনফিগার এবং ইনস্ট্যানশিয়েট করুন

আপনি xHE-AAC সমর্থন যাচাই করার পরে, আপনার MediaFormat কনফিগার করুন এবং KEY_AAC_PROFILE MediaCodecInfo.CodecProfileLevel.AACObjectXHE (মান 42 )-এ সেট করুন।

কোটলিন

fun setupXheAacEncoder(): MediaCodec? {
    if (!isXheAacEncodingSupported()) {
        return null
    }

    val mimeType = MediaFormat.MIMETYPE_AUDIO_AAC
    val sampleRate = 48000
    val channelCount = 1 // Mono voice recording
    val bitRate = 20000  // 20 kbps delivers superior speech clarity

    val format = MediaFormat.createAudioFormat(mimeType, sampleRate, channelCount).apply {
        setInteger(MediaFormat.KEY_BIT_RATE, bitRate)
        setInteger(MediaFormat.KEY_AAC_PROFILE, CodecProfileLevel.AACObjectXHE)
    }

    // Find the hardware or software encoder supporting this format and profile
    val codecList = MediaCodecList(MediaCodecList.REGULAR_CODECS)
    val encoderName = codecList.findEncoderForFormat(format) ?: return null
    val encoder = MediaCodec.createByCodecName(encoderName)
    encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE)
    return encoder
}

জাভা

public MediaCodec setupXheAacEncoder() throws IOException {
    if (!isXheAacEncodingSupported()) {
        return null;
    }

    String mimeType = MediaFormat.MIMETYPE_AUDIO_AAC;
    int sampleRate = 48000;
    int channelCount = 1; // Mono voice recording
    int bitRate = 20000;  // 20 kbps delivers superior speech clarity

    MediaFormat format = MediaFormat.createAudioFormat(mimeType, sampleRate, channelCount);
    format.setInteger(MediaFormat.KEY_BIT_RATE, bitRate);
    format.setInteger(MediaFormat.KEY_AAC_PROFILE, CodecProfileLevel.AACObjectXHE);

    // Find the hardware or software encoder supporting this format and profile
    MediaCodecList codecList =
            new MediaCodecList(MediaCodecList.REGULAR_CODECS);
    String encoderName = codecList.findEncoderForFormat(format);
    if (encoderName == null) {
        return null;
    }

    MediaCodec encoder = MediaCodec.createByCodecName(encoderName);
    encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
    return encoder;
}

সমর্থিত সফ্টওয়্যার এনকোডারের সীমা ( c2.android.xheaac.encoder )

সিস্টেম-প্রদত্ত সফটওয়্যার xHE-AAC এনকোডার ( c2.android.xheaac.encoder ) ব্যবহার করার সময়, কম্পোনেন্টটি নিম্নলিখিত সক্ষমতার সীমাবদ্ধতাগুলো বিজ্ঞাপিত করে:

  • চ্যানেল সংখ্যা: সর্বোচ্চ 2 চ্যানেল (মোনো / স্টেরিও)।
  • স্যাম্পল রেট: 44100 Hz , 48000 Hz ।
  • বিটরেট পরিসর: 12,000 bps থেকে 400,000 bps (১২ কেবিপিএস – ৪০০ কেবিপিএস)।
  • কন্টেইনার মাক্সিং: র MP4A এলিমেন্টারি স্ট্রিম এবং প্ল্যাটফর্ম MP4/M4A কন্টেইনার মাক্সিং ( MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4 ) এর সাথে সামঞ্জস্যপূর্ণ।