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

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

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

মিডিয়া বিন্যাস XML অ্যাট্রিবিউট মিডিয়া ফরম্যাট মাইম টাইপ
HEVC (H.265) HEVC MediaFormat.MIMETYPE_VIDEO_HEVC
HDR10 HDR10 মিডিয়া ফিচার।HdrType.HDR10
HDR10+ HDR10Plus মিডিয়া ফিচার।HdrType.HDR10_PLUS

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

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

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

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

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

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

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

আপনি একটি বিল্ডার ব্যবহার করে একটি 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.
}

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

একটি সম্পদ মধ্যে ক্ষমতা ঘোষণা

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

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

এই পদ্ধতিটি ব্যবহার করতে, একটি 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 সমর্থন করে না।

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

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

অঘোষিত বিন্যাস

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

বিকাশকারী বিকল্প

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

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

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

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

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

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