সামঞ্জস্যপূর্ণ মিডিয়া ট্রান্সকোডিং, সামঞ্জস্যপূর্ণ মিডিয়া ট্রান্সকোডিং, সামঞ্জস্যপূর্ণ মিডিয়া ট্রান্সকোডিং, সামঞ্জস্যপূর্ণ মিডিয়া ট্রান্সকোডিং

অ্যান্ড্রয়েড ১২ (এপিআই লেভেল ৩১) এবং এর পরবর্তী সংস্করণগুলোতে, HEVC (H.265)-এর মতো ফরম্যাটে রেকর্ড করা ভিডিওগুলো যখন HEVC সমর্থন করে না এমন কোনো অ্যাপ দ্বারা খোলা হয়, তখন সিস্টেম স্বয়ংক্রিয়ভাবে সেগুলোকে AVC (H.264)-এ রূপান্তর করতে পারে। এই বৈশিষ্ট্যটি ভিডিও ক্যাপচার অ্যাপগুলোকে অন্যান্য অ্যাপের সাথে সামঞ্জস্যতা নষ্ট না করেই ডিভাইসে রেকর্ড করা ভিডিওগুলোর জন্য আরও আধুনিক ও স্টোরেজ-সাশ্রয়ী এনকোডিং ব্যবহার করার সুযোগ দেয়।

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

মিডিয়া ফরম্যাট এক্সএমএল অ্যাট্রিবিউট মিডিয়া ফরম্যাট মাইম টাইপ
HEVC (H.265) HEVC MediaFormat.MIMETYPE_VIDEO_HEVC
HDR10 HDR10 মিডিয়াফিচার.এইচডিআরটাইপ.এইচডিআর১০
HDR10+ HDR10Plus মিডিয়াফিচার.এইচডিআরটাইপ.এইচডিআর১০_প্লাস

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

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

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

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

ট্রান্সকোডিং কনফিগার করা

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

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

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

কোটলিন

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() এর মতো মেথডের মাধ্যমে মিডিয়া কন্টেন্ট অ্যাক্সেস করার সময় এই অবজেক্টটি ব্যবহার করুন:

কোটলিন

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 ব্যবহার করে পাওয়া যায়। এরপর প্ল্যাটফর্মটি গ্রহণকারী অ্যাপের মিডিয়া সক্ষমতা ব্যবহার করে নির্ধারণ করে যে ভিডিও ফাইলটি ট্রান্সকোড করা উচিত কিনা।

কোটলিন

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 সমর্থন করে না। এর ফলে ট্রান্সকোডিং প্রক্রিয়া শুরু হয় এবং এটি সম্পন্ন হলে ফাইলটি ক্লাউডের একটি সার্ভারে আপলোড করা হয়।

অঘোষিত ফর্ম্যাট

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

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

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

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

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

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

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

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