ক্যামেরা এক্সটেনশন

ডিভাইস নির্মাতারা OEM ভেন্ডর লাইব্রেরি দ্বারা প্রদত্ত ক্যামেরা এক্সটেনশন ইন্টারফেসের মাধ্যমে তৃতীয় পক্ষের বিকাশকারীদের কাছে bokeh, নাইট মোড এবং HDR-এর মতো এক্সটেনশনগুলি প্রকাশ করতে পারে৷ বিকাশকারীরা OEM ভেন্ডর লাইব্রেরিতে বাস্তবায়িত এক্সটেনশনগুলি অ্যাক্সেস করতে Camera2 এক্সটেনশন API এবং CameraX এক্সটেনশন API ব্যবহার করতে পারেন।

সমর্থিত এক্সটেনশনগুলির একটি তালিকার জন্য, যা Camera2 এবং CameraX জুড়ে একই, CameraX এক্সটেনশন API দেখুন। আপনি যদি একটি এক্সটেনশন যোগ করতে চান, তাহলে ইস্যু ট্র্যাকারের সাথে একটি বাগ ফাইল করুন।

এই পৃষ্ঠাটি বর্ণনা করে যে কীভাবে ডিভাইসে OEM বিক্রেতা লাইব্রেরি বাস্তবায়ন এবং সক্ষম করা যায়।

স্থাপত্য

নিম্নলিখিত চিত্রটি ক্যামেরা এক্সটেনশন ইন্টারফেস বা extensions-interface আর্কিটেকচার বর্ণনা করে: স্থাপত্য

চিত্র 1. ক্যামেরা এক্সটেনশন আর্কিটেকচার ডায়াগ্রাম

ডায়াগ্রামে দেখানো হয়েছে, ক্যামেরা এক্সটেনশন সমর্থন করার জন্য, আপনাকে OEM বিক্রেতা লাইব্রেরি দ্বারা প্রদত্ত extensions-interface বাস্তবায়ন করতে হবে। আপনার OEM বিক্রেতা লাইব্রেরি দুটি API সক্ষম করে: CameraX Extensions API এবং Camera2 Extensions API , যা যথাক্রমে CameraX এবং Camera2 অ্যাপ্লিকেশানগুলি দ্বারা বিক্রেতা এক্সটেনশনগুলি অ্যাক্সেস করতে ব্যবহৃত হয়৷

OEM বিক্রেতা লাইব্রেরি বাস্তবায়ন করুন

OEM ভেন্ডর লাইব্রেরি বাস্তবায়ন করতে, camera-extensions-stub ফাইলগুলিকে একটি সিস্টেম লাইব্রেরি প্রকল্পে অনুলিপি করুন। এই ফাইলগুলি ক্যামেরা এক্সটেনশন ইন্টারফেস সংজ্ঞায়িত করে।

camera-extensions-stub ফাইলগুলি নিম্নলিখিত বিভাগে বিভক্ত:

অপরিহার্য ইন্টারফেস ফাইল (পরিবর্তন করবেন না)

  • PreviewExtenderImpl.java
  • ImageCaptureExtenderImpl.java
  • ExtenderStateListener.java
  • ProcessorImpl.java
  • PreviewImageProcessorImpl.java
  • CaptureProcessorImpl.java
  • CaptureStageImpl.java
  • RequestUpdateProcessorImpl.java
  • ProcessResultImpl.java
  • advanced/AdvancedExtenderImpl.java
  • advanced/Camera2OutputConfigImpl.java
  • advanced/Camera2SessionConfigImpl.java
  • advanced/ImageProcessorImpl.java
  • advanced/ImageReaderOutputConfigImpl.java
  • advanced/ImageReferenceImpl.java
  • advanced/MultiResolutionImageReaderOutputConfigImpl.java
  • advanced/OutputSurfaceImpl.java
  • advanced/RequestProcessorImpl.java
  • advanced/SessionProcessorImpl.java
  • advanced/SurfaceOutputConfigImpl.java

বাধ্যতামূলক বাস্তবায়ন (আপনার বাস্তবায়ন যোগ করুন)

  • ExtensionVersionImpl.java
  • InitializerImpl.java

বোকেহ এক্সটেনশন ক্লাস (বোকেহ এক্সটেনশন সমর্থিত হলে এটি প্রয়োগ করুন)

  • BokehImageCaptureExtenderImpl.java
  • BokehPreviewExtenderImpl.java
  • advanced/BokehAdvancedExtenderImpl.java

নাইট এক্সটেনশন ক্লাস (নাইট এক্সটেনশন সমর্থিত হলে এটি প্রয়োগ করুন)

  • NightImageCaptureExtenderImpl.java
  • NightPreviewExtenderImpl.java
  • advanced/NightAdvancedExtenderImpl.java

অটো এক্সটেনশন ক্লাস (যদি স্বয়ংক্রিয় এক্সটেনশন সমর্থিত হয় তবে এটি প্রয়োগ করুন)

  • AutoImageCaptureExtenderImpl.java
  • AutoPreviewExtenderImpl.java
  • advanced/AutoAdvancedExtenderImpl.java

এইচডিআর এক্সটেনশন ক্লাস (এইচডিআর এক্সটেনশন সমর্থিত হলে এটি প্রয়োগ করুন)

  • HdrImageCaptureExtenderImpl.java
  • HdrPreviewExtenderImpl.java
  • advanced/HdrAdvancedExtenderImpl.java

ফেস রিটাচ এক্সটেনশন ক্লাস (ফেস রিটাচ এক্সটেনশন সমর্থিত হলে এটি প্রয়োগ করুন)

  • BeautyImageCaptureExtenderImpl.java
  • BeautyPreviewExtenderImpl.java
  • advanced/BeautyAdvancedExtenderImpl.java

ইউটিলিটি (ঐচ্ছিক, মুছে ফেলা যেতে পারে)

  • advanced/Camera2OutputConfigImplBuilder.java
  • advanced/Camera2SessionConfigImplBuilder.java

আপনাকে প্রতিটি এক্সটেনশনের জন্য একটি বাস্তবায়ন প্রদান করতে হবে না। আপনি যদি একটি এক্সটেনশন বাস্তবায়ন না করেন, তাহলে false ফেরত দিতে বা সংশ্লিষ্ট এক্সটেন্ডার ক্লাসগুলি সরাতে isExtensionAvailable() সেট করুন। Camera2 এবং CameraX এক্সটেনশন APIs অ্যাপে রিপোর্ট করে যে এক্সটেনশনটি অনুপলব্ধ।

ক্যামেরা2 এবং ক্যামেরাএক্স এক্সটেনশন এপিআই কীভাবে একটি এক্সটেনশন সক্ষম করতে বিক্রেতা লাইব্রেরির সাথে ইন্টারঅ্যাক্ট করে তা নিয়ে চলুন। নিম্নলিখিত চিত্রটি একটি উদাহরণ হিসাবে নাইট এক্সটেনশন ব্যবহার করে এন্ড-টু-এন্ড প্রবাহকে চিত্রিত করে:

মূল প্রবাহ

চিত্র 2. নাইট এক্সটেনশন বাস্তবায়ন

  1. সংস্করণ যাচাইকরণ:

    OEM- প্রয়োগকৃত extensions-interface সংস্করণ Camera2/X সমর্থিত সংস্করণগুলির সাথে সামঞ্জস্যপূর্ণ কিনা তা নিশ্চিত করতে Camera2/X ExtensionVersionImpl.checkApiVersion() কল করে৷

  2. বিক্রেতা লাইব্রেরি আরম্ভ:

    InitializerImpl এর একটি পদ্ধতি আছে init() যা ভেন্ডর লাইব্রেরি আরম্ভ করে। এক্সটেন্ডার ক্লাস অ্যাক্সেস করার আগে ক্যামেরা 2/এক্স প্রাথমিককরণ সম্পূর্ণ করে।

  3. তাত্ক্ষণিক এক্সটেন্ডার ক্লাস:

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

    ক্যামেরা2/X তথ্য পুনরুদ্ধার করতে এবং এক্সটেনশন সক্রিয় করতে এক্সটেন্ডার ক্লাসের সাথে তাত্ক্ষণিক এবং ইন্টারঅ্যাক্ট করে। একটি প্রদত্ত এক্সটেনশনের জন্য, Camera2/X এক্সটেন্ডার ক্লাসগুলি একাধিকবার ইনস্ট্যান্ট করতে পারে। ফলস্বরূপ, কনস্ট্রাক্টর বা init() কলে হেভি-লিফটিং ইনিশিয়ালাইজেশন করবেন না। যখন ক্যামেরা সেশন শুরু হতে চলেছে তখনই ভারী উত্তোলন করুন, যেমন যখন onInit() বেসিক এক্সটেন্ডারে কল করা হয় বা initSession() অ্যাডভান্সড এক্সটেন্ডারে ডাকা হয়।

    নাইট এক্সটেনশনের জন্য, বেসিক এক্সটেন্ডার টাইপের জন্য নিম্নলিখিত এক্সটেন্ডার ক্লাসগুলি ইনস্ট্যান্ট করা হয়েছে:

    • NightImageCaptureExtenderImpl.java
    • NightPreviewExtenderImpl.java

    এবং অ্যাডভান্সড এক্সটেন্ডার টাইপের জন্য:

    • NightAdvancedExtenderImpl.java
  4. এক্সটেনশন প্রাপ্যতা পরীক্ষা করুন:

    এক্সটেনশন সক্রিয় করার আগে, isExtensionAvailable() এক্সটেন্ডার ইনস্ট্যান্সের মাধ্যমে নির্দিষ্ট ক্যামেরা আইডিতে এক্সটেনশন উপলব্ধ কিনা তা পরীক্ষা করে।

  5. ক্যামেরা তথ্য সহ এক্সটেন্ডার শুরু করুন:

    Camera2/X এক্সটেন্ডার ইনস্ট্যান্সে init() কল করে এবং এটিকে ক্যামেরা আইডি এবং CameraCharacteristics পাস করে।

  6. অনুসন্ধান তথ্য:

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

  7. এক্সটেন্ডারে এক্সটেনশন সক্রিয় করুন:

    এক্সটেন্ডার ক্লাস ক্লাস সক্রিয় করার জন্য প্রয়োজনীয় সমস্ত ইন্টারফেস প্রদান করে। এটি ক্যামেরা2 পাইপলাইনে OEM বাস্তবায়নকে হুক করার জন্য একটি প্রক্রিয়া অফার করে যেমন ক্যাপচার অনুরোধের পরামিতিগুলি ইনজেকশন দেওয়া বা একটি পোস্ট প্রসেসর সক্রিয় করা।

    অ্যাডভান্সড এক্সটেন্ডার টাইপের জন্য, ক্যামেরা2/X এক্সটেনশন সক্রিয় করতে SessionProcessorImpl এর সাথে ইন্টারঅ্যাক্ট করে। Camera2/X এক্সটেন্ডারে createSessionProcessor() কল করে SessionProcessorImpl উদাহরণ পুনরুদ্ধার করে।

