ভিডিও শেয়ার করার জন্য সেরা অনুশীলন

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

করণীয় প্রধান জিনিসটি হল একটি ধ্রুবক রেজোলিউশন বজায় রাখা এবং ভিডিও শেয়ার করার প্রস্তুতির সময় যতক্ষণ সম্ভব ভিডিওর গুণমান যতটা সম্ভব উচ্চ রাখা।

শেয়ারিং পাইপলাইন

চিত্র 1 একটি ভিডিও ভাগ করার জন্য একটি সাধারণ প্রবাহকে চিত্রিত করে:

ভিডিও পাইপলাইন ভাগ করা চিত্র 1. ভিডিও শেয়ারিং পাইপলাইন।

পাইপলাইনে এই পদক্ষেপগুলি অন্তর্ভুক্ত রয়েছে:

  1. একটি ভিডিও ক্যাপচার এবং এনকোড করুন, সম্ভবত ক্যাপচারের সময় প্রভাব যোগ করুন। বিকল্পভাবে, ব্যবহারকারী এই ধাপটি এড়িয়ে যেতে পারেন এবং স্টোরেজ থেকে একটি ভিডিও নির্বাচন করতে পারেন যা অন্য অ্যাপ থেকে আগে থেকে রেকর্ড করা হয়েছে।
  2. ভিডিওটি সম্পাদনা করুন, ফিল্টার করুন, স্পর্শ করুন বা অন্যথায় প্রক্রিয়া করুন৷
  3. ট্রান্সকোডিংয়ের প্রস্তুতির জন্য ভিডিওটিকে স্কেল বা রিসাইজ করুন।
  4. শেয়ার করার জন্য ভিডিওটি ট্রান্সকোড করুন। ধাপ 2-এ ফিল্টারিং প্রায়ই এই ধাপের অংশ হিসেবে প্রয়োগ করা হয়।

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

সুপারিশ

সারণী 1 ভিডিও মানের জন্য পাঁচটি প্রধান পরামিতি দেখায় এবং নির্দেশ করে যে কোন ধাপগুলি সেগুলি ব্যবহার করতে পারে৷

প্যারামিটার ক্যাপচার শেয়ার করুন
প্রোফাইল Y Y
রেজোলিউশন Y Y
বিটরেট Y Y
কোয়ান্টাইজেশন প্যারামিটার (QP) (কদাচিৎ) Y
খ ফ্রেম এন Y

সারণী 1. প্রধান পরামিতি যা ভিডিওর গুণমান নির্ধারণ করে

প্রোফাইল

আরও ভাল ফলাফলের জন্য, নির্দিষ্ট কোডেক দ্বারা প্রদত্ত আরও উন্নত প্রোফাইলগুলি ব্যবহার করুন৷ AVC এনকোডিংয়ের জন্য, হাই প্রোফাইল এবং লেভেল 4 নির্বাচন করুন।

রেজোলিউশন, ক্রপিং এবং স্কেলিং

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

  • চূড়ান্ত শেয়ারিং রেজোলিউশনের মতো অন্তত বড় একটি রেজোলিউশন বেছে নিন।
  • ক্যাপচার রেজোলিউশনটি শেয়ারিং রেজোলিউশনের বেশি হওয়া উচিত নয় যদি না সমস্ত মধ্যবর্তী পদক্ষেপগুলি বড় রেজোলিউশনকে সমর্থন করার জন্য ডিজাইন করা হয় (যেমন প্রাথমিক ক্যাপচারের সময় উচ্চতর বিটরেট)।

    • যদি শেয়ারিং এনকোডিং একটি 720x1280 রেজোলিউশন তৈরি করে, আমরা একটি 720x1280 ক্যাপচার রেজোলিউশনের সুপারিশ করি৷
    • যদি ক্যাপচার এবং শেয়ারিংয়ের মধ্যবর্তী ধাপে ক্রপিং অন্তর্ভুক্ত থাকে, তাহলে একটি উচ্চতর ক্যাপচার রেজোলিউশন যেমন 1080x1920 ব্যবহার করুন এবং অতিরিক্ত পিক্সেলগুলি পরিচালনা করতে ক্যাপচার বিটরেট বাড়ান।
  • চরম ক্রপিং এর ফলে একটি নিম্ন মানের ছবি দেখা যায়, বিশেষ করে যদি ক্রপ করা ছবিকে উচ্চতর করা হয়।

  • কম রেজোলিউশন থেকে উচ্চ রেজোলিউশনে আপস্কেলিং এড়িয়ে চলুন। আপস্কেলিং এমন বিশদ তৈরি করার চেষ্টা করে যা উপস্থিত নেই। শুরু থেকেই পছন্দসই উচ্চতর রেজোলিউশন বহন করুন।

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

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

