অ্যান্ড্রয়েড ১২ (এপিআই লেভেল ৩১) এবং তার উচ্চতর ভার্সনে, HEVC (H.265) এর মতো ফর্ম্যাটে রেকর্ড করা ভিডিওগুলিকে AVC (H.264) তে স্বয়ংক্রিয়ভাবে রূপান্তর করতে পারে যখন HEVC সমর্থন করে না এমন কোনও অ্যাপ দ্বারা ভিডিওগুলি খোলা হয়। এই বৈশিষ্ট্যটি ভিডিও ক্যাপচার অ্যাপগুলিকে অন্যান্য অ্যাপের সাথে সামঞ্জস্যতা নষ্ট না করে ডিভাইসে রেকর্ড করা ভিডিওগুলির জন্য আরও আধুনিক, স্টোরেজ-দক্ষ এনকোডিং ব্যবহার করার অনুমতি দেয়।
ডিভাইসে তৈরি কন্টেন্টের জন্য নিম্নলিখিত ফর্ম্যাটগুলি স্বয়ংক্রিয়ভাবে ট্রান্সকোড করা যেতে পারে:
| মিডিয়া ফর্ম্যাট | XML অ্যাট্রিবিউট | মিডিয়াফরম্যাট মাইম টাইপ |
|---|---|---|
| এইচইভিসি (এইচ.২৬৫) | এইচইভিসি | মিডিয়াফরম্যাট।MIMETYPE_VIDEO_HEVC |
| এইচডিআর১০ | এইচডিআর১০ | মিডিয়াফিচার.এইচডিআরটাইপ.এইচডিআর১০ |
| এইচডিআর১০+ | HDR10Plus সম্পর্কে | মিডিয়াফিচার.এইচডিআরটাইপ.এইচডিআর১০_প্লাস |
অ্যান্ড্রয়েড ধরে নেয় যে অ্যাপগুলি সমস্ত মিডিয়া ফর্ম্যাটের প্লেব্যাক সমর্থন করতে পারে, তাই সামঞ্জস্যপূর্ণ মিডিয়া ট্রান্সকোডিং ডিফল্টরূপে বন্ধ থাকে।
ট্রান্সকোডিং কখন ব্যবহার করবেন
ট্রান্সকোডিং একটি গণনামূলকভাবে ব্যয়বহুল অপারেশন এবং একটি ভিডিও ফাইল খোলার সময় উল্লেখযোগ্য বিলম্ব যোগ করে। উদাহরণস্বরূপ, একটি Pixel 3 ফোনে এক মিনিটের HEVC ভিডিও ফাইল 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 সমর্থন করে না।
উদাহরণ ১। ভিডিও ক্যাপচার অ্যাপ দ্বারা ট্রান্সকোডিং শুরু হয়। ভিডিও শেয়ারিং অ্যাপটি ঘোষণা করে যে এটি তার মিডিয়া ক্যাপাবিলিটিস রিসোর্স ফাইলে HEVC সমর্থন করে না। তারপর এটি ভিডিও ক্যাপচার অ্যাপ থেকে একটি ভিডিও অনুরোধ করে। ভিডিও ক্যাপচার অ্যাপটি অনুরোধটি পরিচালনা করে এবং
openTypedAssetFileDescriptor ব্যবহার করে ফাইলটি খোলে, শেয়ারিং অ্যাপের UID নির্দিষ্ট করে। এটি ট্রান্সকোডিং প্রক্রিয়া শুরু করে। ট্রান্সকোড করা ভিডিওটি গ্রহণ করা হলে এটি শেয়ারিং অ্যাপে সরবরাহ করা হয়, যা এটি ক্লাউডের একটি সার্ভারে আপলোড করে।
উদাহরণ ২। ভিডিও শেয়ারিং অ্যাপ দ্বারা ট্রান্সকোডিং শুরু হয়। ভিডিও ক্যাপচার অ্যাপটি একটি
MediaStore URI ব্যবহার করে ভিডিও শেয়ারিং অ্যাপের সাথে একটি ভিডিও শেয়ার করে। ভিডিও শেয়ারিং অ্যাপটি openTypedAssetFileDescriptor ব্যবহার করে ভিডিও ফাইলটি খোলে, উল্লেখ করে যে এটি তার মিডিয়া ক্ষমতাগুলিতে HEVC সমর্থন করে না। এটি ট্রান্সকোডিং প্রক্রিয়া শুরু করে এবং একবার সম্পূর্ণ হয়ে গেলে, ফাইলটি ক্লাউডের একটি সার্ভারে আপলোড করা হয়।
অঘোষিত ফর্ম্যাট
অসমর্থিত ঘোষিত সকল ফর্ম্যাটের জন্য সামঞ্জস্যপূর্ণ মিডিয়া ট্রান্সকোডিং সক্ষম করা হয়েছে এবং সমর্থিত ঘোষিত সকল ফর্ম্যাটের জন্য অক্ষম করা হয়েছে। ঘোষিত নয় এমন অন্যান্য ফর্ম্যাটের জন্য, প্ল্যাটফর্মটি ট্রান্সকোড করবে কিনা তা সিদ্ধান্ত নেয়। অ্যান্ড্রয়েড ১২-তে সমস্ত অঘোষিত ফর্ম্যাটের জন্য ট্রান্সকোডিং অক্ষম করা হয়েছে। ভবিষ্যতে নতুন ফর্ম্যাটের জন্য এই আচরণ পরিবর্তন হতে পারে।
ডেভেলপার বিকল্পগুলি
অ্যান্ড্রয়েডের ডিফল্ট ট্রান্সকোডিং আচরণকে ওভাররাইড করতে আপনি নিম্নলিখিত ডেভেলপার বিকল্পগুলি ব্যবহার করতে পারেন:
ট্রান্সকোডিং ডিফল্ট ওভাররাইড করুন এই সেটিংটি নির্ধারণ করে যে প্ল্যাটফর্মটি স্বয়ংক্রিয় ট্রান্সকোডিং নিয়ন্ত্রণ করে কিনা। যখন ওভাররাইড সক্ষম করা হয়, তখন প্ল্যাটফর্মের ডিফল্টগুলি উপেক্ষা করা হয় এবং ট্রান্সকোডিং সক্ষম করার সেটিং স্বয়ংক্রিয় ট্রান্সকোডিং নিয়ন্ত্রণ করে। এই বিকল্পটি ডিফল্টরূপে অক্ষম থাকে।
ট্রান্সকোডিং সক্ষম করুন এই সেটিংটি অঘোষিত ফর্ম্যাটগুলি স্বয়ংক্রিয়ভাবে ট্রান্সকোড করা হবে কিনা তা নির্দিষ্ট করে। এটি ডিফল্টরূপে সক্ষম করা হয়, তবে এটি কেবল তখনই কার্যকর হয় যদি ওভাররাইড ট্রান্সকোডিং ডিফল্টগুলিও সক্ষম করা থাকে।
ধরে নিন অ্যাপগুলি আধুনিক ফর্ম্যাট সমর্থন করে । এই সেটিংটি নিয়ন্ত্রণ করে যখন অ্যাপটি একটি অঘোষিত ফর্ম্যাট চালানোর চেষ্টা করে তখন কী ঘটে। এটি তখন ঘটে যখন ম্যানিফেস্ট ঘোষণা করে না যে অ্যাপটি কোনও নির্দিষ্ট ফর্ম্যাট সমর্থন করে কিনা, অথবা Google সার্ভার-সাইড ফোর্স-ট্রান্সকোড তালিকায় অ্যাপটি যোগ করেনি। যখন সেটিংটি সক্ষম থাকে, তখন অ্যাপটি ট্রান্সকোড করে না, যখন এটি অক্ষম থাকে, তখন অ্যাপটি ট্রান্সকোড করে। এই বিকল্পটি ডিফল্টরূপে সক্রিয় থাকে।
ট্রান্সকোডিং বিজ্ঞপ্তি দেখান যখন সক্ষম করা থাকে, তখন একটি অসমর্থিত মিডিয়া ফাইল পড়ার মাধ্যমে ট্রান্সকোডিং ট্রিগার হলে অ্যাপটি ট্রান্সকোডিং অগ্রগতির বিজ্ঞপ্তি প্রদর্শন করে। এই বিকল্পটি ডিফল্টরূপে সক্ষম থাকে।
ট্রান্সকোডিং ক্যাশে অক্ষম করুন যদি সক্ষম করা থাকে, তাহলে ট্রান্সকোডিং প্রয়োজন এমন অ্যাপগুলি ট্রান্সকোডিং ক্যাশে ব্যবহার করে না। এটি ডেভেলপমেন্টের সময় একটি অসমর্থিত মিডিয়া ফাইলে সহজেই ট্রান্সকোডিং ট্রিগার করতে সহায়ক হতে পারে, তবে ডিভাইসের কর্মক্ষমতা খারাপ হতে পারে। এই বিকল্পটি ডিফল্টরূপে অক্ষম করা থাকে।