নিম্নলিখিত বিভাগগুলি এক্সটেনশন প্রবাহকে আরও বিস্তারিতভাবে বর্ণনা করে।

সংস্করণ যাচাইকরণ

রানটাইমে ডিভাইস থেকে OEM ভেন্ডর লাইব্রেরি লোড করার সময়, Camera2/X লাইব্রেরি extensions-interface সংস্করণের সাথে সামঞ্জস্যপূর্ণ কিনা তা যাচাই করে। extensions-interface শব্দার্থিক সংস্করণ ব্যবহার করে, বা MAJOR.MINOR.PATCH, উদাহরণস্বরূপ, 1.1.0 বা 1.2.0৷ যাইহোক, সংস্করণ যাচাইকরণের সময় শুধুমাত্র বড় এবং ছোট সংস্করণ ব্যবহার করা হয়।

সংস্করণটি যাচাই করতে, Camera2/X সমর্থিত extensions-interface সংস্করণ সহ ExtensionVersionImpl.checkApiVersion() কল করে। Camera2/X তারপর এক্সটেনশনটি সক্ষম করা যায় কিনা এবং এটির জন্য কী কী ক্ষমতা ব্যবহার করা উচিত তা নির্ধারণ করতে OEM লাইব্রেরি দ্বারা রিপোর্ট করা সংস্করণ ব্যবহার করে।

প্রধান সংস্করণ সামঞ্জস্য

যদি এক্সটেনশন-ইন্টারফেসের প্রধান সংস্করণগুলি Camera2/X এবং বিক্রেতা লাইব্রেরির মধ্যে আলাদা হয়, তাহলে এটি বেমানান বলে বিবেচিত হয় এবং এক্সটেনশনটি নিষ্ক্রিয় করা হয়।

অনঅগ্রসর উপযোগিতা

যতক্ষণ পর্যন্ত প্রধান সংস্করণ অভিন্ন, ক্যামেরা2/X পূর্বের extensions-interface সংস্করণগুলির সাথে নির্মিত OEM বিক্রেতা লাইব্রেরির সাথে পশ্চাদমুখী সামঞ্জস্য নিশ্চিত করে। উদাহরণস্বরূপ, যদি Camera2/X extensions-interface 1.3.0 সমর্থন করে, তাহলে 1.0.0, 1.1.0 এবং 1.2.0 প্রয়োগ করা OEM ভেন্ডর লাইব্রেরিগুলি এখনও সামঞ্জস্যপূর্ণ। এর মানে হল যে আপনি ভেন্ডর লাইব্রেরির একটি নির্দিষ্ট সংস্করণ বাস্তবায়ন করার পরে, Camera2/X নিশ্চিত করে যে লাইব্রেরিটি আসন্ন extension-interface সংস্করণগুলির সাথে পিছিয়ে সামঞ্জস্যপূর্ণ।

ফরোয়ার্ড সামঞ্জস্য

নতুন extensions-interface বিক্রেতা লাইব্রেরির সাথে ফরওয়ার্ড সামঞ্জস্যতা আপনার উপর, OEM-এর উপর নির্ভর করে। এক্সটেনশনগুলি বাস্তবায়নের জন্য আপনার যদি কিছু বৈশিষ্ট্যের প্রয়োজন হয়, আপনি একটি নির্দিষ্ট সংস্করণ থেকে শুরু করে এক্সটেনশনগুলি সক্ষম করতে চাইতে পারেন। এই ক্ষেত্রে, Camera2/X লাইব্রেরি সংস্করণ প্রয়োজনীয়তা পূরণ করলে আপনি সমর্থিত extensions-interface সংস্করণটি ফেরত দিতে পারেন। যদি Camera2/X সংস্করণগুলি সমর্থিত না হয়, আপনি এক্সটেনশনগুলি নিষ্ক্রিয় করতে 99.0.0 এর মতো একটি বেমানান সংস্করণ ফেরত দিতে পারেন৷

বিক্রেতা লাইব্রেরি আরম্ভ

OEM লাইব্রেরি দ্বারা বাস্তবায়িত extensions-interface সংস্করণ যাচাই করার পরে, Camera2/X আরম্ভ করার প্রক্রিয়া শুরু করে। InitializerImpl.init() পদ্ধতিটি OEM লাইব্রেরিতে সংকেত দেয় যে একটি অ্যাপ এক্সটেনশন ব্যবহার করার চেষ্টা করছে।

ক্যামেরা 2/X OEM লাইব্রেরিতে অন্য কোন কল করে না (সংস্করণ চেকিং বাদ দিয়ে) যতক্ষণ না OEM বিক্রেতা লাইব্রেরি OnExtensionsInitializedCallback.onSuccess() সূচনা সম্পূর্ণ হওয়ার বিষয়ে অবহিত না করে।

extensions-interface 1.1.0 হিসাবে আপনাকে অবশ্যই InitializerImpl প্রয়োগ করতে হবে। যদি OEM ভেন্ডর লাইব্রেরি extensions-interface 1.0.0 প্রয়োগ করে ক্যামেরা2/X লাইব্রেরি প্রারম্ভিক পদক্ষেপটি এড়িয়ে যায়।

বেসিক এক্সটেন্ডার বনাম অ্যাডভান্সড এক্সটেন্ডার

দুই ধরনের extensions-interface বাস্তবায়ন: বেসিক এক্সটেন্ডার এবং অ্যাডভান্সড এক্সটেন্ডার। extensions-interface 1.2.0 থেকে অ্যাডভান্সড এক্সটেন্ডার সমর্থিত।

এক্সটেনশনগুলির জন্য বেসিক এক্সটেন্ডার প্রয়োগ করুন যা ক্যামেরা HAL-এ ছবিগুলি প্রক্রিয়া করে বা YUV স্ট্রীমগুলি প্রক্রিয়া করতে সক্ষম একটি পোস্ট প্রসেসর ব্যবহার করে৷

ক্যামেরা2 স্ট্রীম কনফিগারেশন কাস্টমাইজ করতে এবং প্রয়োজন অনুযায়ী ক্যাপচার অনুরোধ পাঠাতে প্রয়োজন এমন এক্সটেনশনগুলির জন্য অ্যাডভান্সড এক্সটেন্ডার প্রয়োগ করুন।

তুলনা করার জন্য নিম্নলিখিত টেবিল দেখুন:

বেসিক এক্সটেন্ডার উন্নত এক্সটেন্ডার
স্ট্রিম কনফিগারেশন স্থির
পূর্বরূপ: PRIVATE বা YUV_420_888 (যদি প্রসেসর বিদ্যমান থাকে)
এখনও ক্যাপচার করুন: JPEG বা YUV_420_888 (যদি প্রসেসর থাকে)
OEM দ্বারা কাস্টমাইজযোগ্য.
ক্যাপচার অনুরোধ পাঠানো হচ্ছে শুধুমাত্র Camera2/X ক্যাপচার অনুরোধ পাঠাতে পারে। আপনি এই অনুরোধের পরামিতি সেট করতে পারেন। যখন ইমেজ ক্যাপচারের জন্য প্রসেসর দেওয়া হয়, তখন ক্যামেরা2/X একাধিক ক্যাপচারের অনুরোধ পাঠাতে পারে এবং প্রসেসরে সমস্ত ছবি ও ক্যাপচার ফলাফল পাঠাতে পারে। একটি RequestProcessorImpl ইন্সট্যান্স আপনাকে ক্যামেরা2 ক্যাপচার রিকোয়েস্ট এক্সিকিউট করার জন্য এবং ফলাফল এবং ইমেজ পাওয়ার জন্য প্রদান করা হয়েছে।

startRepeating পুনরাবৃত্তির অনুরোধ শুরু করার জন্য এবং যথাক্রমে স্টিল ক্যাপচার সিকোয়েন্স শুরু করার জন্য OEM-কে সংকেত দেওয়ার জন্য Camera2/X SessionProcessorImpl এ startRepeating এবং startCapture আহ্বান করে।

ক্যামেরার পাইপলাইনে হুক
  • onPresetSession সেশন প্যারামিটার প্রদান করে।
  • CameraCaptureSession কনফিগার হওয়ার পরেই onEnableSession একটি একক অনুরোধ পাঠায়।
  • CameraCaptureSession বন্ধ হওয়ার আগে onDisableSession একটি একক অনুরোধ পাঠায়।
  • initSession শুরু করে এবং ক্যাপচার সেশন তৈরি করার জন্য একটি কাস্টমাইজড ক্যামেরা2 সেশন কনফিগারেশন প্রদান করে।
  • CameraCaptureSession কনফিগার হওয়ার পরেই onCaptureSessionStart চালু করা হয়।
  • CameraCaptureSession বন্ধ হওয়ার আগে onCaptureSessionEnd আহ্বান করা হয়।
উপযুক্ত ক্যামেরা HAL বা YUV ছবি প্রসেস করে এমন প্রসেসরে এক্সটেনশন প্রয়োগ করা হয়েছে।
  • এক্সটেনশনগুলির জন্য ক্যামেরা2-ভিত্তিক বাস্তবায়ন রয়েছে৷
  • কাস্টমাইজড স্ট্রিম কনফিগারেশন যেমন RAW স্ট্রিম প্রয়োজন।
  • ইন্টারেক্টিভ ক্যাপচার সিকোয়েন্স প্রয়োজন।
সমর্থিত API সংস্করণ Camera2 এক্সটেনশন: Android 13 বা উচ্চতর
CameraX এক্সটেনশন: camera-extensions 1.1.0 বা উচ্চতর
Camera2 এক্সটেনশন: Android 12L বা উচ্চতর
CameraX এক্সটেনশন: camera-extensions 1.2.0-alpha03 বা উচ্চতর