বিটরেট রেজোলিউশন
5+ এমবিপিএস 1080x1920
1.5 - 5+ Mbps 720x1280
1.5 Mbps বা তার কম SD-সমতুল্য। 9:16 অনুপাতের একই পিক্সেল সংখ্যা প্রায় 416x736

সারণি 2. বিটরেট বনাম রেজোলিউশন

অনেক জনপ্রিয় অ্যাপ 720p বা তার কম রেজোলিউশনে ভিডিও শেয়ার করে। ডেটা নির্দেশ করে যে 720p রেজোলিউশন হল 1.5 এবং 5 Mbps-এর মধ্যে বিটরেট লক্ষ্যগুলির জন্য একটি উপযুক্ত পছন্দ৷

বিটরেট

রেকর্ডিং

একটি উচ্চতর এনকোডিং বিটরেট ব্যবহার করা ভিডিও মানের সবচেয়ে বড় উন্নতি প্রদান করে। আমরা নেটিভ ক্যামেরা অ্যাপের সাথে মেলে এমন বিটরেট বেছে নেওয়ার পরামর্শ দিই। একটি 720x1280 রেজোলিউশনের জন্য, আমরা 10 Mbps এর একটি ক্যাপচার বিটরেট সুপারিশ করি৷

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

আপনি চূড়ান্ত ট্রান্সকোডিং ধাপে বিটরেট কমাতে পারেন, যেমনটি টেবিল 2 এ দেখানো হয়েছে।

শেয়ারিং

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

এনকোডিং প্রোফাইল, বি-ফ্রেম এবং কিউপি বাউন্ডিং মানগুলির পছন্দও এই পর্যায়ে ক্যাপচারের সময় থেকে বেশি গুরুত্বপূর্ণ।

ভাল ভিজ্যুয়াল কোয়ালিটি নিশ্চিত করতে আমরা 4-5 Mbps (720x1280 রেজোলিউশনের জন্য) এর মধ্যে একটি বিটরেট সুপারিশ করি।

কোয়ান্টাইজেশন প্যারামিটার (QP)

Android 12 এবং উচ্চতর সংস্করণে, QP কীগুলি মানসম্মত এবং MediaFormat API এবং NDK মিডিয়া লাইব্রেরিতে উপলব্ধ। পূর্ববর্তী অ্যান্ড্রয়েড সংস্করণগুলিতে, MediaFormat কনফিগারেশনে বিক্রেতা-নির্দিষ্ট কী ব্যবহার করে শুধুমাত্র ফ্রেমওয়ার্ক ফাংশনের মাধ্যমে QP ম্যানিপুলেশন উপলব্ধ।

রেকর্ডিং

ভিডিও ক্যাপচারের সময়, QP সেটিংসের পরিবর্তে বিটরেট নিয়ন্ত্রণ ব্যবহার করুন, যা সবসময় পাওয়া যায় না।

আমরা 10Mbps (720x1280 এর জন্য) ক্যাপচার বিটরেটের জন্য QP সেটিংস সামঞ্জস্য করার পরামর্শ দিই না। যদি ক্যাপচার বিটরেট উল্লেখযোগ্যভাবে কম হয়, 720x1280-এর জন্য 5 Mbps-এর নিচে, 40-এর একটি QP সেটিং বর্ধিত মানের মধ্যে একটি ভাল সমঝোতা, কোডেককে টার্গেট বিটরেটকে খুব বেশি বার-শুট করতে বাধ্য না করে।

শেয়ারিং

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

আপনি কম সীমাবদ্ধ (উচ্চতর) সর্বাধিক QP বাউন্ডের সাথে শেয়ার করার জন্য ভিডিওটিকে পুনরায় এনকোড করে বিটরেট বৃদ্ধি সীমিত করতে পারেন৷ এটি কোডেককে মানের ত্যাগ এবং ভিডিওর অন্যান্য অংশ সংরক্ষণ করার জন্য আরও স্বাধীনতা দেয়৷ আপনি শেয়ার করার জন্য ভিডিওটিকে পুনরায় এনকোড করতে পারেন কারণ এটি একটি ট্রান্সকোডিং অপারেশন; আপনি যে ভিডিওটি ভাগ করতে চান তা আপনি ইতিমধ্যেই ধারণ করেছেন৷

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

বি-ফ্রেম এবং এনকোডিং প্রোফাইল

শুধুমাত্র শেয়ারিং ধাপের সময় B-ফ্রেম ব্যবহার করার কথা বিবেচনা করুন, এবং শুধুমাত্র Android 10 বা উচ্চতর সংস্করণ চালানোর সময়।

