মানানসই মিডিয়া ট্র্যান্সকোডিং

Android 12 (API লেভেল 31) এবং তার পরবর্তী ভার্সনে, HEVC (H.265) ফর্ম্যাটে রেকর্ড করা ভিডিও AVC (H.264) ফর্ম্যাটে সিস্টেম অটোমেটিক কনভার্ট করতে পারে, যদি ভিডিওটি এমন কোনও অ্যাপে খোলা হয় যেখানে HEVC ফর্ম্যাট কাজ করে না। এই ফিচার ভিডিও ক্যাপচার অ্যাপকে ডিভাইসে রেকর্ড করা ভিডিওর জন্য আরও আধুনিক, স্টোরেজ-দক্ষ এনকোডিং ব্যবহার করার অনুমতি দেয় অন্যান্য অ্যাপের সাথে মানানসই হওয়ার ক্ষেত্রে কোনও আপোষ না করেই।

ডিভাইসে তৈরি করা কন্টেন্টের জন্য নিম্নলিখিত ফর্ম্যাটগুলি অটোমেটিক ট্রান্সকোড করা যেতে পারে:

মিডিয়া ফর্ম্যাট XML অ্যাট্রিবিউট MediaFormat mime-এর ধরন
HEVC (H.265) HEVC MediaFormat.MIMETYPE_VIDEO_HEVC
HDR10HDR10 MediaFeature.HdrType.HDR10
HDR10+ HDR10Plus MediaFeature.HdrType.HDR10_PLUS

Android ধরে নেয় যে অ্যাপ সব মিডিয়া ফর্ম্যাটের প্লেব্যাক সাপোর্ট করতে পারে, তাই মানানসই মিডিয়া ট্রান্সকোডিং ডিফল্ট হিসেবে বন্ধ থাকে।

ট্রান্সকোডিং কখন ব্যবহার করতে হয়

ট্রান্সকোডিং হল একটি কম্পিউটেশনালভাবে ব্যয়বহুল অপারেশন এবং ভিডিও ফাইল খোলার সময় উল্লেখযোগ্য বিলম্ব যোগ করে। যেমন, Pixel 3 ফোনে এক মিনিটের HEVC ভিডিও ফাইল AVC-তে ট্রান্সকোড করতে মোটামুটি ২০ সেকেন্ড সময় লাগে। এই কারণে, আপনি ডিভাইস থেকে ভিডিও ফাইল পাঠানোর সময় শুধুমাত্র তখনই ট্রান্সকোড করা উচিত। যেমন, একই অ্যাপের অন্যান্য ব্যবহারকারীর সাথে ভিডিও ফাইল শেয়ার করার সময় অথবা আধুনিক ভিডিও ফর্ম্যাট কাজ করে না এমন ক্লাউড সার্ভারে শেয়ার করার সময়।

অন-ডিভাইস প্লেব্যাক বা থাম্বনেল ছবি তৈরি করার জন্য ভিডিও ফাইল খোলার সময় ট্রান্সকোড করবেন না।

ট্র্যান্সকোডিং কনফিগার করা হচ্ছে

অ্যাপগুলি তাদের মিডিয়া ক্ষমতা ঘোষণা করে তাদের ট্রান্সকোডিং আচরণ নিয়ন্ত্রণ করতে পারে। এইসব ক্ষমতা ঘোষণা করার দুটি উপায় আছে: কোডে, অথবা রিসোর্সে।

কোডে ক্ষমতা ঘোষণা করুন

আপনি বিল্ডার ব্যবহার করে ApplicationMediaCapabilities অবজেক্টের ইনস্ট্যান্স তৈরি করে কোডে মিডিয়া ক্যাপাবিলিটি ঘোষণা করতে পারবেন:

Kotlin

val mediaCapabilities = ApplicationMediaCapabilities.Builder()
    .addSupportedVideoMimeType(MediaFormat.MIMETYPE_VIDEO_HEVC)
    .addUnsupportedHdrType(MediaFeature.HdrType.HDR10)
    .addUnsupportedHdrType(MediaFeature.HdrType.HDR10_PLUS)
    .build()

জাভা

ApplicationMediaCapabilities mediaCapabilities = new ApplicationMediaCapabilities.Builder()
        .addSupportedVideoMimeType(MediaFormat.MIMETYPE_VIDEO_HEVC)
        .addUnsupportedHdrType(MediaFeature.HdrType.HDR10)
        .addUnsupportedHdrType(MediaFeature.HdrType.HDR10_PLUS)
        .build();

মিডিয়া কন্টেন্ট অ্যাক্সেস করার সময় এই অবজেক্ট ব্যবহার করুন, যেমন ContentResolver#openTypedAssetFileDescriptor():

Kotlin

val providerOptions = Bundle().apply {
    putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES, mediaCapabilities)
}
contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions)
    .use { fileDescriptor ->
        // Content will be transcoded based on values defined in the
        // ApplicationMediaCapabilities provided.
    }