অ্যাপ প্রবাহিত হয়

নিম্নলিখিত সারণীতে তিন ধরনের অ্যাপ ফ্লো এবং তাদের সংশ্লিষ্ট ক্যামেরা এক্সটেনশন API কল দেখায়। Camera2/X এই APIগুলি প্রদান করার সময়, এই ফ্লোগুলিকে সমর্থন করার জন্য আপনাকে অবশ্যই বিক্রেতা লাইব্রেরি সঠিকভাবে প্রয়োগ করতে হবে, যা আমরা পরবর্তী বিভাগে আরও বিশদে বর্ণনা করব।

ক্যামেরা2 এক্সটেনশন ক্যামেরাএক্স এক্সটেনশন
প্রশ্ন এক্সটেনশন প্রাপ্যতা CameraExtensionCharacteristics . getSupportedExtensions ExtensionsManager. isExtensionAvailable
তথ্য অনুসন্ধান করুন CameraExtensionCharacteristics. getExtensionSupportedSizes CameraExtensionCharacteristics. getEstimatedCaptureLatencyRangeMillis CameraExtensionCharacteristics. getAvailableCaptureRequestKeys CameraExtensionCharacteristics. getAvailableCaptureResultKeys ExtensionsManager. getEstimatedCaptureLatencyRange

CameraX লাইব্রেরির মধ্যে বাকি তথ্য পরিচালনা করে।

প্রিভিউ এবং স্থির-ক্যাপচার এক্সটেনশন সক্ষম CameraDevice. createExtensionSession

cameraExtensionsSession. setRepeatingRequest

cameraExtensionsSession. capture

val cameraSelector = ExtensionsManager. getExtensionEnabledCameraSelector bindToLifecycle(lifecycleOwner, cameraSelector, preview, ...)

বেসিক এক্সটেন্ডার

বেসিক এক্সটেন্ডার ইন্টারফেস ক্যামেরা পাইপলাইনের বিভিন্ন জায়গায় হুক প্রদান করে। প্রতিটি এক্সটেনশন প্রকারের সাথে সংশ্লিষ্ট এক্সটেন্ডার ক্লাস রয়েছে যা OEM দের বাস্তবায়ন করতে হবে।

নিম্নোক্ত সারণীতে প্রতিটি এক্সটেনশনের জন্য OEMSকে যে এক্সটেন্ডার ক্লাস বাস্তবায়ন করতে হবে তা তালিকাভুক্ত করা হয়েছে:

এক্সটেন্ডার ক্লাস বাস্তবায়ন করতে
রাত্রি NightPreviewExtenderImpl.java

NightImageCaptureExtenderImpl.java

এইচডিআর HdrPreviewExtenderImpl.java HdrImageCaptureExtenderImpl.java
অটো AutoPreviewExtenderImpl.java AutoImageCaptureExtenderImpl.java
বোকেহ BokehPreviewExtenderImpl.java BokehImageCaptureExtenderImpl.java
ফেস রিটাচ BeautyPreviewExtenderImpl.java BeautyImageCaptureExtenderImpl.java

আমরা নিম্নলিখিত উদাহরণে স্থানধারক হিসাবে PreviewExtenderImpl এবং ImageCaptureExtenderImpl ব্যবহার করি। আপনি যে প্রকৃত ফাইলগুলি বাস্তবায়ন করছেন তার নাম দিয়ে এগুলি প্রতিস্থাপন করুন।

বেসিক এক্সটেন্ডারের নিম্নলিখিত ক্ষমতা রয়েছে:

  • CameraCaptureSession ( onPresetSession ) কনফিগার করার সময় সেশন প্যারামিটারগুলি ইনজেক্ট করুন।
  • ক্যাপচার সেশন শুরু এবং সমাপ্তির ইভেন্টগুলি সম্পর্কে আপনাকে অবহিত করুন এবং ফিরে আসা প্যারামিটারগুলি ( onEnableSession , onDisableSession ) সহ HAL-কে অবহিত করার জন্য একটি একক অনুরোধ পাঠান।
  • অনুরোধের জন্য ক্যাপচার প্যারামিটারগুলি ইনজেক্ট করুন ( PreviewExtenderImpl.getCaptureStage , ImageCaptureExtenderImpl.getCaptureStages )।
  • পূর্বরূপের জন্য প্রসেসর যোগ করুন এবং এখনও ক্যাপচার করুন যা YUV_420_888 স্ট্রীম প্রক্রিয়া করতে সক্ষম।

আসুন দেখি কিভাবে ক্যামেরা2/X উপরে উল্লিখিত তিনটি অ্যাপ ফ্লো অর্জন করতে extensions-interface ব্যবহার করে।

অ্যাপ ফ্লো 1: এক্সটেনশনের প্রাপ্যতা পরীক্ষা করুন

BasicExtenderAppFlow1

চিত্র 3. বেসিক এক্সটেন্ডারে অ্যাপ ফ্লো 1

এই প্রবাহে, Camera2/X সরাসরি init() () কে কল না করে PreviewExtenderImpl এবং ImageCaptureExtenderImpl উভয়ের isExtensionAvailable() পদ্ধতিতে কল করে। এক্সটেনশনগুলি সক্ষম করতে উভয় এক্সটেন্ডার ক্লাসকেই true ফিরে আসতে হবে।

এক্সটেনশন সক্রিয় করার আগে প্রদত্ত এক্সটেনশনের ধরনটি প্রদত্ত ক্যামেরা আইডির জন্য সমর্থিত কিনা তা পরীক্ষা করার জন্য প্রায়শই অ্যাপগুলির জন্য এটি প্রথম পদক্ষেপ। এর কারণ হল কিছু এক্সটেনশন শুধুমাত্র নির্দিষ্ট ক্যামেরা আইডিতে সমর্থিত।

অ্যাপ ফ্লো 2: কোয়েরি তথ্য

BasicExtenderAppFlow2

চিত্র 4. বেসিক এক্সটেন্ডারে অ্যাপ ফ্লো 2

এক্সটেনশনটি উপলব্ধ কিনা তা নির্ধারণ করার পরে, অ্যাপ্লিকেশানগুলিকে এক্সটেনশন সক্ষম করার আগে নিম্নলিখিত তথ্যগুলি জিজ্ঞাসা করা উচিত৷

  • স্টিল ক্যাপচার লেটেন্সি রেঞ্জ: ImageCaptureExtenderImpl.getEstimatedCaptureLatencyRange অ্যাপটির জন্য ক্যাপচার লেটেন্সি রেঞ্জ রিটার্ন করে যে এটি বর্তমান পরিস্থিতিতে এক্সটেনশন সক্ষম করা উপযুক্ত কিনা তা মূল্যায়ন করতে।

  • প্রিভিউ এবং ক্যাপচার সারফেসের জন্য সমর্থিত মাপ: ImageCaptureExtenderImpl.getSupportedResolutions এবং PreviewExtenderImpl.getSupportedResolutions ইমেজ ফরম্যাট এবং সারফেস ফরম্যাট এবং সাইজের জন্য সমর্থিত মাপগুলির একটি তালিকা প্রদান করে।

  • সমর্থিত অনুরোধ এবং ফলাফল কী: Camera2/X আপনার বাস্তবায়ন থেকে সমর্থিত ক্যাপচার অনুরোধ কী এবং ফলাফল কীগুলি পুনরুদ্ধার করতে নিম্নলিখিত পদ্ধতিগুলি ব্যবহার করে:

    • ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys
    • ImageCaptureExtenderImpl.getAvailableCapturetResultKeys

Camera2/X সর্বদা init() কে কল করে এই এক্সটেন্ডার ক্লাসে আরও তথ্যের জন্য জিজ্ঞাসা করার আগে।

অ্যাপ ফ্লো 3: এক্সটেনশন সক্ষম করে পূর্বরূপ/এখনও ক্যাপচার (HAL বাস্তবায়ন)

BasicExtenderAppFlow3

চিত্র 5. বেসিক এক্সটেন্ডারে অ্যাপ ফ্লো 3

উপরের চিত্রটি প্রিভিউ সক্ষম করার মূল প্রবাহকে চিত্রিত করে এবং এখনও কোনও প্রসেসর ছাড়াই একটি এক্সটেনশনের সাথে ক্যাপচার করে৷ এর মানে হল ক্যামেরা HAL এক্সটেনশন প্রক্রিয়া করে।

এই প্রবাহে, Camera2/X প্রথমে init() তারপর onInit কল করে, যা আপনাকে জানায় যে একটি ক্যামেরা সেশন নির্দিষ্ট এক্সটেনশনের সাথে শুরু হতে চলেছে। আপনি onInit() এ হেভি-লিফটিং ইনিশিয়ালাইজেশন করতে পারেন।

CameraCaptureSession কনফিগার করার সময়, Camera2/X সেশনের পরামিতি পেতে onPresetSession চালু করে। ক্যাপচার সেশনটি সফলভাবে কনফিগার হওয়ার পরে, Camera2/X ক্যাপচার প্যারামিটার ধারণ করে একটি CaptureStageImpl উদাহরণ প্রদান করে onEnableSession আহ্বান করে। Camera2/X অবিলম্বে এই ক্যাপচার পরামিতিগুলির সাথে HAL কে অবহিত করার জন্য একটি একক অনুরোধ পাঠায়। একইভাবে, ক্যাপচার সেশন বন্ধ হওয়ার আগে, Camera2/X onDisableSession চালু করে এবং তারপরে ফিরে আসা ক্যাপচার প্যারামিটারের সাথে একটি একক অনুরোধ পাঠায়।

Camera2/X দ্বারা ট্রিগার করা পুনরাবৃত্তির অনুরোধে PreviewExtenderImpl.getCaptureStage() দ্বারা প্রত্যাবর্তিত অনুরোধের পরামিতি রয়েছে। উপরন্তু, স্থির ক্যাপচার অনুরোধে ImageCaptureExtenderImpl.getCaptureStages() দ্বারা প্রত্যাবর্তিত পরামিতি রয়েছে।

অবশেষে, ক্যামেরা সেশন শেষ হওয়ার পরে Camera2/X onDeInit() আহ্বান করে। আপনি onDeinit() এ সম্পদ প্রকাশ করতে পারেন।

