একসাথে একাধিক ক্যামেরা স্ট্রিম করা

Android, ডিভাইসকে ক্যামেরা ডিভাইসের কনকারেন্ট স্ট্রিমিং সাপোর্ট করার অনুমতি দেয়। যেমন, এটি কোনও ডিভাইসকে একই সাথে ফ্রন্ট ও ব্যাক ক্যামেরা, দুটিই অপারেট করতে দেয়। Android 11 থেকে, Camera2 API-তে নিম্নলিখিত পদ্ধতিগুলি অন্তর্ভুক্ত রয়েছে যা অ্যাপগুলি কল করে নির্ধারণ করতে পারে যে ক্যামেরাগুলি কনকারেন্ট স্ট্রিমিং এবং সমর্থিত স্ট্রিম কনফিগারেশন সমর্থন করে কিনা।

  • getConcurrentCameraIds: বর্তমানে কানেক্ট করা ক্যামেরা ডিভাইসের আইডেন্টিফায়ারের কম্বিনেশনের সেট পায় যা একইসাথে ক্যামেরা ডিভাইস সেশন কনফিগার করাকে সাপোর্ট করে।
  • isConcurrentSessionConfigurationSupported: প্রদান করা ক্যামেরা ডিভাইস ও সেগুলির সংশ্লিষ্ট সেশন কনফিগারেশন একই সাথে কনফিগার করা যায় কিনা তা চেক করে।

কনকারেন্ট স্ট্রিমিংয়ের সময় কাজ করতে হবে এমন বাধ্যতামূলক স্ট্রিম কম্বিনেশনের একটি সেট SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS প্রপার্টির মধ্যে ক্যামেরা ডিভাইসের ক্যামেরা ক্যারেক্টারিস্টিকসের মাধ্যমে অন্তর্ভুক্ত করা হয়।

getConcurrentStreamingCameraIds()-এর মাধ্যমে বিজ্ঞাপন দেওয়া প্রতিটি ক্যামেরা ডিভাইসকে কনকারেন্ট স্ট্রিমের জন্য নিম্নলিখিত গ্যারান্টিযুক্ত কনফিগারেশন অবশ্যই সাপোর্ট করতে হবে।

টার্গেট ১ টার্গেট ২
ধরন সর্বাধিক সাইজ ধরন সর্বাধিক সাইজ ব্যবহারের নমুনা
YUV s1440p অ্যাপ-মধ্যস্থ ভিডিও বা ছবি প্রসেস করা
PRIV s1440p ইন-অ্যাপ ভিউফাইন্ডার বিশ্লেষণ
JPEG s1440p ভিউফাইন্ডার স্টিল ইমেজ ক্যাপচার করা যায় না
YUV / PRIV s720p JPEG s1440p স্ট্যান্ডার্ড স্টিল ইমেজিং
YUV / PRIV s720p YUV / PRIV s1440p অ্যাপ-মধ্যস্থ ভিডিও বা প্রিভিউ সহ প্রসেসিং

MONOCHROME ক্ষমতা সম্পন্ন ডিভাইস (CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES এর মধ্যে CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME পড়ে) যেগুলিতে Y8 কাজ করে সেগুলিতে অবশ্যই সব গ্যারান্টিযুক্ত স্ট্রিম কম্বিনেশনে YUV স্ট্রিমের পরিবর্তে Y8 কাজ করতে হবে।

s720p বলতে ৭২০ পিক্সেল (১২৮০ x ৭২০) অথবা StreamConfigurationMap.getOutputSizes()-এর মাধ্যমে রিটার্ন করা নির্দিষ্ট ফর্ম্যাটের জন্য কাজ করে এমন সর্বাধিক রেজোলিউশন বোঝানো হয়। s1440p বলতে ১৪৪০p (১৯২০ x ১৪৪০) অথবা StreamConfigurationMap.getOutputSizes()-এর মাধ্যমে ফেরত আসা নির্দিষ্ট ফর্ম্যাটের জন্য কাজ করে এমন সর্বাধিক রেজোলিউশন বোঝানো হয়। যেসব ডিভাইসের ক্ষমতায় ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE অন্তর্ভুক্ত নয়, সেগুলিকে একইসাথে অপারেশন চলাকালীন অন্তত একটি Y16 স্ট্রিম, sVGA রেজোলিউশন সহ Dataspace::DEPTH সাপোর্ট করতে হবে, যেখানে sVGA হল নিম্নলিখিত দুটি রেজোলিউশনের মধ্যে ছোটটি:

  • প্রদত্ত ফর্ম্যাটের জন্য সর্বাধিক আউটপুট রেজোলিউশন
  • ৬৪০ x ৪৮০