জাভা

Bundle providerOptions = new Bundle();
providerOptions.putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES, mediaCapabilities);
try (AssetFileDescriptor fileDescriptor =  contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions)) {
    // Content will be transcoded based on values defined in the
    // ApplicationMediaCapabilities provided.
}

এই পদ্ধতি নির্দিষ্ট কোড পাথের জন্য গ্র্যানুলার কন্ট্রোল প্রদান করে, যেমন শুধুমাত্র অফ-ডিভাইসে ভিডিও ফাইল ট্রান্সফার করার সময় ট্রান্সকোডিং চালু করা। এটি নিচে বর্ণিত পদ্ধতির চেয়ে অগ্রাধিকার পায়।

রিসোর্সে ক্ষমতা ঘোষণা করা

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

একেবারে প্রয়োজন না হলে এই পদ্ধতি ব্যবহার করলে, অনিচ্ছাকৃত পরিস্থিতিতে ট্রান্সকোডিং চালু হয়ে যেতে পারে, যেমন ভিডিও থাম্বনেল করার সময়, যার ফলে ব্যবহারকারীর অভিজ্ঞতা খারাপ হতে পারে।

এই পদ্ধতি ব্যবহার করতে, একটি media_capabilities.xml রিসোর্স ফাইল তৈরি করুন:

<?xml version="1.0" encoding="utf-8"?>
<media-capabilities xmlns:android="http://schemas.android.com/apk/res/android">
    <format android:name="HEVC" supported="true"/>
    <format android:name="HDR10" supported="false"/>
    <format android:name="HDR10Plus" supported="false"/>
</media-capabilities>

এই উদাহরণে, ডিভাইসে রেকর্ড করা HDR ভিডিও AVC SDR (স্ট্যান্ডার্ড ডায়নামিক রেঞ্জ) ভিডিওতে নির্বিঘ্নে ট্রান্সকোড করা হয়, কিন্তু HEVC ভিডিওর ক্ষেত্রে তা হয় না।

মিডিয়া ক্যাপাবিলিটি ফাইলে রেফারেন্স যোগ করতে application ট্যাগের মধ্যে property ট্যাগ ব্যবহার করুন। আপনার AndroidManifest.xml ফাইলে এইসব প্রপার্টি যোগ করুন:

<property
    android:name="android.media.PROPERTY_MEDIA_CAPABILITIES"
    android:resource="@xml/media_capabilities" />

ভিডিও ফাইল খোলার জন্য অন্য অ্যাপের মিডিয়া সংক্রান্ত ক্ষমতা ব্যবহার করা হচ্ছে

আপনার অ্যাপ অন্য কোনও অ্যাপের সাথে ভিডিও ফাইল শেয়ার করলে, যে অ্যাপে ফাইলটি পাঠানো হচ্ছে সেটি খোলার আগে ভিডিও ফাইলটি ট্রান্সকোড করার প্রয়োজন হতে পারে।

আপনি openTypedAssetFileDescriptor ব্যবহার করে ভিডিও ফাইল খুলে এবং রিসিভ করা অ্যাপের UID উল্লেখ করে এই কেস ম্যানেজ করতে পারবেন, যা Binder.getCallingUid ব্যবহার করে পাওয়া যেতে পারে। ভিডিও ফাইলটি ট্রান্সকোড করা উচিত কিনা তা নির্ধারণ করতে প্ল্যাটফর্মটি তখন রিসিভিং অ্যাপের মিডিয়া ক্ষমতা ব্যবহার করে।

Kotlin

val providerOptions = Bundle().apply {
    putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES_UID, Binder.getCallingUid())
}
contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions)
    .use { fileDescriptor ->
        // Content will be transcoded based on the media capabilities of the
        // calling app.
    }

জাভা

Bundle providerOptions = new Bundle();
providerOptions.putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES_UID, Binder.getCallingUid());
try (AssetFileDescriptor fileDescriptor =  contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions)) {
    // Content will be transcoded based on the media capabilities of the
    // calling app.
}

পরিস্থিতির উদাহরণ

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

উদাহরণ ১. ভিডিও ক্যাপচার অ্যাপের মাধ্যমে ট্রান্সকোডিং শুরু করা হয়। উদাহরণ ১ ভিডিও শেয়ারিং অ্যাপ ঘোষণা করে যে এটি মিডিয়া ক্যাপাবিলিটি রিসোর্স ফাইলে HEVC সাপোর্ট করে না। তারপর এটি ভিডিও ক্যাপচার অ্যাপ থেকে একটি ভিডিওর অনুরোধ করে। ভিডিও ক্যাপচার অ্যাপ অনুরোধটি ম্যানেজ করে এবং শেয়ারিং অ্যাপের UID উল্লেখ করে openTypedAssetFileDescriptor ব্যবহার করে ফাইলটি খোলে। এটি ট্রান্সকোডিং প্রসেস শুরু করে। ট্রান্সকোড করা ভিডিওটি পাওয়া গেলে, এটি শেয়ারিং অ্যাপে পাঠানো হয়, যা এটিকে ক্লাউডের একটি সার্ভারে আপলোড করে।