প্রিভিউ প্রসেসর

ক্যামেরা HAL ছাড়াও, আপনি প্রসেসরে এক্সটেনশনগুলিও প্রয়োগ করতে পারেন।

নিচে ব্যাখ্যা করা প্রসেসরের ধরন নির্দিষ্ট করতে PreviewExtenderImpl.getProcessorType প্রয়োগ করুন:

  • PROCESSOR_TYPE_NONE : কোনো প্রসেসর নেই৷ ছবি HAL ক্যামেরায় প্রক্রিয়া করা হয়।

  • PROCESSOR_TYPE_REQUEST_UPDATE_ONLY : প্রসেসরের প্রকার আপনাকে সর্বশেষ TotalCaptureResult এর উপর ভিত্তি করে নতুন ক্যাপচার অনুরোধ পরামিতি সহ পুনরাবৃত্তির অনুরোধ আপডেট করতে দেয়।

    PreviewExtenderImpl.getProcessor অবশ্যই একটি RequestUpdateProcessorImpl ইন্সট্যান্স ফেরত দিতে হবে যা TotalCaptureResult ইনস্ট্যান্সকে প্রসেস করে এবং পুনরাবৃত্তি করা অনুরোধ আপডেট করার জন্য একটি CaptureStageImpl ইন্সট্যান্স ফেরত দেয়। PreviewExtenderImpl.getCaptureStage() প্রক্রিয়াকরণের ফলাফলও প্রতিফলিত করবে এবং সর্বশেষ CaptureStageImpl ফেরত দেবে।

  • PROCESSOR_TYPE_IMAGE_PROCESSOR : এই প্রকার আপনাকে YUV_420_888 ছবিগুলি প্রক্রিয়া করার জন্য একটি প্রসেসর প্রয়োগ করতে এবং একটি PRIVATE পৃষ্ঠে আউটপুট লিখতে দেয়৷

    আপনাকে PreviewExtenderImpl.getProcessor এ একটি PreviewImageProcessorImpl উদাহরণ বাস্তবায়ন এবং ফেরত দিতে হবে। প্রসেসর YUV_420_888 ইনপুট ছবি প্রক্রিয়াকরণের জন্য দায়ী। এটি প্রাকদর্শনের PRIVATE বিন্যাসে আউটপুট লিখতে হবে। প্রাকদর্শনের জন্য CameraCaptureSession কনফিগার করতে Camera2/X PRIVATE পরিবর্তে একটি YUV_420_888 পৃষ্ঠ ব্যবহার করে৷

    প্রবাহের জন্য নিম্নলিখিত চিত্রটি দেখুন:

প্রিভিউ প্রসেসর

চিত্র 6. PreviewImageProcessorImpl এর সাথে প্রিভিউ ফ্লো

PreviewImageProcessorImpl ইন্টারফেস ProcessImpl প্রসারিত করে এবং তিনটি গুরুত্বপূর্ণ পদ্ধতি রয়েছে:

  • onOutputSurface(Surface surface, int imageFormat) প্রসেসরের জন্য আউটপুট সারফেস সেট করে। PreviewImageProcessorImpl এর জন্য, imageFormat হল একটি পিক্সেল বিন্যাস যেমন PixelFormat.RGBA_8888

  • onResolutionUpdate(Size size) ইনপুট চিত্রের আকার নির্ধারণ করে।

  • onImageFormatUpdate(int imageFormat) ইনপুট ইমেজের ইমেজ ফরম্যাট সেট করে। বর্তমানে, এটি শুধুমাত্র YUV_420_888 হতে পারে।

ইমেজ ক্যাপচার প্রসেসর

এখনও ক্যাপচারের জন্য, আপনি ImageCaptureExtenderImpl.getCaptureProcessor ব্যবহার করে একটি CaptureProcessorImpl উদাহরণ ফিরিয়ে দিয়ে একটি প্রসেসর বাস্তবায়ন করতে পারেন। প্রসেসর ক্যাপচার করা YUV_420_888 ইমেজ এবং TotalCaptureResult দৃষ্টান্তগুলির একটি তালিকা প্রক্রিয়া করার জন্য এবং একটি YUV_420_888 পৃষ্ঠে আউটপুট লেখার জন্য দায়ী।

আপনি নিরাপদে অনুমান করতে পারেন যে স্থির ক্যাপচার অনুরোধ পাঠানোর আগে পূর্বরূপ সক্রিয় এবং চলমান।

নীচের চিত্রে প্রবাহ দেখুন:

ক্যাপচার প্রসেসর

চিত্র 7. এখনও CaptureProcessorImpl দিয়ে ফ্লো ক্যাপচার করুন

  1. ক্যামেরা2/X একটি YUV_420_888 ফর্ম্যাট পৃষ্ঠ ব্যবহার করে ক্যাপচার সেশন কনফিগার করার জন্য এখনও ক্যাপচার করার জন্য। Camera2/X কল করে CaptureProcessorImpl প্রস্তুত করে:

    • YUV_420_888 এর সাথে CaptureProcessorImpl.onImageFormatUpdate()
    • ইনপুট চিত্রের আকার সহ CaptureProcessorImpl.onResolutionUpdate()
    • একটি আউটপুট YUV_420_888 পৃষ্ঠ সহ CaptureProcessorImpl.onOutputSurface()
  2. ImageCaptureExtenderImpl.getCaptureStages CaptureStageImpl এর একটি তালিকা প্রদান করে, যেখানে প্রতিটি উপাদান ক্যামেরা2/X দ্বারা পাঠানো ক্যাপচার প্যারামিটার সহ একটি CaptureRequest উদাহরণে ম্যাপ করে। উদাহরণস্বরূপ, যদি এটি তিনটি CaptureStageImpl দৃষ্টান্তের একটি তালিকা প্রদান করে, Camera2/X captureBurst API ব্যবহার করে সংশ্লিষ্ট ক্যাপচার প্যারামিটার সহ তিনটি ক্যাপচার অনুরোধ পাঠায়।

  3. প্রাপ্ত ছবি এবং TotalCaptureResult দৃষ্টান্তগুলি একসাথে বান্ডিল করা হয় এবং প্রক্রিয়াকরণের জন্য CaptureProcessorImpl এ পাঠানো হয়।

  4. CaptureProcessorImpl onOutputSurface() কল দ্বারা নির্দিষ্ট আউটপুট পৃষ্ঠে ফলাফল চিত্র ( YUV_420_888 বিন্যাস) লেখে। ক্যামেরা2/X প্রয়োজনে এটিকে JPEG ছবিতে রূপান্তর করে।

সমর্থন ক্যাপচার অনুরোধ কী এবং ফলাফল

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

নিম্নলিখিত পদ্ধতিগুলি extensions-interface 1.3.0-তে যোগ করা হয়েছে যাতে আপনি আপনার বাস্তবায়ন সমর্থন করে এমন প্যারামিটারগুলিকে প্রকাশ করতে পারবেন:

  • ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys() আপনার বাস্তবায়ন দ্বারা সমর্থিত ক্যাপচার অনুরোধ কী ফেরত দেয়।
  • ImageCaptureExtenderImpl.getAvailableCaptureResultKeys() ক্যাপচার ফলাফল কীগুলি ফেরত দেয় যা ক্যাপচার ফলাফলে থাকে।

ক্যামেরা HAL এক্সটেনশন প্রক্রিয়া করলে, Camera2/X ক্যামেরা CameraCaptureSession.CaptureCallback ক্যাপচার ফলাফল পুনরুদ্ধার করে। যাইহোক, যদি প্রসেসর প্রয়োগ করা হয়, তাহলে Camera2/X ProcessResultImpl এ ক্যাপচার ফলাফল পুনরুদ্ধার করে, যা PreviewImageProcessorImpl এবং CaptureProcessorImplprocess() পদ্ধতিতে পাস করা হয়। ProcessResultImpl মাধ্যমে Camera2/X-এ ক্যাপচার ফলাফল রিপোর্ট করার জন্য আপনি দায়ী।

একটি উদাহরণ হিসাবে নীচে CaptureProcessorImpl ইন্টারফেসের সংজ্ঞা দেখুন। extensions-interface 1.3.0 বা উচ্চতর, দ্বিতীয় process() কল আহ্বান করা হয়:

Interface CaptureProcessorImpl extends ProcessorImpl {
    // invoked when extensions-interface version < 1.3.0
    void process(Map<Integer, Pair<Image, TotalCaptureResult>> results);
    // invoked when extensions-interface version >= 1.3.0
    void process(Map<Integer, Pair<Image, TotalCaptureResult>> results,
            ProcessResultImpl resultCallback, Executor executor);
}

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

  • জুম:
    • CaptureRequest#CONTROL_ZOOM_RATIO
    • CaptureRequest#SCALER_CROP_REGION
  • ফোকাস করতে ট্যাপ করুন:
    • CaptureRequest#CONTROL_AF_MODE
    • CaptureRequest#CONTROL_AF_TRIGGER
    • CaptureRequest#CONTROL_AF_REGIONS
    • CaptureRequest#CONTROL_AE_REGIONS
    • CaptureRequest#CONTROL_AWB_REGIONS
  • ফ্ল্যাশ:
    • CaptureRequest#CONTROL_AE_MODE
    • CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER
    • CaptureRequest#FLASH_MODE
  • এক্সপোজার ক্ষতিপূরণ:
    • CaptureRequest#CONTROL_AE_EXPOSURE_COMPENSATION

1.2.0 বা পূর্ববর্তী সংস্করণগুলি বাস্তবায়ন করে এমন বেসিক এক্সটেন্ডারগুলির জন্য, CameraX এক্সটেনশন API স্পষ্টভাবে উপরের সমস্ত কীগুলিকে সমর্থন করে৷ extensions-interface 1.3.0-এর জন্য, CameraX এবং Camera2 উভয়ই প্রত্যাবর্তিত তালিকাকে সম্মান করে এবং শুধুমাত্র এতে থাকা কীগুলিকে সমর্থন করে। উদাহরণ স্বরূপ, আপনি যদি 1.3.0 বাস্তবায়নে শুধুমাত্র CaptureRequest#CONTROL_ZOOM_RATIO এবং CaptureRequest#SCALER_CROP_REGION ফেরত দেওয়ার সিদ্ধান্ত নেন, তাহলে এর মানে হল অ্যাপটির জন্য শুধুমাত্র জুম সমর্থিত যখন ট্যাপ-টু-ফোকাস, ফ্ল্যাশ এবং এক্সপোজার ক্ষতিপূরণ অনুমোদিত নয়।