প্রয়োগ

কোনও ডিভাইসের ক্যামেরা একই সাথে একাধিক স্ট্রিম করতে পারে কিনা তা নির্ধারণ করার জন্য অ্যাপকে কোয়েরি করার অনুমতি দিতে, ICameraProvider@2.6 HAL ইন্টারফেস প্রয়োগ করুন, যার মধ্যে নিম্নলিখিত পদ্ধতিগুলি অন্তর্ভুক্ত রয়েছে:

ICameraProvider@2.6HAL ইন্টারফেসের রেফারেন্স ইমপ্লিমেন্টেশনের জন্য, EmulatedCameraProviderHWLImpl.cpp-এ এমুলেটেড ক্যামেরা HAL লাইব্রেরি দেখুন।

যাচাইকরণ

এই ফিচারটি আপনার প্রয়োগ করা ঠিকমতো কাজ করছে কিনা তা পরীক্ষা করে দেখতে, ConcurrentCameraTest.java CTS পরীক্ষা ব্যবহার করুন। এছাড়াও, এমন একটি অ্যাপ ব্যবহার করে পরীক্ষা করুন যা একাধিক ক্যামেরা খোলে এবং সেগুলিকে একসাথে অপারেট করে।

রিসোর্স অ্যালোকেশন সংক্রান্ত সমস্যা

ক্যামেরা HAL যদি ক্যামেরা ডিভাইসের একসাথে অপারেশনের জন্য বিজ্ঞাপন দেয়, তাহলে রিসোর্স অ্যালোকেশন সংক্রান্ত সমস্যা হতে পারে, বিশেষ করে সেইসব ক্ষেত্রে যেখানে ফোনে একসাথে সামনের ও পিছনের (বা অন্যান্য) ক্যামেরা স্ট্রিম করার জন্য যথেষ্ট ইমেজ সিগন্যাল প্রসেসর (ISP) রিসোর্স থাকে, কিন্তু সম্পূর্ণ ক্ষমতা ব্যবহার করার জন্য যথেষ্ট রিসোর্স থাকে না। এই ক্ষেত্রে, ক্যামেরা HAL-কে প্রতিটি ক্যামেরা ডিভাইসে সীমিত হার্ডওয়্যার রিসোর্স বরাদ্দ করতে হবে।

পরিস্থিতির উদাহরণ

নিম্নলিখিত পরিস্থিতি এই সমস্যাটি দেখায়।

সমস্যা

ডিভাইসে নিম্নলিখিত কনফিগারেশন আছে:

  • ক্যামেরা আইডি 0 হল একটি লজিক্যাল ক্যামেরা যা ওয়াইড ও আল্ট্রাওয়াইড ক্যামেরার মাধ্যমে ব্যাক-আপ নেওয়া হয়, যার প্রত্যেকটি একটি করে ISP রিসোর্স নেয়।
  • ক্যামেরা আইডি 1 হল এমন একটি ক্যামেরা যা একটি ISP রিসোর্স নেয়।

ডিভাইসে (ফোন) দুটি ISP আছে। ক্যামেরা আইডি 0 খোলা থাকলে এবং সেশন কনফিগার করা থাকলে, এটি সম্ভব যে ক্যামেরা HAL দুটি ISP রিজার্ভ করে, কারণ আল্ট্রাওয়াইড ও ওয়াইড ক্যামেরা ব্যবহার করা হবে বলে অনুমান করা হয়।

এমনটি হলে, ফ্রন্ট ক্যামেরা (ID 1) কোনও স্ট্রিম কনফিগার করতে পারবে না কারণ দুটি ISP ব্যবহার করা হচ্ছে।

