অনেকেই Android ডিভাইস ব্যবহার করে ভিডিও শেয়ার করেন। শেয়ারিং অ্যাপের মাধ্যমে প্রসেস করার কারণে, রিসিভ করা ভিডিওর কোয়ালিটি প্রায়শই আসল ভিডিওর থেকে খারাপ হয়। এই ডকুমেন্ট থেকে জানা যাবে যে কীভাবে শেয়ার করা ভিডিওর কোয়ালিটি অপ্টিমাইজ করা যায় এবং ভিডিও প্রসেস করার সময় কিছু সাধারণ ভুল এড়ানো যায়। HDR ভিডিও কন্টেন্ট শেয়ার করার জন্য অপ্টিমাইজ করতে, এই পৃষ্ঠায় HDR থেকে SDR-এ ট্রান্সকোড করতে ট্রান্সফর্মার মডিউল ব্যবহার করুন বিকল্প দেখুন।
ভিডিও শেয়ার করার জন্য প্রস্তুত করার সময়, সবচেয়ে গুরুত্বপূর্ণ কাজ হল, ভিডিওর রেজোলিউশন ও কোয়ালিটি যতটা সম্ভব ভালো রাখা এবং তা যেন ভিডিওর শুরু থেকে শেষ পর্যন্ত একই থাকে।
শেয়ারিং পাইপলাইন
ছবি ১-এ ভিডিও শেয়ার করার সাধারণ ফ্লো দেখানো হয়েছে:
ছবি ১. ভিডিও শেয়ারিং পাইপলাইন।
পাইপলাইনে এইসব ধাপ অন্তর্ভুক্ত:
- ভিডিও ক্যাপচার ও এনকোড করুন, ক্যাপচার করার সময় এফেক্ট যোগ করতে পারেন। অন্যথায়, ব্যবহারকারী এই ধাপটি এড়িয়ে যেতে এবং স্টোরেজ থেকে এমন একটি ভিডিও বেছে নিতে পারবেন যা অন্য অ্যাপ থেকে আগে রেকর্ড করা হয়েছে।
- ভিডিও এডিট, ফিল্টার, টাচ আপ বা অন্য কোনও উপায়ে প্রসেস করা।
- ট্রান্সকোডিংয়ের জন্য ভিডিও স্কেল বা ছোট বড় করুন।
- শেয়ার করার জন্য ভিডিও ট্রান্সকোড করুন। ধাপ ২-এ ফিল্টারিং প্রায়ই এই ধাপের অংশ হিসেবে প্রয়োগ করা হয়।
পাইপলাইনে দুটি ধাপ আছে যেখানে আপনার কাছে ভিডিওর কোয়ালিটি নির্ধারণকারী প্যারামিটার সেট করার সুযোগ আছে: প্রাথমিক রেকর্ডিংয়ের সময় এনকোডিং এবং শেয়ার করার আগে ট্রান্সকোডিং। এছাড়াও, চূড়ান্ত ট্রান্সকোড ধাপের আগে আপনাকে ভিডিওর স্কেল পরিবর্তন করতে হতে পারে, যা কোয়ালিটির উপরও প্রভাব ফেলতে পারে।
সাজেশন
সারণী ১-এ ভিডিও কোয়ালিটির পাঁচটি প্রধান প্যারামিটার দেখানো হয়েছে এবং কোন কোন ধাপে সেগুলি ব্যবহার করা যেতে পারে তা উল্লেখ করা হয়েছে।
| প্যারামিটার | ক্যাপচার করুন | শেয়ার করুন |
| প্রোফাইল | Y | Y |
| রেজোলিউশন | Y | Y |
| বিট রেট | Y | Y |
| কোয়ান্টাইজেশন প্যারামিটার (QP) | (খুবই কম) | Y |
| B ফ্রেম | না | Y |
টেবিল ১. ভিডিওর কোয়ালিটি নির্ধারণকারী প্রধান প্যারামিটার
প্রোফাইল
আরও ভালো ফলাফলের জন্য, নির্দিষ্ট কোডেক দ্বারা প্রদান করা আরও উন্নত প্রোফাইল ব্যবহার করুন। AVC এনকোডিংয়ের জন্য, হাই প্রোফাইল ও লেভেল ৪ বেছে নিন।
রেজোলিউশন, ক্রপ করা ও স্কেলিং
শেয়ার করার জন্য ট্রান্সকোডিং করার আগে স্কেলিং ধাপে আপনি ক্যাপচার করা ভিডিওর প্রাথমিক রেজোলিউশন পরিবর্তন করতে পারবেন, তবে স্কেলিং করলে ভিডিওর কোয়ালিটি খারাপ হতে পারে। আমরা সাজেস্ট করি যে আপনি স্কেলিং এড়িয়ে যান এবং প্রাথমিক এনকোডিংয়ের জন্য এমন রেজোলিউশন বেছে নিন যা আপনি পুরো পাইপলাইন জুড়ে ব্যবহার করতে পারবেন। এছাড়াও মনে রাখবেন যে, খুব বেশি ক্রপ করলে ছবির কোয়ালিটি খারাপ হয়ে যায়, বিশেষ করে আপনি যদি ক্রপ করা ছবি আপস্কেল করেন। এই নির্দেশিকা ফলো করুন:
- শেয়ার করার জন্য চূড়ান্ত রেজোলিউশনের সমান বা তার থেকে বেশি রেজোলিউশন বেছে নিন।
ক্যাপচার রেজোলিউশন শেয়ারিং রেজোলিউশনের থেকে অনেক বেশি হওয়া উচিত নয়, যদি না সমস্ত মধ্যবর্তী ধাপগুলি বড় রেজোলিউশন সাপোর্ট করার জন্য ডিজাইন করা হয় (যেমন প্রাথমিক ক্যাপচারের সময় বেশি বিটরেট)।
- শেয়ারিং এনকোডিংয়ের ফলে ৭২০x১২৮০ রেজোলিউশন তৈরি হলে, আমরা ৭২০x১২৮০ ক্যাপচার রেজোলিউশন সাজেস্ট করি।
- ক্যাপচার ও শেয়ার করার মধ্যবর্তী ধাপে ক্রপ করার মতো বিষয় থাকলে, ১০৮০x১৯২০-এর মতো বেশি ক্যাপচার রেজোলিউশন ব্যবহার করুন এবং অতিরিক্ত পিক্সেল ম্যানেজ করতে ক্যাপচার বিটরেট বাড়ান।
ছবি খুব বেশি ক্রপ করলে তার কোয়ালিটি খারাপ হয়ে যায়, বিশেষ করে ক্রপ করা ছবি আপস্কেল করা হলে।
কম রেজোলিউশন থেকে বেশি রেজোলিউশনে আপস্কেল করা এড়িয়ে চলুন। আপস্কেলিং এমন বিবরণ তৈরি করার চেষ্টা করে যা উপস্থিত নেই। শুরু থেকেই কাঙ্খিত উচ্চ রেজোলিউশন ব্যবহার করুন।
আপস্কেল করতে হলে, এনকোডিং প্যারামিটার অ্যাডজাস্ট করুন। যেমন, আপস্কেল করা রেজোলিউশনে পিক্সেলের সংখ্যা দ্বিগুণ হলে, বিটরেটও দ্বিগুণ করুন।
রেজোলিউশন ও বিটরেট একে অপরের সাথে সম্পর্কিত। যেমন, শেয়ারিং পাইপলাইনের মাধ্যমে হাই-রেজোলিউশন ভিডিও ট্রান্সফার করা, যা শেষ পর্যন্ত কম বিটরেটে ট্রান্সকোড করা হয়, সেটি কম রেজোলিউশন দিয়ে শুরু করার চেয়ে কম কোয়ালিটির ছবি তৈরি করে। বিটরেট কমে যাওয়ার সাথে সাথে, ক্রসওভার পয়েন্টে ছোট রেজোলিউশন আরও ভালো ফলাফল দিতে শুরু করে:
| বিট রেট | রেজোলিউশন |
| ৫+ Mbps | ১০৮০x১৯২০ |
| ১.৫ - ৫+ Mbps | 720x1280 |
| ১.৫ Mbps বা তার কম | SD-এর সমতুল্য। ৯:১৬ অ্যাস্পেক্ট রেশিওতে একই পিক্সেল কাউন্ট হল প্রায় ৪১৬x৭৩৬ |
টেবিল ২. বিটরেট বনাম রেজোলিউশন
অনেক জনপ্রিয় অ্যাপ 720p বা তার চেয়ে কম রেজোলিউশনে ভিডিও শেয়ার করে। ডেটা থেকে বোঝা যায় যে ১.৫ থেকে ৫ Mbps বিটরেট টার্গেটের জন্য 720p রেজোলিউশন উপযুক্ত।
বিট রেট
রেকর্ড করা হচ্ছে
আরও বেশি এনকোডিং বিটরেট ব্যবহার করলে ভিডিও কোয়ালিটি সবচেয়ে বেশি উন্নত হয়। আমরা নেটিভ ক্যামেরা অ্যাপের সাথে ম্যাচ করে এমন বিটরেট বেছে নেওয়ার সাজেশন দিই। ৭২০x১২৮০ রেজোলিউশনের জন্য, আমরা ১০ Mbps ক্যাপচার বিটরেট সাজেস্ট করি।
যেহেতু ক্যাপচার এনকোডিং ডিভাইসেই করা হয়, তাই আপনি শেয়ারিং ধাপের বেশিরভাগ ট্রান্সফর্মেশনের ক্ষতিপূরণ করতে, সামান্য নেতিবাচক প্রভাব সহ, আরও বেশি বিটরেট ব্যবহার করতে পারবেন। ফলাফলের বড় ফাইলগুলি শুধুমাত্র অন-ডিভাইস ম্যানিপুলেশনের জন্য ব্যবহার করা হয়।
আপনি চূড়ান্ত ট্রান্সকোডিং ধাপে বিটরেট কমাতে পারেন, যেমনটি সারণী ২-এ দেখানো হয়েছে।
শেয়ার করা
শেয়ার করার সময় বিটরেটের প্রভাব সবচেয়ে বেশি হয়, কারণ এটি আপলোড করা ভিডিওর সাইজের সাথে সরাসরি সম্পর্কিত। ভিডিও কোয়ালিটি, ফাইল ট্রান্সমিশন টাইম ও ক্লাউড স্টোরেজের খরচের মধ্যে একটি ট্রেড-অফ আছে।
ক্যাপচার করার সময় এনকোডিং প্রোফাইল, B-ফ্রেম ও QP বাউন্ডিং ভ্যালু বেছে নেওয়ার চেয়ে এই পর্যায়ে তা বেছে নেওয়া বেশি গুরুত্বপূর্ণ।
আমরা ৪-৫ Mbps (৭২০x১২৮০ রেজোলিউশনের জন্য) বিটরেট সাজেস্ট করি যাতে ভালো ভিজ্যুয়াল কোয়ালিটি নিশ্চিত করা যায়।
কোয়ান্টাইজেশন প্যারামিটার (QP)
Android 12 ও এর পরবর্তী যেকোনও ভার্সনে, QP কী স্ট্যান্ডার্ডাইজ করা হয়েছে এবং
MediaFormat
API ও
NDK মিডিয়া লাইব্রেরিতে উপলভ্য।
Android-এর আগের ভার্সনে, QP ম্যানিপুলেশন শুধুমাত্র ফ্রেমওয়ার্ক ফাংশনের মাধ্যমে উপলভ্য,
যা MediaFormat কনফিগারেশনে ভেন্ডর-নির্দিষ্ট কী ব্যবহার করে।
রেকর্ড করা হচ্ছে
ভিডিও ক্যাপচার করার সময়, QP সেটিংসের পরিবর্তে বিটরেট কন্ট্রোল ব্যবহার করুন, যা সবসময় উপলভ্য থাকে না।
আমরা ১০Mbps ক্যাপচার বিটরেটের জন্য QP সেটিংস অ্যাডজাস্ট করার সাজেশন দিই না (৭২০x১২৮০-এর জন্য)। ক্যাপচার বিটরেট উল্লেখযোগ্যভাবে কম হলে, 720x1280-এর জন্য ৫ Mbps-এর কম, ৪০-এর QP সেটিং হল কোডেককে টার্গেট বিটরেট খুব ঘন ঘন ওভার-শুট করতে বাধ্য না করে উন্নত কোয়ালিটির মধ্যে একটি ভালো সমঝোতা।
শেয়ার করা
আমরা ৪০-এর সর্বাধিক QP বাউন্ড সাজেস্ট করি, বিশেষ করে যখন বিটরেট ৪ Mbps-এর কম হয়। এটি এনকোড করা ভিডিওর জন্য ন্যূনতম কোয়ালিটি নিশ্চিত করলেও, এর ফলে বেশি বিটরেট সহ ফলাফল তৈরি হতে পারে। বিটরেট কতটা বাড়বে তা ভিডিওর জটিলতার উপর নির্ভর করে। যদিও কোনও শেয়ারিং অ্যাপ তৈরি করা ভিডিওর বিটরেটে কিছু তারতম্য সহ্য করতে পারে, তবে এটি একটি নির্দিষ্ট থ্রেশহোল্ডের বাইরে বৃদ্ধি সহ্য করতে পারে না।
আপনি কম বিধিনিষেধযুক্ত (বেশি) সর্বাধিক QP বাউন্ডের সাথে শেয়ার করার জন্য ভিডিওটি আবার এনকোড করে বিটরেট বৃদ্ধি সীমিত করতে পারেন। এর ফলে কোডেক আরও বেশি স্বাধীনতা পায়, যার ফলে কোয়ালিটি কমিয়ে ভিডিওর অন্যান্য অংশ সংরক্ষণ করা যায়। আপনি শেয়ার করার জন্য ভিডিওটি আবার এনকোড করতে পারেন কারণ এটি একটি ট্রান্সকোডিং অপারেশন; আপনি যে ভিডিওটি শেয়ার করতে চান সেটি আগেই ক্যাপচার করেছেন।
এর অসুবিধা হল, এইসব বিভিন্ন প্যারামিটার সহ ট্রান্সকোডিং ধাপের পুনরাবৃত্তি করলে, ভিডিও শেয়ার করতে বেশি সময় লাগে। এই লেটেন্সি কমানোর একটি উপায় হল, আংশিকভাবে ট্রান্সকোড করা ভিডিওটি দেখে সিদ্ধান্ত নেওয়া যে বিটরেট ওভারএজ আপনার সহনশীলতার মধ্যে আছে কিনা। যদি তা না হয়, তাহলে আপনি ট্রান্সকোডিং বন্ধ করে আরও উপযুক্ত QP প্যারামিটার সহ আবার চেষ্টা করতে পারেন।
B-ফ্রেম ও এনকোডিং প্রোফাইল
শুধুমাত্র শেয়ার করার সময় এবং Android 10 বা তার পরবর্তী যেকোনও ভার্সন ব্যবহার করার সময় B-ফ্রেম ব্যবহার করার কথা বিবেচনা করুন।
অ্যাপের উচিত
CodecCapabilities
ব্যবহার করে কাজ করে এমন এনকোডিং প্রোফাইল চেক করা, কারণ সব ডিভাইসে মূল বা হাই প্রোফাইল কাজ করে না। AVC এনকোডারের মাধ্যমে কাজ করে এমন সবচেয়ে উন্নত প্রোফাইল ব্যবহার করুন: High > Main > Baseline. সবচেয়ে নিরাপদ ফলাফলের জন্য,
বেসলাইন প্রোফাইল ব্যবহার করার সময়
B-ফ্রেম (KEY_LATENCY অথবা
KEY_MAX_B_FRAMES)
কনফিগার করবেন না, কারণ কিছু এনকোডার কনফিগার করতে ব্যর্থ হতে পারে।
নিম্নলিখিত কোড সেগমেন্টে ধরে নেওয়া হয়েছে যে AVC এনকোডার কনফিগার করতে
'MediaFormat format' ব্যবহার করা হবে
Android 10
API 29 বা তার পরবর্তী ভার্সন
সবচেয়ে বেশি কাজ করে এমন প্রোফাইল ব্যবহার করুন এবং B-ফ্রেম প্যারামিটার ১-এ সেট করুন:
format.setInt32(KEY_PROFILE, AVCProfileHigh);
format.setInt32(KEY_MAX_B_FRAMES, 1);
এই পরিস্থিতিতে KEY_LATENCY সেট করবেন না।
Android 8, 8.1, এবং 9
APIs 26, 27, 28
সবচেয়ে বেশি কাজ করে এমন প্রোফাইল ব্যবহার করুন, তবে B-ফ্রেম তৈরি করার সুবিধা বন্ধ করে দিন। এই
সিস্টেম ভার্সনে MediaMuxer-এর
কিছু সীমাবদ্ধতা রয়েছে
format.setInt32(KEY_PROFILE, AVCProfileHigh);
format.setInt32(KEY_LATENCY, 1);
KEY_LATENCY ভ্যালু কোডেককে B-ফ্রেম তৈরি করতে বাধা দেয়, তবে এখনও
অন্যান্য কোডেক দক্ষতার সুবিধা নেয়।
আপনার অ্যাপ যদি চূড়ান্ত আউটপুট ফাইল অ্যাসেম্বল করার জন্য MediaMuxer ব্যবহার না করে, তাহলে আপনি
KEY_LATENCY-এর ভ্যালু ১-এর পরিবর্তে ২-এ সেট করে B-ফ্রেম চালু করতে পারেন। এটি কোডেককে B-ফ্রেম তৈরি করার অনুমতি দেবে।
Android 7.1 এবং তার আগের ভার্সন
API 25 এবং তার আগের ভার্সন
সবচেয়ে নিরাপদ ফলাফলের জন্য বেসলাইন প্রোফাইল ব্যবহার করুন।
format.setInt32(KEY_PROFILE, AVCProfileBaseline);
ভার্সন ৭-এর আগে, Android AOSP-তে শুধু বেসলাইন প্রোফাইল কাজ করে। তবে, কিছু ডিভাইসে OEM-এর প্রধান/হাই প্রোফাইল চালু করার সম্ভাবনা আছে, সম্ভবত ভেন্ডর-নির্দিষ্ট প্রোফাইল ব্যবহার করে।
আপনার অ্যাপ MediaMuxer ব্যবহার না করলে, কোডেক সাপোর্ট করলে আপনি প্রধান বা হাই প্রোফাইল ব্যবহার করতে পারবেন। B-ফ্রেমের সংখ্যা নিয়ন্ত্রণ করার জন্য কোনও পাবলিক ফর্ম্যাট কী নেই।
HDR থেকে SDR-এ ট্রান্সকোড করতে ট্রান্সফর্মার মডিউল ব্যবহার করুন
Android 13 (API লেভেল 33) থেকে শুরু করে, আমরা Jetpack Media3-এর Transformer মডিউল ব্যবহার করার সাজেশন দিই, যাতে HDR কন্টেন্ট এমন অ্যাপ, পরিষেবা এবং ডিভাইসে শেয়ার করা যায় যেগুলি HDR সাপোর্ট করে না। ট্রান্সফর্মার মডিউল ইনপুট HDR ভিডিও স্ট্রিমকে SDR-এ টোন-ম্যাপ করে এবং ফলাফলটি MP4 হিসেবে সেভ করে, যা ডিটেল বা ছবির উজ্জ্বলতা না হারিয়ে সফল প্লেব্যাক করতে সাহায্য করে।
মনে রাখবেন: Android 12 (API লেভেল 32) থেকে Android 7.0 (API লেভেল 24) পর্যন্ত সিস্টেম ভার্সন টার্গেট করা ডিভাইসে, ট্রান্সফর্মার মডিউল আলাদাভাবে কাজ করে। ডিভাইসে HDR কাজ করলে, আপনার অ্যাপ টোন-ম্যাপিং ছাড়াই কন্টেন্ট প্লেব্যাক করে। ডিভাইসে HDR কাজ না করলে, এটি একটি সমস্যা দেখায় যা ইঙ্গিত করে যে HDR টোন-ম্যাপিং কাজ করে না।
নিম্নলিখিত কোডটি একটি ট্রান্সফরমার সেট-আপ করে যা ইনপুটকে SDR-এ টোন ম্যাপ করে এবং ইনপুট ফর্ম্যাটে (যেমন H.264/AVC) এটিকে আবার এনকোড করে:
Kotlin
val transformer = Transformer.Builder(context) .setTransformationRequest( TransformationRequest.Builder() .setHdrMode(TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR) .build()) .addListener(/* ... */) .build()
জাভা
Transformer transformer = new Transformer.Builder(context) .setTransformationRequest( new TransformationRequest.Builder() .setHdrMode(TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR) .build()) .addListener(/* ... */) .build();
টোন ম্যাপ করার কার্যকারিতা ব্যবহার করে দেখতে, Transformer ডেমো অ্যাপ দেখুন।
এছাড়াও, আপনি
MediaCodec ব্যবহার করে টোন ম্যাপ করা সেট-আপ করতে পারেন, যদিও এটি প্রয়োগ করা
আরও জটিল। আরও তথ্যের জন্য, MediaCodec রেফারেন্স ডকুমেন্টেশন দেখুন।