উন্নত এক্সটেন্ডার

Advanced Extender হল Camera2 API এর উপর ভিত্তি করে এক প্রকার ভেন্ডর ইমপ্লিমেন্টেশন। এই এক্সটেন্ডারের ধরনটি extensions-interface 1.2.0 এ যোগ করা হয়েছে। ডিভাইস প্রস্তুতকারকের উপর নির্ভর করে, অ্যাপ স্তরে এক্সটেনশনগুলি প্রয়োগ করা হতে পারে, যা নিম্নলিখিত বিষয়গুলির উপর নির্ভর করে:

  • কাস্টম স্ট্রিম কনফিগারেশন: RAW স্ট্রিমের মতো কাস্টম স্ট্রীম কনফিগার করুন বা বিভিন্ন ফিজিক্যাল ক্যামেরা আইডির জন্য একাধিক স্ট্রিম আছে।

  • Camera2 অনুরোধ পাঠানোর ক্ষমতা: একটি জটিল মিথস্ক্রিয়া যুক্তি সমর্থন করে যা পূর্ববর্তী অনুরোধের ফলাফলের উপর ভিত্তি করে প্যারামিটার সহ ক্যাপচার অনুরোধ পাঠাতে পারে।

অ্যাডভান্সড এক্সটেন্ডার একটি মোড়ক, বা একটি মধ্যবর্তী স্তর প্রদান করে, যাতে আপনি স্ট্রিম কনফিগারেশন কাস্টমাইজ করতে পারেন এবং চাহিদা অনুযায়ী ক্যাপচার অনুরোধ পাঠাতে পারেন।

বাস্তবায়নের জন্য ফাইল

অ্যাডভান্সড এক্সটেন্ডার ইমপ্লিমেন্টে স্যুইচ করতে, ExtensionVersionImplisAdvancedExtenderImplemented() পদ্ধতিটি অবশ্যই true ফিরে আসবে। প্রতিটি এক্সটেনশন প্রকারের জন্য, OEM-কে অবশ্যই সংশ্লিষ্ট এক্সটেন্ডার ক্লাসগুলি বাস্তবায়ন করতে হবে। অ্যাডভান্সড এক্সটেন্ডার বাস্তবায়ন ফাইলগুলি উন্নত প্যাকেজে রয়েছে।

এক্সটেন্ডার ক্লাস বাস্তবায়ন করতে
রাত্রি advanced/NightAdvancedExtenderImpl.java
এইচডিআর advanced/HdrAdvancedExtenderImpl.java
অটো advanced/AutoAdvancedExtenderImpl.java
বোকেহ advanced/BokehAdvancedExtenderImpl.java
ফেস রিটাচ advanced/BeautyAdvancedExtenderImpl.java

আমরা নিম্নলিখিত উদাহরণে একটি স্থানধারক হিসাবে AdvancedExtenderImpl ব্যবহার করি। আপনি যে এক্সটেনশনটি বাস্তবায়ন করছেন তার জন্য এক্সটেন্ডার ফাইলের নামের সাথে এটি প্রতিস্থাপন করুন।

আসুন দেখি কিভাবে ক্যামেরা2/X তিনটি অ্যাপ ফ্লো অর্জন করতে extensions-interface আহ্বান করে।

অ্যাপ ফ্লো 1: এক্সটেনশনের প্রাপ্যতা পরীক্ষা করুন

AdvancedAppFlow1

চিত্র 8. অ্যাডভান্সড এক্সটেন্ডারে অ্যাপ ফ্লো 1

প্রথমত, অ্যাপটি প্রদত্ত এক্সটেনশনটি সমর্থিত কিনা তা পরীক্ষা করে।

অ্যাপ ফ্লো 2: কোয়েরি তথ্য

AdvancedAppFlow2

চিত্র 9. অ্যাডভান্সড এক্সটেন্ডারে অ্যাপ ফ্লো 2

AdvancedExtenderImpl.init() এ কল করার পরে, অ্যাপটি AdvancedExtenderImpl এ নিম্নলিখিত তথ্যগুলি জিজ্ঞাসা করতে পারে:

  • আনুমানিক এখনও ক্যাপচার লেটেন্সি: AdvancedExtenderImpl.getEstimatedCaptureLatencyRange() বর্তমান পরিস্থিতির জন্য এক্সটেনশন সক্ষম করা উপযুক্ত কিনা তা মূল্যায়ন করার জন্য অ্যাপটির ক্যাপচার লেটেন্সির পরিসর প্রদান করে।

  • পূর্বরূপ এবং এখনও ক্যাপচারের জন্য সমর্থিত রেজোলিউশন:

    • AdvancedExtenderImpl.getSupportedPreviewOutputResolutions() আকারের তালিকায় চিত্র বিন্যাসের একটি মানচিত্র ফেরত দেয় যা পূর্বরূপ পৃষ্ঠ বিন্যাস এবং আকারের জন্য সমর্থিত। OEM গুলিকে অবশ্যই অন্তত PRIVATE ফর্ম্যাট সমর্থন করতে হবে৷

    • AdvancedExtenderImpl.getSupportedCaptureOutputResolutions() স্থির ক্যাপচার পৃষ্ঠের জন্য সমর্থিত বিন্যাস এবং মাপ প্রদান করে। OEMs অবশ্যই JPEG এবং YUV_420_888 ফর্ম্যাট আউটপুট উভয় সমর্থন করবে৷

    • AdvancedExtenderImpl.getSupportedYuvAnalysisResolutions() চিত্র বিশ্লেষণের জন্য একটি অতিরিক্ত YUV_420_888 স্ট্রীমের জন্য সমর্থিত মাপ প্রদান করে। ইমেজ বিশ্লেষণ YUV পৃষ্ঠ সমর্থিত না হলে, getSupportedYuvAnalysisResolutions() null বা একটি খালি তালিকা প্রদান করা উচিত।

  • উপলব্ধ ক্যাপচার অনুরোধ কী/ফলাফল ( extensions-interface 1.3.0-এ যোগ করা হয়েছে): ক্যামেরা2/X আপনার বাস্তবায়ন থেকে সমর্থিত ক্যাপচার অনুরোধ কী এবং ফলাফল কীগুলি পুনরুদ্ধার করতে নিম্নলিখিত পদ্ধতিগুলি ব্যবহার করে:

    • AdvancedExtenderImpl.getAvailableCaptureRequestKeys
    • AdvancedExtenderImpl.getAvailableCaptureResultKeys

আরও তথ্যের জন্য, সমর্থন ক্যাপচার অনুরোধ কী এবং ফলাফল দেখুন।

অ্যাপ ফ্লো 3: এক্সটেনশন সক্ষম করে পূর্বরূপ/এখনও ক্যাপচার করুন

AdvancedAppFlow3

চিত্র 10. অ্যাডভান্সড এক্সটেন্ডারে অ্যাপ ফ্লো 3