উদাহরণ ২। ভিডিও শেয়ারিং অ্যাপের মাধ্যমে ট্রান্সকোডিং শুরু করা হয়। উদাহরণ ২ ভিডিও ক্যাপচার অ্যাপ, MediaStore URI ব্যবহার করে ভিডিও শেয়ারিং অ্যাপের সাথে ভিডিও শেয়ার করে। ভিডিও শেয়ারিং অ্যাপ openTypedAssetFileDescriptor ব্যবহার করে ভিডিও ফাইল খোলে, এটি উল্লেখ করে যে এর মিডিয়া ক্ষমতায় HEVC কাজ করে না। এটি ট্রান্সকোডিং প্রসেস শুরু করে এবং সম্পূর্ণ হয়ে গেলে, ফাইলটি ক্লাউডের একটি সার্ভারে আপলোড করা হয়।

ঘোষণা না করা ফর্ম্যাট

যেসব ফর্ম্যাট কাজ করে না বলে ঘোষণা করা হয়েছে সেগুলির জন্য মানানসই মিডিয়া ট্রান্সকোডিং চালু করা আছে এবং যেসব ফর্ম্যাট কাজ করে বলে ঘোষণা করা হয়েছে সেগুলির জন্য বন্ধ করা আছে। অন্যান্য ফর্ম্যাটের ক্ষেত্রে, প্ল্যাটফর্ম সিদ্ধান্ত নেয় যে ট্রান্সকোড করা হবে কিনা। Android ১২-এ সব অঘোষিত ফর্ম্যাটের জন্য ট্রান্সকোডিং বন্ধ করা আছে। ভবিষ্যতে নতুন ফর্ম্যাটের জন্য এই আচরণে পরিবর্তন হতে পারে।

ডেভেলপার বিকল্প

Android-এর ডিফল্ট ট্রান্সকোডিং আচরণ ওভাররাইড করতে আপনি নিম্নলিখিত ডেভেলপার বিকল্পগুলি ব্যবহার করতে পারেন:

  • ট্রান্সকোডিং ডিফল্ট ওভাররাইড করুন এই সেটিং নির্ধারণ করে যে প্ল্যাটফর্মটি অটোমেটিক ট্রান্সকোডিং নিয়ন্ত্রণ করে কিনা। ওভাররাইড করার সুবিধা চালু করা থাকলে, প্ল্যাটফর্মের ডিফল্ট সেটিংস উপেক্ষা করা হয় এবং ট্রান্সকোডিং চালু করুন সেটিং অটোমেটিক ট্রান্সকোডিং নিয়ন্ত্রণ করে। এই বিকল্প ডিফল্ট হিসেবে বন্ধ করা থাকে।

  • ট্রান্সকোডিং চালু করুন এই সেটিং উল্লেখ করে যে অঘোষিত ফর্ম্যাট অটোমেটিক ট্রান্সকোড করা হবে কিনা। এটি ডিফল্ট হিসেবে চালু করা থাকে, তবে ট্রান্সকোডিং ডিফল্ট ওভাররাইড করুন বিকল্প চালু করা থাকলে তবেই এটি কাজ করে।

  • অ্যাপ আধুনিক ফর্ম্যাট সাপোর্ট করে বলে ধরে নেওয়া অ্যাপ কোনও অঘোষিত ফর্ম্যাট চালানোর চেষ্টা করলে কী হবে তা এই সেটিং কন্ট্রোল করে। অ্যাপটি কোনও নির্দিষ্ট ফর্ম্যাট সাপোর্ট করে কিনা তা ম্যানিফেস্টে ঘোষণা করা না থাকলে অথবা Google অ্যাপটিকে সার্ভার-সাইড ফোর্স-ট্রান্সকোড তালিকায় যোগ না করলে এটি ঘটে। সেটিং চালু থাকলে, অ্যাপ ট্রান্সকোড করে না, এটি বন্ধ থাকলে, অ্যাপ ট্রান্সকোড করে। এই বিকল্প ডিফল্ট হিসেবে চালু করা থাকে।

  • ট্রান্সকোডিং সংক্রান্ত বিজ্ঞপ্তি দেখান চালু করা থাকলে, অ্যাপটি একটি ট্রান্সকোডিং প্রগ্রেস বিজ্ঞপ্তি দেখায় যখন ট্রান্সকোডিং একটি অসমর্থিত মিডিয়া ফাইল পড়ার মাধ্যমে ট্রিগার হয়। এই বিকল্প ডিফল্ট হিসেবে চালু করা থাকে।

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