CodecCapabilities ব্যবহার করে অ্যাপগুলির সমর্থিত এনকোডিং প্রোফাইলগুলি পরীক্ষা করা উচিত, যেহেতু সমস্ত ডিভাইস প্রধান বা উচ্চ প্রোফাইল সমর্থন করে না। AVC এনকোডার দ্বারা সমর্থিত সর্বোচ্চ প্রোফাইল ব্যবহার করুন: উচ্চ > প্রধান > বেসলাইন। সবচেয়ে নিরাপদ ফলাফলের জন্য, বেসলাইন প্রোফাইল ব্যবহার করার সময় B-ফ্রেমগুলি ( KEY_LATENCY বা KEY_MAX_B_FRAMES ) কনফিগার করবেন না কারণ কিছু এনকোডার কনফিগারেশন ব্যর্থ হতে পারে৷

নিম্নলিখিত কোড বিভাগগুলি একটি 'MediaFormat format' অনুমান করে যা AVC এনকোডার কনফিগার করতে ব্যবহার করা হবে

অ্যান্ড্রয়েড 10

API 29 বা উচ্চতর

সর্বোচ্চ সমর্থিত প্রোফাইল ব্যবহার করুন এবং B-ফ্রেম প্যারামিটার 1 এ সেট করুন:

format.setInt32(KEY_PROFILE, AVCProfileHigh);
format.setInt32(KEY_MAX_B_FRAMES, 1);

এই পরিস্থিতিতে KEY_LATENCY সেট করবেন না।

অ্যান্ড্রয়েড 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 মান 1-এর পরিবর্তে 2 সেট করে B-ফ্রেম সক্ষম করতে পারেন৷ এটি কোডেককে B-ফ্রেম তৈরি করতে অনুমতি দেবে৷

Android 7.1 এবং তার আগের

API 25 এবং তার আগের

সবচেয়ে নিরাপদ ফলাফলের জন্য বেসলাইন প্রোফাইল ব্যবহার করুন।

format.setInt32(KEY_PROFILE, AVCProfileBaseline);

সংস্করণ 7 এর আগে, Android AOSP শুধুমাত্র বেসলাইন প্রোফাইল সমর্থন করে। যাইহোক, সম্ভবত কিছু ডিভাইসে OEMs একটি প্রধান/হাই প্রোফাইল সক্ষম করেছে, সম্ভবত একটি বিক্রেতা-নির্দিষ্ট প্রোফাইল ব্যবহার করে।

যদি আপনার অ্যাপ MediaMuxer ব্যবহার না করে, তাহলে কোডেক সমর্থন করলে আপনি প্রধান বা উচ্চ প্রোফাইল ব্যবহার করতে পারেন। B- ফ্রেমের সংখ্যা নিয়ন্ত্রণ করার জন্য কোনো পাবলিক ফরম্যাট কী নেই।

HDR থেকে SDR ট্রান্সকোড করতে ট্রান্সফরমার মডিউল ব্যবহার করুন

Android 13 (API লেভেল 33) দিয়ে শুরু করে, HDR সমর্থন করে না এমন অ্যাপ, পরিষেবা এবং ডিভাইসে HDR কন্টেন্ট শেয়ার করতে আমরা Jetpack Media3 এর ট্রান্সফরমার মডিউল ব্যবহার করার পরামর্শ দিই। ট্রান্সফরমার মডিউলটি একটি ইনপুট এইচডিআর ভিডিও স্ট্রিমকে এসডিআর-এ টোন-ম্যাপিং করে এবং ফলাফলটিকে MP4 হিসাবে সংরক্ষণ করে, যা বিস্তারিত বা চিত্রের উজ্জ্বলতা হ্রাস না করে সফল প্লেব্যাক সক্ষম করে।

দ্রষ্টব্য : Android 12 (API স্তর 32) থেকে Android 7.0 (API স্তর 24) এর মধ্যে সিস্টেম সংস্করণগুলিকে টার্গেট করা ডিভাইসগুলিতে, ট্রান্সফরমার মডিউলটি ভিন্নভাবে কাজ করে৷ যদি ডিভাইসটি HDR সমর্থন করে, তাহলে আপনার অ্যাপ টোন-ম্যাপিং ছাড়াই কন্টেন্ট প্লে ব্যাক করে। যদি ডিভাইসটি HDR সমর্থন না করে, তাহলে এটি একটি ত্রুটি ছুড়ে দেয় যা নির্দেশ করে যে HDR টোন-ম্যাপিং সমর্থিত নয়।

নিম্নলিখিত কোডটি একটি ট্রান্সফরমার সেট আপ করে যা SDR-তে ইনপুটকে টোন করে এবং ইনপুট ফর্ম্যাটে (যেমন H.264/AVC) পুনরায় এনকোড করে:

কোটলিন

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();

টোন ম্যাপিং কার্যকারিতা চেষ্টা করতে, ট্রান্সফরমার ডেমো অ্যাপটি দেখুন।

আপনি MediaCodec ব্যবহার করে টোন ম্যাপিং সেট আপ করতে পারেন, যদিও বাস্তবায়ন আরও জটিল। আরও তথ্যের জন্য, MediaCodec রেফারেন্স ডকুমেন্টেশন দেখুন।