উপরের চিত্রটি প্রিভিউ শুরু করার জন্য প্রধান প্রবাহ দেখায় এবং এখনও উন্নত এক্সটেন্ডার প্রকারের জন্য ক্যাপচার করে। আসুন প্রতিটি পদক্ষেপের মধ্য দিয়ে হেঁটে যাই।

  1. SessionProcessorImpl উদাহরণ

    কোর অ্যাডভান্সড এক্সটেন্ডার বাস্তবায়ন SessionProcessorImpl এ রয়েছে, যা কাস্টমাইজড সেশন কনফিগারেশন প্রদানের জন্য এবং প্রিভিউ শুরু করতে এবং এখনও ক্যাপচার অনুরোধ পাঠানোর জন্য দায়ী। AdvancedExtenderImpl.createSessionProcessor() SessionProcessorImpl দৃষ্টান্ত ফেরত দেওয়ার জন্য আহ্বান করা হয়েছে।

  2. initSession

    SessionProcessorImpl.initSession() এক্সটেনশনের জন্য সেশন শুরু করে। এখানেই আপনি সম্পদ বরাদ্দ করেন এবং একটি CameraCaptureSession প্রস্তুত করার জন্য একটি সেশন কনফিগারেশন ফেরত দেন।

    ইনপুট পরামিতিগুলির জন্য, Camera2/X পূর্বরূপ, এখনও ক্যাপচার এবং একটি ঐচ্ছিক YUV চিত্র বিশ্লেষণের জন্য আউটপুট পৃষ্ঠের কনফিগারেশনগুলি নির্দিষ্ট করে৷ এই আউটপুট সারফেস কনফিগারেশন ( OutputSurfaceImpl ) এ সারফেস, সাইজ এবং ইমেজ ফরম্যাট রয়েছে যা AdvancedExtenderImpl এ নিম্নলিখিত পদ্ধতি দ্বারা পুনরুদ্ধার করা হয়:

    • getSupportedPreviewOutputResolutions()
    • getSupportedCaptureOutputResolutions()
    • getSupportedYuvAnalysisResolutions()

    আপনাকে অবশ্যই একটি Camera2SessionConfigImpl দৃষ্টান্ত ফেরত দিতে হবে, যা Camera2OutputConfigImpl দৃষ্টান্তগুলির একটি তালিকা এবং CameraCaptureSession কনফিগার করার জন্য ব্যবহৃত সেশন প্যারামিটারগুলি নিয়ে গঠিত। Camera2/X দ্বারা পাস করা আউটপুট পৃষ্ঠগুলিতে সঠিক ক্যামেরা চিত্রগুলি আউটপুট করার জন্য আপনি দায়ী৷ আউটপুট সক্ষম করার জন্য এখানে কিছু বিকল্প রয়েছে:

    • ক্যামেরা HAL-এ প্রক্রিয়াকরণ: আপনি একটি SurfaceOutputConfigImpl বাস্তবায়নের মাধ্যমে CameraCaptureSession সরাসরি আউটপুট পৃষ্ঠগুলি যুক্ত করতে পারেন। এটি ক্যামেরা পাইপলাইনে সরবরাহকৃত আউটপুট পৃষ্ঠকে কনফিগার করে এবং ক্যামেরা HAL কে ছবিটি প্রক্রিয়া করার অনুমতি দেয়।
    • মধ্যবর্তী ImageReader পৃষ্ঠ (RAW, YUV, ইত্যাদি) প্রক্রিয়াকরণ: একটি ImageReaderOutputConfigImpl উদাহরণ সহ CameraCaptureSession এ অন্তর্বর্তী ImageReader পৃষ্ঠগুলি যুক্ত করুন।

      আপনাকে মধ্যবর্তী চিত্রগুলি প্রক্রিয়া করতে হবে এবং ফলাফলের চিত্রটি আউটপুট পৃষ্ঠে লিখতে হবে।

    • Camera2 সারফেস শেয়ারিং ব্যবহার করুন: অন্য Camera2OutputConfigImpl উদাহরণের getSurfaceSharingOutputConfigs() পদ্ধতিতে যেকোনো Camera2OutputConfigImpl উদাহরণ যোগ করে অন্য সারফেসের সাথে সারফেস শেয়ারিং ব্যবহার করুন। পৃষ্ঠ বিন্যাস এবং আকার অভিন্ন হতে হবে।

    SurfaceOutputConfigImpl এবং ImageReaderOutputConfigImpl সহ সমস্ত Camera2OutputConfigImpl অবশ্যই একটি অনন্য আইডি ( getId() ) থাকতে হবে, যা লক্ষ্য পৃষ্ঠ নির্দিষ্ট করতে এবং ImageReaderOutputConfigImpl থেকে ছবিটি পুনরুদ্ধার করতে ব্যবহৃত হয়।

  3. onCaptureSessionStart এবং RequestProcessorImpl

    যখন CameraCaptureSession শুরু হয় এবং ক্যামেরা ফ্রেমওয়ার্ক onConfigured() আহ্বান করে, তখন Camera2/X Camera2 অনুরোধের মোড়কে RequestProcessImpl সহ SessionProcessorImpl.onCaptureSessionStart() আহ্বান করে। Camera2/X RequestProcessImpl প্রয়োগ করে, যা আপনাকে ক্যাপচার অনুরোধগুলি কার্যকর করতে এবং ImageReaderOutputConfigImpl ব্যবহার করা হলে ছবিগুলি পুনরুদ্ধার করতে সক্ষম করে।

    RequestProcessImpl APIগুলি অনুরোধগুলি কার্যকর করার ক্ষেত্রে Camera2 CameraCaptureSession API-এর মতো। পার্থক্যগুলি হল:

    • লক্ষ্য পৃষ্ঠ Camera2OutputConfigImpl উদাহরণের ID দ্বারা নির্দিষ্ট করা হয়।
    • ImageReader এর ইমেজ পুনরুদ্ধার করার ক্ষমতা।

    আপনি একটি নির্দিষ্ট Camera2OutputConfigImpl আইডি সহ RequestProcessorImpl.setImageProcessor() কল করতে পারেন ছবিগুলি পেতে একটি ImageProcessorImpl উদাহরণ নিবন্ধন করতে৷

    Camera2/X SessionProcessorImpl.onCaptureSessionEnd() কল করার পরে RequestProcessImpl উদাহরণটি অবৈধ হয়ে যায়।

  4. পূর্বরূপ শুরু করুন এবং একটি ছবি তুলুন

    অ্যাডভান্সড এক্সটেন্ডার বাস্তবায়নে, আপনি RequestProcessorImpl ইন্টারফেসের মাধ্যমে ক্যাপচার অনুরোধ পাঠাতে পারেন। Camera2/X আপনাকে যথাক্রমে SessionProcessorImpl#startRepeating এবং SessionProcessorImpl#startCapture কল করে প্রিভিউ বা স্টিল ক্যাপচার সিকোয়েন্সের জন্য পুনরাবৃত্তির অনুরোধ শুরু করতে বিজ্ঞপ্তি দেয়। এই পূর্বরূপ এবং স্থির-ক্যাপচার অনুরোধগুলি পূরণ করতে আপনার ক্যাপচার অনুরোধগুলি পাঠানো উচিত।

    Camera2/X এছাড়াও SessionProcessorImpl#setParameters এর মাধ্যমে ক্যাপচার রিকোয়েস্ট প্যারামিটার সেট করে। পুনরাবৃত্তি এবং একক অনুরোধ উভয় ক্ষেত্রেই আপনাকে অবশ্যই এই অনুরোধের পরামিতিগুলি (যদি পরামিতি সমর্থিত হয়) সেট করতে হবে।

    আপনাকে অবশ্যই অন্তত CaptureRequest.JPEG_ORIENTATION এবং CaptureRequest.JPEG_QUALITY সমর্থন করতে হবে। extensions-interface 1.3.0 অনুরোধ এবং ফলাফল কী সমর্থন করে, যা নিম্নলিখিত পদ্ধতি দ্বারা উন্মুক্ত করা হয়:

    • AdvancedExtenderImpl.getAvailableCaptureRequestKeys()
    • AdvancedExtenderImpl.getAvailableCaptureResultKeys()

    যখন বিকাশকারীরা getAvailableCaptureRequestKeys তালিকায় কীগুলি সেট করে, তখন আপনাকে অবশ্যই প্যারামিটারগুলি সক্রিয় করতে হবে এবং নিশ্চিত করতে হবে যে ক্যাপচার ফলাফলে getAvailableCaptureResultKeys তালিকার কী রয়েছে৷

  5. startTrigger

    SessionProcessorImpl.startTrigger() ট্রিগার শুরু করার জন্য আহ্বান করা হয়েছে যেমন CaptureRequest.CONTROL_AF_TRIGGER এবং CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGERAdvancedExtenderImpl.getAvailableCaptureRequestKeys() এ বিজ্ঞাপন দেওয়া হয়নি এমন কোনও ক্যাপচার অনুরোধ কী আপনি উপেক্ষা করতে পারেন।

    startTrigger() extensions-interface 1.3.0 থেকে সমর্থিত হয়েছে। এটি অ্যাপ্লিকেশানগুলিকে ট্যাপ-টু-ফোকাস এবং এক্সটেনশনগুলির সাথে ফ্ল্যাশ প্রয়োগ করতে সক্ষম করে৷

  6. পরিষ্কার কর

    একটি ক্যাপচার সেশন শেষ করার সময়, CameraCaptureSession বন্ধ করার আগে SessionProcessorImpl.onCaptureSessionEnd() ডাকা হয়। ক্যাপচার সেশন বন্ধ হয়ে যাওয়ার পর, deInitSession() ক্লিন আপ করে।

সমর্থন পূর্বরূপ, এখনও ক্যাপচার, এবং চিত্র বিশ্লেষণ

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

বেসিক এক্সটেন্ডার টাইপের জন্য, প্রিভিউয়ের জন্য এক্সটেনশন সক্রিয় করা নির্বিশেষে, আপনাকে অবশ্যই একটি প্রদত্ত এক্সটেনশনের জন্য ImageCaptureExtenderImpl এবং PreviewExtenderImpl উভয়ই প্রয়োগ করতে হবে। প্রায়শই, একটি অ্যাপ একটি YUV স্ট্রিম ব্যবহার করে ছবির বিষয়বস্তু যেমন QR কোড বা টেক্সট খোঁজার মতো বিশ্লেষণ করতে। এই ব্যবহারের ক্ষেত্রে আরও ভালভাবে সমর্থন করার জন্য, আপনার পূর্বরূপের স্ট্রিম সংমিশ্রণটি সমর্থন করা উচিত, এখনও ক্যাপচার এবং CameraCaptureSession কনফিগার করার জন্য একটি YUV_420_888 স্ট্রিম। এর অর্থ হ'ল আপনি যদি কোনও প্রসেসর প্রয়োগ করেন তবে আপনাকে তিনটি YUV_420_888 স্ট্রিমের স্ট্রিম সংমিশ্রণটি সমর্থন করতে হবে।

উন্নত এক্সটেন্ডারের জন্য, ক্যামেরা 2/এক্স SessionProcessorImpl.initSession() কলটিতে তিনটি আউটপুট পৃষ্ঠতল পাস করে। এই আউটপুট পৃষ্ঠগুলি যথাক্রমে পূর্বরূপ, এখনও ক্যাপচার এবং চিত্র বিশ্লেষণের জন্য। আপনাকে অবশ্যই নিশ্চিত করতে হবে যে পূর্বরূপ এবং এখনও আউটপুট পৃষ্ঠতল ক্যাপচার বৈধ আউটপুট দেখায়। তবে, চিত্র বিশ্লেষণ আউটপুট পৃষ্ঠের জন্য, নিশ্চিত করুন যে এটি কেবল তখনই কাজ করছে। যদি আপনার বাস্তবায়ন চিত্র বিশ্লেষণ প্রবাহকে সমর্থন করতে না পারে তবে আপনি AdvancedExtenderImpl.getSupportedYuvAnalysisResolutions() এ একটি খালি তালিকা ফিরিয়ে দিতে পারেন। এটি নিশ্চিত করে যে চিত্র বিশ্লেষণ আউটপুট পৃষ্ঠটি সর্বদা SessionProcessorImpl.initSession() এ নাল থাকে।

সমর্থন ভিডিও ক্যাপচার

বর্তমান ক্যামেরা এক্সটেনশন আর্কিটেকচার কেবল পূর্বরূপকে সমর্থন করে এবং এখনও ব্যবহারের ক্ষেত্রে ক্যাপচার করে। আমরা ভিডিও রেকর্ড করার জন্য MediaCodec বা MediaRecorder পৃষ্ঠগুলিতে এক্সটেনশন সক্ষম করার পক্ষে সমর্থন করি না। তবে অ্যাপ্লিকেশনগুলির পক্ষে পূর্বরূপ আউটপুট রেকর্ড করা সম্ভব।

সমর্থনকারী MediaCodec এবং MediaRecorder পৃষ্ঠতল তদন্তাধীন।

এক্সটেনশন-নির্দিষ্ট মেটাডেটা

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

