Camera2 এক্সটেনশন API

দ্রষ্টব্য: এই পৃষ্ঠাটি Camera2 প্যাকেজকে বোঝায়। আপনার অ্যাপের Camera2 থেকে নির্দিষ্ট, নিম্ন-স্তরের বৈশিষ্ট্যের প্রয়োজন না হলে, আমরা CameraX ব্যবহার করার পরামর্শ দিই। CameraX এবং Camera2 উভয়ই Android 5.0 (API স্তর 21) এবং উচ্চতর সমর্থন করে।

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

এক্সটেনশন সমর্থন করে এমন ডিভাইসগুলির একটি তালিকার জন্য, সমর্থিত ডিভাইসগুলি দেখুন।

এক্সটেনশন আর্কিটেকচার

নিচের ছবিটি ক্যামেরা এক্সটেনশনের আর্কিটেকচার দেখায়।

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

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

Camera2 এক্সটেনশন API সামঞ্জস্যের জন্য একটি ক্যামেরা ডিভাইস পরীক্ষা করুন

ডিভাইসটি Camera2 এক্সটেনশন API সমর্থন করে কিনা তা নিচের কোড স্নিপেট চেক করে। এক্সটেনশনগুলি সমস্ত ডিভাইস দ্বারা সমর্থিত নয় বা ডিভাইসটি এক্সটেনশনের একটি উপসেট সমর্থন করতে পারে৷ স্নিপেট সামঞ্জস্যপূর্ণ ক্যামেরা আইডিগুলির একটি তালিকা প্রদান করে যা ক্যামেরা এক্সটেনশন সমর্থন করে।

কোটলিন


private fun getExtensionCameraIds(cameraManager: CameraManager): List<String> =
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        cameraManager.cameraIdList.filter { cameraId ->
            val characteristics = cameraManager.getCameraCharacteristics(cameraId)
            val extensionCharacteristics =
                cameraManager.getCameraExtensionCharacteristics(cameraId)
            val capabilities =
                characteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES)
            extensionCharacteristics.supportedExtensions.isNotEmpty() &&
                    capabilities?.contains(
                        CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE
                    ) ?: false
        }
    } else emptyList()

জাভা


private List<String> getExtensionCameraIds(CameraManager cameraManager)
        throws CameraAccessException {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        return Arrays.stream(cameraManager.getCameraIdList()).filter(cameraId -> {
            try {
                CameraCharacteristics characteristics =
                        cameraManager.getCameraCharacteristics(cameraId);
                CameraExtensionCharacteristics extensionCharacteristics =
                        cameraManager.getCameraExtensionCharacteristics(cameraId);
                IntStream capabilities =
                    Arrays.stream(
                                characteristics.get(
                                        CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES
                                )
                        );
                return !extensionCharacteristics.getSupportedExtensions().isEmpty() &&
                       capabilities.anyMatch(capability -> capability == CameraCharacteristics
                                        .REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE
                        );
            } catch (CameraAccessException e) {
                throw new RuntimeException(e);
            }
        }).collect(Collectors.toList());
    } else {
        return Collections.emptyList();
    }
}

Camera2 এক্সটেনশন API দিয়ে একটি ক্যামেরা এক্সটেনশন সেশন তৈরি করুন

Camera2 এক্সটেনশন API, যখন সামঞ্জস্যপূর্ণ ডিভাইসগুলির সাথে ব্যবহার করা হয়, তখন আপনাকে নির্দিষ্ট ক্যামেরা এক্সটেনশনগুলি অ্যাক্সেস করতে দেয়৷ নিম্নলিখিত কোড স্নিপেট একটি বিদ্যমান Camera2 অ্যাপ্লিকেশনের জন্য নাইট ক্যাপচার মোড ব্যবহার করার জন্য কিভাবে একটি CameraExtensionSession তৈরি করতে হয় তার একটি উদাহরণ দেখায়৷

কোটলিন


private val captureCallbacks = object : CameraExtensionSession.ExtensionCaptureCallback() {
    // Implement Capture Callbacks
}
private val extensionSessionStateCallback = object : CameraExtensionSession.StateCallback() {
    override fun onConfigured(session: CameraExtensionSession) {
        cameraExtensionSession = session
        try {
            val captureRequest =
                cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW).apply {
                    addTarget(previewSurface)
                }.build()
            session.setRepeatingRequest(
                captureRequest,
                Dispatchers.IO.asExecutor(),
                captureCallbacks
            )
        } catch (e: CameraAccessException) {
            Snackbar.make(
                previewView,
                "Failed to preview capture request",
                Snackbar.LENGTH_SHORT
            ).show()
            requireActivity().finish()
        }
    }

    override fun onClosed(session: CameraExtensionSession) {
        super.onClosed(session)
        cameraDevice.close()
    }

    override fun onConfigureFailed(session: CameraExtensionSession) {
        Snackbar.make(
            previewView,
            "Failed to start camera extension preview",
            Snackbar.LENGTH_SHORT
        ).show()
        requireActivity().finish()
    }
}

private fun startExtensionSession() {
    val outputConfig = arrayListOf(
        OutputConfiguration(stillImageReader.surface),
        OutputConfiguration(previewSurface)
    )
    val extensionConfiguration = ExtensionSessionConfiguration(
        CameraExtensionCharacteristics.EXTENSION_NIGHT,
        outputConfig,
        Dispatchers.IO.asExecutor(),
        extensionSessionStateCallback
    )
    cameraDevice.createExtensionSession(extensionConfiguration)
}

জাভা


private CameraExtensionSession.ExtensionCaptureCallback captureCallbacks =
        new CameraExtensionSession.ExtensionCaptureCallback() {
            // Implement Capture Callbacks
        };

private CameraExtensionSession.StateCallback extensionSessionStateCallback =
        new CameraExtensionSession.StateCallback() {
            @Override
            public void onConfigured(@NonNull CameraExtensionSession session) {
                cameraExtensionSession = session;
                try {
                    CaptureRequest.Builder captureRequestBuilder =
                            cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
                    captureRequestBuilder.addTarget(previewSurface);
                    CaptureRequest captureRequest = captureRequestBuilder.build();
                    session.setRepeatingRequest(captureRequest, backgroundExecutor, captureCallbacks);
                } catch (CameraAccessException e) {
                    Snackbar.make(
                            previewView,
                            "Failed to preview capture request",
                            Snackbar.LENGTH_SHORT
                    ).show();
                    requireActivity().finish();
                }
            }

            @Override
            public void onClosed(@NonNull CameraExtensionSession session) {
                super.onClosed(session);
                cameraDevice.close();
            }

            @Override
            public void onConfigureFailed(@NonNull CameraExtensionSession session) {
                Snackbar.make(
                        previewView,
                        "Failed to start camera extension preview",
                        Snackbar.LENGTH_SHORT
                ).show();
                requireActivity().finish();
            }
        };

private void startExtensionSession() {
    ArrayList<OutputConfiguration> outputConfig = new ArrayList<>();
    outputConfig.add(new OutputConfiguration(stillImageReader.getSurface()));
    outputConfig.add(new OutputConfiguration(previewSurface));
    ExtensionSessionConfiguration extensionConfiguration = new ExtensionSessionConfiguration(
            CameraExtensionCharacteristics.EXTENSION_NIGHT,
            outputConfig,
            backgroundExecutor,
            extensionSessionStateCallback
    );
}

অতিরিক্ত সম্পদ

আরও তথ্যের জন্য, CameraExtensionCharacteristics দেখুন এবং আরও জন্য সর্বজনীন Camera2 এক্সটেনশন API নমুনাগুলি দেখুন৷