সমাধান

এই সমস্যার সমাধান করতে, সেশন কনফিগার করার আগে ফ্রেমওয়ার্ক দুটি ক্যামেরা আইডি 0 ও 1 খুলতে পারে, যাতে ক্যামেরা HAL-কে রিসোর্স অ্যালোকেট করার ব্যাপারে ইঙ্গিত দেওয়া যায় (কারণ এখন এটি ক্যামেরাগুলির কনকারেন্ট অপারেশন আশা করে)। তবে, এর ফলে কার্যকারিতা সীমিত হয়ে যেতে পারে, যেমন, জুম সম্পূর্ণ জুম রেঞ্জ অনুপাত ম্যানেজ করতে নাও পারতে পারে (কারণ ফিজিক্যাল ক্যামেরা আইডি পরিবর্তন করা সমস্যাজনক হতে পারে)।

এই সমাধান প্রয়োগ করতে, provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds-এ নিম্নলিখিত আপডেট করুন।

  • ক্যামেরা একসাথে চালানোর জন্য, ক্যামেরা ফ্রেমওয়ার্ককে অবশ্যই ক্যামেরা ডিভাইসে কোনও সেশন কনফিগার করার আগে ক্যামেরা ডিভাইস (@3.2::ICameraDevice::open) খুলতে হবে। এটি ক্যামেরা প্রদানকারীদের সেই অনুযায়ী রিসোর্স বরাদ্দ করার অনুমতি দেয়।

  • সম্পূর্ণ জুম রেঞ্জ রেশিও ম্যানেজ করতে না পারার সমস্যা সমাধান করতে, নিশ্চিত করুন যে ক্যামেরা অ্যাপ, একই সাথে ক্যামেরা ব্যবহার করার সময়, সম্পূর্ণ ZOOM_RATIO_RANGE-এর পরিবর্তে শুধুমাত্র 1x এবং MAX_DIGITAL_ZOOM-এর মধ্যে ZOOM_RATIO কন্ট্রোল সেটিং ব্যবহার করার গ্যারেন্টি দেয় (এটি অভ্যন্তরীণভাবে ফিজিক্যাল ক্যামেরা পরিবর্তন করা আটকায়, যার জন্য সম্ভাব্যভাবে আরও ISP-এর প্রয়োজন হয়)।

testDualCameraPreview সংক্রান্ত সমস্যা

উপরে উল্লিখিত আপডেটগুলি করলে, MultiViewTest.java#testDualCameraPreview টেস্টের মাধ্যমে অনুমোদিত আচরণে সমস্যা হতে পারে।

পরীক্ষা testDualCameraPreview সব ক্যামেরা খোলার পরেই সেশন কনফিগার করে না। এটি এই ক্রম অনুসরণ করে:

for each camera  in cameraDevices :
  device = openCamera(camera)
     createCaptureSession(device);

তবে, এটি ERROR_MAX_CAMERAS_IN_USE [1]-এর সাথে ক্যামেরা ওপেন করার ব্যর্থতা সহ্য করে। থার্ড-পার্টি অ্যাপ এই আচরণের উপর নির্ভর করতে পারে।

কারণ, সেশন কনফিগার করার আগে, ক্যামেরা HAL, একসাথে অপারেশন করার জন্য খোলা ক্যামেরা আইডির সম্পূর্ণ সেটটি জানতে পারবে না। এর ফলে, হার্ডওয়্যার রিসোর্স (যদি সেগুলির জন্য কোনও প্রতিযোগিতা থাকে) বরাদ্দ করা কঠিন হতে পারে।

এই সমস্যার সমাধান করতে, একই সাথে স্ট্রিমিং কাজ করার পাশাপাশি পুরনো ভার্সনের সাথে মানানসই হওয়া বজায় রাখতে, ক্যামেরা HAL-কে openCamera কল ব্যর্থ করতে হবে ERROR_MAX_CAMERAS_IN_USE যদি সেগুলি একই সাথে চালু থাকা সব ক্যামেরার জন্য সম্পূর্ণ স্ট্রিম কনফিগারেশন কাজ করাতে না পারে।