অনুরোধ ক্যাপচার

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

  • BOKEH : অস্পষ্টতার পরিমাণ নিয়ন্ত্রণ করে।
  • HDR এবং NIGHT : চিত্রের পরিমাণ এবং চূড়ান্ত চিত্রের উজ্জ্বলতা নিয়ন্ত্রণ করে।
  • FACE_RETOUCH : প্রসাধনী বর্ধন এবং ত্বকের স্মুথিংয়ের পরিমাণ নিয়ন্ত্রণ করে।

EXTENSION_STRENGTH প্যারামিটারের জন্য সমর্থিত পরিসীমা 0 এবং 100 এর মধ্যে রয়েছে, 0 টির সাথে কোনও এক্সটেনশন প্রসেসিং বা সাধারণ পাসথ্রু এবং 100 টি প্রসেসিং এফেক্টের সর্বাধিক এক্সটেনশন শক্তি নির্দেশ করে।

EXTENSION_STRENGTH জন্য সমর্থন যুক্ত করতে, এক্সটেনশন লাইব্রেরি ইন্টারফেসের সংস্করণ 1.3.0 এ প্রবর্তিত বিক্রেতার নির্দিষ্ট প্যারামিটার এপিআইগুলি ব্যবহার করুন। আরও তথ্যের জন্য, getAvailableCaptureRequestKeys() দেখুন।

ফলাফল ক্যাপচার

EXTENSION_CURRENT_TYPE টাইপ ক্যাপচার ফলাফল এক্সটেনশন বাস্তবায়নগুলি সক্রিয় এক্সটেনশন প্রকার সম্পর্কে ক্লায়েন্টদের অবহিত করতে দেয়।

যেহেতু HDR এবং NIGHT মতো এক্সটেনশন প্রকারের মধ্যে AUTO টাইপ ব্যবহার করে এক্সটেনশনগুলি দৃশ্যের শর্তগুলির উপর নির্ভর করে, ক্যামেরা এক্সটেনশন অ্যাপ্লিকেশনগুলি AUTO এক্সটেনশন দ্বারা নির্বাচিত বর্তমান এক্সটেনশন সম্পর্কে তথ্য প্রদর্শন করতে EXTENSION_CURRENT_TYPE ব্যবহার করতে পারে।

রিয়েল-টাইম এখনও বিলম্বিত অনুমান ক্যাপচার

অ্যান্ড্রয়েড 14 এবং উচ্চতর জন্য, ক্যামেরা এক্সটেনশন ক্লায়েন্টরা getRealtimeStillCaptureLatency() ব্যবহার করে দৃশ্য এবং পরিবেশের অবস্থার উপর ভিত্তি করে রিয়েল-টাইম এখনও বিলম্বের অনুমান ক্যাপচার করতে পারে। এই পদ্ধতিটি স্ট্যাটিক getEstimatedCaptureLatencyRangeMillis() পদ্ধতির চেয়ে আরও সঠিক অনুমান সরবরাহ করে। বিলম্বিত অনুমানের ভিত্তিতে, অ্যাপ্লিকেশনগুলি এক্সটেনশন প্রসেসিং এড়িয়ে যাওয়ার বা ব্যবহারকারীদের দীর্ঘকালীন চলমান অপারেশন সম্পর্কে অবহিত করার জন্য একটি ইঙ্গিত প্রদর্শন করার সিদ্ধান্ত নিতে পারে।

CameraExtensionSession.StillCaptureLatency latency;

latency = extensionSession.getRealtimeStillCaptureLatency();

// The capture latency from ExtensionCaptureCallback#onCaptureStarted() until ExtensionCaptureCallback#onCaptureProcessStarted().

latency.getCaptureLatency();

// The processing latency from  ExtensionCaptureCallback#onCaptureProcessStarted() until  the processed frame returns to the client.

latency.getProcessingLatency();

রিয়েল-টাইমকে সমর্থন করার জন্য এখনও বিলম্বের অনুমানগুলি ক্যাপচার করুন, নিম্নলিখিতগুলি প্রয়োগ করুন:

প্রক্রিয়াজাতকরণ অগ্রগতি কলব্যাক ক্যাপচার

অ্যান্ড্রয়েড 14 এবং উচ্চতর জন্য, ক্যামেরা এক্সটেনশন ক্লায়েন্টরা দীর্ঘকাল চলমান এখনও প্রসেসিং অপারেশন ক্যাপচারের অগ্রগতির জন্য কলব্যাকগুলি গ্রহণ করতে পারে। অ্যাপ্লিকেশনগুলি সামগ্রিক ব্যবহারকারীর অভিজ্ঞতা উন্নত করতে ব্যবহারকারীদের কাছে বর্তমান অগ্রগতি প্রদর্শন করতে পারে।

অ্যাপ্লিকেশনগুলি এই বৈশিষ্ট্যটি সংহত করতে নিম্নলিখিত কোডটি ব্যবহার করতে পারে:

import android.hardware.camera2.CameraExtensionSession.
ExtensionCaptureCallback;

{
…
  class AppCallbackImpl extends ExtensionCaptureCallback {
…
    @Override
    public void onCaptureProcessProgressed(
      @NonNull CameraExtensionSession session,
      @NonNull CaptureRequest request,
      @IntRange(from = 0, to = 100) int progress) {
      // Update app UI with current progress
    }
  }
…
}

ক্যাপচার প্রসেসিং প্রগ্রেস কলব্যাকগুলি সমর্থন করার জন্য, আপনার এক্সটেনশন বিক্রেতার বাস্তবায়ন অবশ্যই বর্তমান অগ্রগতি মান সহ নিম্নলিখিত কলব্যাকগুলিতে কল করতে হবে:

পোস্টভিউ এখনও ক্যাপচার

অ্যান্ড্রয়েড 14 এবং উচ্চতর জন্য, ক্যামেরা এক্সটেনশনগুলি setPostviewOutputConfiguration ব্যবহার করে একটি পোস্টভিউ (পূর্বরূপ চিত্র) সরবরাহ করতে পারে। ব্যবহারকারীর অভিজ্ঞতা উন্নত করতে, অ্যাপ্লিকেশনগুলি যখন কোনও এক্সটেনশন বর্ধিত প্রসেসিং লেটেন্সি অনুভব করে তখন কোনও স্থানধারক হিসাবে একটি পোস্টভিউ চিত্র প্রদর্শন করতে পারে এবং চূড়ান্ত চিত্রটি উপলব্ধ হলে চিত্রটি প্রতিস্থাপন করতে পারে। অ্যাপ্লিকেশনগুলি নিম্নলিখিত রেফারেন্স কোডটি ব্যবহার করে পোস্টভিউ ক্যাপচার অনুরোধগুলি কনফিগার করতে এবং জারি করতে পারে:

{
…
if (!CameraExtensionCharacteristics.isPostviewAvailable()) {
    continue;
}
…
ExtensionSessionConfiguration extensionConfiguration = new
        ExtensionSessionConfiguration(
                CameraExtensionCharacteristics.EXTENSION_NIGHT,
                outputConfig,
                backgroundExecutor,
                extensionSessionStateCallback
    );

extensionConfiguration.setPostviewOutputConfiguration(
    postviewImageOutput);
…
CaptureRequest.Builder captureRequestBuilder =
    cameraDevice.createCaptureRequest(
        CameraDevice.TEMPLATE_STILL_CAPTURE);
captureRequestBuilder.addTarget(stillImageReader.getSurface());
captureRequestBuilder.addTarget(postviewImageSurface);

CaptureRequest captureRequest = captureRequestBuilder.build();
…
}

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

সমর্থন সারফেসভিউ আউটপুট

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

SurfaceView আউটপুট সমর্থন করার জন্য, আপনার বিক্রেতার এক্সটেনশন বাস্তবায়নটি অবশ্যই স্ট্রিমিং এবং SurfaceView উদাহরণগুলিতে পূর্বরূপকে আউটপুট করতে সক্ষম হতে হবে। এটি সমর্থিত কিনা তা যাচাই করতে, SurfaceViewExtensionPreviewTest.java টেস্ট.জাভা সিটিএস মডিউলটি চালান।

বিক্রেতা নির্দিষ্ট সেশন প্রকার

বৈশিষ্ট্যটি বিক্রেতার এক্সটেনশন বাস্তবায়নগুলিকে একটি বিক্রেতার নির্দিষ্ট সেশন প্রকার নির্বাচন করতে সক্ষম করে যা ডিফল্ট মানের পরিবর্তে অভ্যন্তরীণ ক্যামেরা ক্যাপচার সেশনে সেট করা হবে।

বৈশিষ্ট্যটি পুরোপুরি কাঠামো এবং বিক্রেতার স্ট্যাকের মধ্যে কাজ করে এবং কোনও ক্লায়েন্ট/পাবলিক দৃশ্যমান এপিআই প্রভাব নেই।

একটি বিক্রেতা-নির্দিষ্ট সেশন প্রকার নির্বাচন করতে, আপনার এক্সটেনশন লাইব্রেরির জন্য নিম্নলিখিতগুলি প্রয়োগ করুন: * বেসিক এক্সটেনশনের জন্য * ExtenderStateListener.onSessionType() Camera2SessionConfigImpl.getSessionType()

এক্সটেনশন ইন্টারফেস সংস্করণ ইতিহাস

নিম্নলিখিত টেবিলটি ক্যামেরা এক্সটেনশন ইন্টারফেস সংস্করণ ইতিহাস দেখায়। আপনার সর্বদা সর্বশেষ সংস্করণ সহ বিক্রেতার লাইব্রেরিটি প্রয়োগ করা উচিত।

সংস্করণ বৈশিষ্ট্য যোগ করা হয়েছে
1.0.0
  • সংস্করণ যাচাইকরণ
    • ExtensionVersionImpl
  • বেসিক এক্সটেন্ডার
    • PreviewExtenderImpl
    • ImageCaptureExtenderImpl
    • Processor
      • PreviewImageProcessorImpl
      • CaptureProcessorImpl
      • RequestUpdateProcessorImpl
1.1.0
  • গ্রন্থাগার সূচনা
    • InitializerImpl
  • সমর্থিত রেজোলিউশনগুলি প্রকাশ করুন
    • PreviewExtenderImpl.getSupportedResolutions
    • ImageCaptureExtenderImpl.getSupportedResolutions
1.2.0
  • অ্যাডভান্সডেক্সটেন্ডার
    • AdvancedExtenderImpl
    • SessionProcessorImpl
  • আনুমানিক ক্যাপচার বিলম্বিতা পান
    • ImageCaptureExtenderImpl.getEstimatedCaptureLatencyRange
