অ্যান্ড্রয়েড ডিভাইসগুলোকে একই সাথে একাধিক ক্যামেরার স্ট্রিমিং সমর্থন করার সুযোগ দেয়। উদাহরণস্বরূপ, এর মাধ্যমে একটি ডিভাইসের সামনের এবং পেছনের উভয় ক্যামেরাই একই সময়ে চালু রাখা যায়। অ্যান্ড্রয়েড ১১ থেকে, Camera2 API-তে নিম্নলিখিত মেথডগুলো অন্তর্ভুক্ত করা হয়েছে, যেগুলো অ্যাপগুলো কল করে ক্যামেরাগুলো একই সাথে স্ট্রিমিং সমর্থন করে কিনা এবং কোন কোন স্ট্রিম কনফিগারেশন সমর্থিত, তা নির্ধারণ করতে পারে।
-
getConcurrentCameraIds: বর্তমানে সংযুক্ত ক্যামেরা ডিভাইস আইডেন্টিফায়ারগুলোর সেইসব সংমিশ্রণের সেট প্রদান করে, যেগুলো একই সাথে ক্যামেরা ডিভাইস সেশন কনফিগার করা সমর্থন করে। -
isConcurrentSessionConfigurationSupported: প্রদত্ত ক্যামেরা ডিভাইস সেট এবং তাদের সংশ্লিষ্ট সেশন কনফিগারেশনগুলো একই সাথে কনফিগার করা যাবে কিনা তা পরীক্ষা করে।
একযোগে স্ট্রিমিংয়ের সময় যে বাধ্যতামূলক স্ট্রিম সংমিশ্রণগুলো অবশ্যই সমর্থন করতে হবে, সেগুলো একটি ক্যামেরা ডিভাইসের ক্যামেরা বৈশিষ্ট্যগুলোর মাধ্যমে SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS প্রপার্টিতে অন্তর্ভুক্ত করা হয়।
getConcurrentStreamingCameraIds() এর মাধ্যমে বিজ্ঞাপিত প্রতিটি ক্যামেরা ডিভাইসকে যুগপৎ স্ট্রিমের জন্য নিম্নলিখিত নিশ্চিত কনফিগারেশনগুলো সমর্থন করতে হবে।
| লক্ষ্য ১ | লক্ষ্য ২ | |||
|---|---|---|---|---|
| প্রকার | সর্বোচ্চ আকার | প্রকার | সর্বোচ্চ আকার | নমুনা ব্যবহারের ক্ষেত্র |
| YUV | s1440p | অ্যাপের মধ্যে ভিডিও বা ছবি প্রক্রিয়াকরণ | ||
| PRIV | s1440p | অ্যাপের মধ্যে ভিউফাইন্ডার বিশ্লেষণ | ||
| জেপিইজি | s1440p | ভিউফাইন্ডার ছাড়া স্থির চিত্র তোলা যায় | ||
| যুব / ব্যক্তিগত | s720p | জেপিইজি | s1440p | স্ট্যান্ডার্ড স্থির চিত্রগ্রহণ |
| যুব / ব্যক্তিগত | s720p | যুব / ব্যক্তিগত | s1440p | অ্যাপের মধ্যে ভিডিও বা প্রিভিউ সহ প্রসেসিং |
MONOCHROME সক্ষমতা সম্পন্ন ( CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES মধ্যে CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME অন্তর্ভুক্ত) এবং Y8 সমর্থনকারী ডিভাইসগুলিকে অবশ্যই সমস্ত গ্যারান্টিযুক্ত স্ট্রিম সংমিশ্রণে YUV স্ট্রিমের পরিবর্তে Y8 প্রতিস্থাপন সমর্থন করতে হবে।
s720p বলতে 720p (1280 x 720) অথবা StreamConfigurationMap.getOutputSizes() দ্বারা ফেরত আসা নির্দিষ্ট ফরম্যাটের জন্য সর্বোচ্চ সমর্থিত রেজোলিউশনকে বোঝায়। s1440p বলতে 1440p (1920 x 1440) অথবা StreamConfigurationMap.getOutputSizes() দ্বারা ফেরত আসা নির্দিষ্ট ফরম্যাটের জন্য সর্বোচ্চ সমর্থিত রেজোলিউশনকে বোঝায়। যে ডিভাইসগুলির ক্যাপাবিলিটিতে ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE অন্তর্ভুক্ত নয়, সেগুলিকে কনকারেন্ট অপারেশনের সময় অবশ্যই sVGA রেজোলিউশন সহ অন্তত একটি Y16 স্ট্রিম, Dataspace::DEPTH , সমর্থন করতে হবে, যেখানে sVGA হলো নিম্নলিখিত দুটি রেজোলিউশনের মধ্যে ছোটটি:
- প্রদত্ত ফরম্যাটের জন্য সর্বোচ্চ আউটপুট রেজোলিউশন
- ৬৪০ x ৪৮০
বাস্তবায়ন
কোনো ডিভাইসের ক্যামেরাগুলো যুগপৎ স্ট্রিমিং সমর্থন করে কিনা, তা অ্যাপগুলোকে ডিভাইসটি থেকে জেনে নেওয়ার সুযোগ দিতে, ICameraProvider@2.6 HAL ইন্টারফেসটি ইমপ্লিমেন্ট করুন, যার মধ্যে নিম্নলিখিত মেথডগুলো অন্তর্ভুক্ত রয়েছে:
ICameraProvider@2.6 HAL ইন্টারফেসের একটি রেফারেন্স ইমপ্লিমেন্টেশনের জন্য, EmulatedCameraProviderHWLImpl.cpp এ অবস্থিত এমুলেটেড ক্যামেরা HAL লাইব্রেরিটি দেখুন।
বৈধতা
আপনার এই ফিচারের ইমপ্লিমেন্টেশনটি উদ্দেশ্য অনুযায়ী কাজ করছে কিনা তা পরীক্ষা করতে, ConcurrentCameraTest.java CTS টেস্টটি ব্যবহার করুন। এছাড়াও, এমন একটি অ্যাপ ব্যবহার করে পরীক্ষা করুন যা একাধিক ক্যামেরা খোলে এবং সেগুলোকে একযোগে পরিচালনা করে।
সম্পদ বরাদ্দের সমস্যা
যদি ক্যামেরা HAL-গুলি একাধিক ক্যামেরা ডিভাইসের যুগপৎ কার্যক্রমের জন্য সমর্থনের বিজ্ঞাপন দেয়, তবে তারা রিসোর্স বরাদ্দের সমস্যায় পড়তে পারে, বিশেষ করে এমন ক্ষেত্রে যেখানে ফোনে সামনের ও পেছনের (বা অন্য) উভয় ক্যামেরা থেকে একই সাথে স্ট্রিম করার জন্য পর্যাপ্ত ইমেজ সিগন্যাল প্রসেসর (ISP) রিসোর্স থাকলেও, তা পূর্ণ ক্ষমতায় কাজ করে না। এই পরিস্থিতিতে, ক্যামেরা HAL-কে প্রতিটি ক্যামেরা ডিভাইসের জন্য সীমিত হার্ডওয়্যার রিসোর্স বরাদ্দ করতে হয়।
উদাহরণ দৃশ্যকল্প
নিম্নলিখিত পরিস্থিতিটি এই সমস্যাটি তুলে ধরে।
সমস্যা
ডিভাইসটির কনফিগারেশন নিম্নরূপ:
- ক্যামেরা আইডি
0হলো একটি লজিক্যাল ক্যামেরা, যার পেছনে একটি ওয়াইড ও একটি আল্ট্রা-ওয়াইড ক্যামেরা রয়েছে, যেগুলোর প্রতিটি একটি করে আইএসপি রিসোর্স ব্যবহার করে। - ক্যামেরা আইডি
1হলো এমন একটি ক্যামেরা যা একটি আইএসপি রিসোর্স ব্যবহার করে।
ডিভাইসটিতে (ফোনে) দুটি আইএসপি (ISP) আছে। যদি ক্যামেরা আইডি 0 খোলা হয় এবং একটি সেশন কনফিগার করা হয়, তাহলে আল্ট্রাওয়াইড এবং ওয়াইড উভয় ক্যামেরার ব্যবহারের কথা মাথায় রেখে ক্যামেরা এইচএএল (HAL) দুটি আইএসপি রিজার্ভ করে রাখতে পারে।
যদি তাই হয়, তাহলে সামনের ক্যামেরা (আইডি 1 ) কোনো স্ট্রিম কনফিগার করতে পারবে না, কারণ উভয় আইএসপি-ই ব্যবহৃত হচ্ছে।
সমাধান
এই সমস্যাটির সমাধান করতে, ফ্রেমওয়ার্কটি সেশন কনফিগার করার আগে ক্যামেরা আইডি 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-গুলি একযোগে চলমান সমস্ত ক্যামেরার জন্য সম্পূর্ণ স্ট্রিম কনফিগারেশন সমর্থন করতে না পারে, তবে তাদের ERROR_MAX_CAMERAS_IN_USE সাথে openCamera কলগুলি ব্যর্থ করে দেওয়া উচিত।