1.3.0
  • সমর্থিত ক্যাপচার অনুরোধ কী/ফলাফল কীগুলি প্রকাশ করুন
    • ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys এবং getAvailableCaptureResultKeys
    • AdvancedExtenderImpl.getAvailableCaptureRequestKeys এবং getAvailableCaptureResultKeys
    • নতুন process() কল করুন যা PreviewImageProcessorImpl এবং CaptureProcessorImplProcessResultImpl গ্রহণ করে
    • সমর্থন ট্রিগার টাইপ অনুরোধ
      • AdvancedExtenderImpl.startTrigger
1.4.0
  • এক্সটেনশন-নির্দিষ্ট মেটাডেটা
  • গতিশীল এখনও বিলম্বের অনুমান ক্যাপচার
  • প্রক্রিয়াজাতকরণ অগ্রগতি কলব্যাক ক্যাপচার
  • পোস্টভিউ এখনও ক্যাপচার
  • SurfaceView আউটপুট জন্য সমর্থন
  • বিক্রেতা নির্দিষ্ট সেশন প্রকার

রেফারেন্স বাস্তবায়ন

নিম্নলিখিত রেফারেন্স ওএম বিক্রেতার লাইব্রেরি বাস্তবায়নগুলি frameworks/ex এ উপলব্ধ।

  • advancedSample : অ্যাডভান্সড এক্সটেন্ডারের একটি প্রাথমিক বাস্তবায়ন।

  • sample : বেসিক এক্সটেন্ডারের একটি প্রাথমিক বাস্তবায়ন।

  • service_based_sample : একটি বাস্তবায়ন যা কোনও Service ক্যামেরা এক্সটেনশনগুলি কীভাবে হোস্ট করতে হয় তা প্রদর্শন করে। এই বাস্তবায়নে নিম্নলিখিত উপাদানগুলি রয়েছে:

    • oem_library : ক্যামেরা 2 এবং ক্যামেরাক্স এক্সটেনশন এপিআইগুলির জন্য একটি ক্যামেরা এক্সটেনশন ওএম লাইব্রেরি যা Extensions-Interface প্রয়োগ করে। এটি এমন একটি পাসথ্রু হিসাবে কাজ করে যা Extensions-Interface থেকে পরিষেবাতে কল করে। এই লাইব্রেরিটি পরিষেবার সাথে যোগাযোগের জন্য এইডএল ফাইল এবং মোড়ক ক্লাসও সরবরাহ করে।

      উন্নত এক্সটেন্ডার ডিফল্টরূপে সক্ষম হয়। বেসিক এক্সটেন্ডার সক্ষম করতে, ExtensionsVersionImpl#isAdvancedExtenderImplemented false ফেরত দিতে পরিবর্তন করুন।

    • extensions_service : এক্সটেনশন পরিষেবাগুলির একটি নমুনা বাস্তবায়ন। আপনার বাস্তবায়ন এখানে যুক্ত করুন। পরিষেবাতে প্রয়োগের ইন্টারফেসটি Extensions-Interface অনুরূপ। উদাহরণস্বরূপ, IAdvancedExtenderImpl.Stub বাস্তবায়ন AdvancedExtenderImpl এর মতো একই ক্রিয়াকলাপ সম্পাদন করে। ImageWrapper এবং TotalCaptureResultWrapper Image এবং TotalCaptureResult পার্সেলেবল তৈরি করতে প্রয়োজন।

একটি ডিভাইসে বিক্রেতার লাইব্রেরি সেট আপ করুন

ওএম বিক্রেতার গ্রন্থাগারটি কোনও অ্যাপে নির্মিত হয়নি; এটি ক্যামেরা 2/এক্স দ্বারা রানটাইমে ডিভাইস থেকে লোড হয়েছে। ক্যামেরাক্সে, <uses-library> ট্যাগটি ঘোষণা করে যে androidx.camera.extensions.impl লাইব্রেরি, যা camera-extensions লাইব্রেরির AndroidManifest.xml ফাইলটিতে সংজ্ঞায়িত করা হয়েছে, ক্যামেরাক্সের একটি নির্ভরতা এবং রানটাইমে লোড করা আবশ্যক। ক্যামেরা 2-এ, ফ্রেমওয়ার্কটি একটি এক্সটেনশান পরিষেবা লোড করে যা ঘোষণা করে যে <uses-library> একই androidx.camera.extensions.impl লাইব্রেরি রানটাইমে লোড করে।

এটি তৃতীয় পক্ষের অ্যাপ্লিকেশনগুলিকে এক্সটেনশনগুলি ব্যবহার করে স্বয়ংক্রিয়ভাবে OEM বিক্রেতার লাইব্রেরি লোড করতে অনুমতি দেয়। ওএম লাইব্রেরিটি al চ্ছিক হিসাবে চিহ্নিত করা হয়েছে যাতে অ্যাপ্লিকেশনগুলি ডিভাইসে লাইব্রেরিটি না থাকে এমন ডিভাইসে চলতে পারে। ক্যামেরা 2/এক্স এই আচরণটি স্বয়ংক্রিয়ভাবে পরিচালনা করে যখন কোনও অ্যাপ্লিকেশন যতক্ষণ না ডিভাইস প্রস্তুতকারক ডিভাইসে ওএম লাইব্রেরিটি রাখে ততক্ষণ কোনও ক্যামেরা এক্সটেনশন ব্যবহার করার চেষ্টা করে যাতে এটি অ্যাপ্লিকেশন দ্বারা আবিষ্কার করা যায়।

কোনও ডিভাইসে ওএম লাইব্রেরি সেট আপ করতে, নিম্নলিখিতগুলি করুন:

  1. নিম্নলিখিত ফর্ম্যাটটি ব্যবহার করে <uses-library> ট্যাগ দ্বারা প্রয়োজনীয় একটি অনুমতি ফাইল যুক্ত করুন: /etc/permissions/ ANY_FILENAME .xml । উদাহরণস্বরূপ, /etc/permissions/camera_extensions.xml । এই ডিরেক্টরিতে থাকা ফাইলগুলি ডিভাইসের প্রকৃত ফাইলের পথে <uses-library> নামক লাইব্রেরির একটি ম্যাপিং সরবরাহ করে।
  2. ফাইলটিতে প্রয়োজনীয় তথ্য যুক্ত করতে নীচের উদাহরণটি ব্যবহার করুন।

    • name অবশ্যই androidx.camera.extensions.impl হতে হবে এটি এমন লাইব্রেরিটি যা ক্যামেরাক্স অনুসন্ধান করে।
    • file হ'ল ফাইলের নিখুঁত পথ যা এক্সটেনশনগুলি বাস্তবায়ন ধারণ করে (উদাহরণস্বরূপ, /system/framework/androidx.camera.extensions.impl.jar অ্যান্ড্রয়েডএক্স.কামেরা.এক্সটেনশনস.আইএমপিএল.জার)।
    <?xml version="1.0" encoding="utf-8"?>
    <permissions>
        <library name="androidx.camera.extensions.impl"
                 file="OEM_IMPLEMENTED_JAR" />
    </permissions>
    

অ্যান্ড্রয়েড 12 বা ততোধিক, ক্যামেরাক্স এক্সটেনশানগুলিকে সমর্থনকারী ডিভাইসগুলির অবশ্যই ro.camerax.extensions.enabled সম্পত্তি true সেট করতে হবে, যা কোনও ডিভাইস এক্সটেনশানগুলিকে সমর্থন করে কিনা তা জিজ্ঞাসা করার অনুমতি দেয়। এটি করতে, ডিভাইসে নিম্নলিখিত লাইনটি যুক্ত করুন ফাইল করুন:

PRODUCT_VENDOR_PROPERTIES += \
    ro.camerax.extensions.enabled=true \

বৈধতা

উন্নয়নের পর্যায়ে ওএম বিক্রেতার লাইব্রেরির আপনার বাস্তবায়ন পরীক্ষা করতে, androidx-main/camera/integration-tests/extensionstestapp/ এ উদাহরণ অ্যাপটি ব্যবহার করুন, যা বিভিন্ন বিক্রেতার এক্সটেনশনের মধ্য দিয়ে চলে।

আপনি আপনার বাস্তবায়ন শেষ করার পরে, বিক্রেতার লাইব্রেরিটি সঠিকভাবে প্রয়োগ করা হয়েছে তা যাচাই করতে স্বয়ংক্রিয় এবং ম্যানুয়াল পরীক্ষা চালানোর জন্য ক্যামেরা এক্সটেনশন বৈধকরণ সরঞ্জামটি ব্যবহার করুন।

বর্ধিত দৃশ্য মোড বনাম ক্যামেরা এক্সটেনশন

বোকেহ এক্সটেনশনের জন্য, ক্যামেরা এক্সটেনশনগুলি ব্যবহার করে এটি প্রকাশ করার পাশাপাশি আপনি বর্ধিত দৃশ্য মোডটি ব্যবহার করে এক্সটেনশনটি প্রকাশ করতে পারেন, যা CONTROL_EXTENDED_SCENE_MODE কী এর মাধ্যমে সক্ষম করা হয়েছে। আরও বাস্তবায়নের তথ্যের জন্য, ক্যামেরা বোকেহ দেখুন।

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

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

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

প্রায়শই জিজ্ঞাসিত প্রশ্ন (FAQs)

এপিআই স্তরে কোনও বিধিনিষেধ রয়েছে?

হ্যাঁ. এটি অ্যান্ড্রয়েড এপিআই বৈশিষ্ট্য সেটের উপর নির্ভর করে যা ওএম বিক্রেতা লাইব্রেরি বাস্তবায়নের দ্বারা প্রয়োজনীয়। উদাহরণস্বরূপ, এক্সটেন্ডারস্টেটলিস্টনার.অনপ্রেসেটসেশন SessionConfiguration.setSessionParameters() ExtenderStateListener.onPresetSession() সেশন কনফিগারেশন ব্যবহার করে S এই কলটি কেবল এপিআই স্তর 28 এবং উচ্চতর উপলভ্য। নির্দিষ্ট ইন্টারফেস পদ্ধতির বিশদগুলির জন্য, এপিআই রেফারেন্স ডকুমেন্টেশন দেখুন।