প্রোডাক্ট সংক্রান্ত খবর

CameraX 1.5-এর সাথে পরিচয়: শক্তিশালী ভিডিও রেকর্ডিং এবং প্রো-লেভেল ইমেজ ক্যাপচার

৭ মিনিট লাগবে
Scott Nien-এর প্রোফাইল দেখুন
Scott Nien সফ্টওয়্যার ইঞ্জিনিয়ার

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

ভিডিও রেকর্ডিংয়ের জন্য, ব্যবহারকারীরা এখন সহজেই অত্যাশ্চর্য স্লো-মোশন বা হাই-ফ্রেম-রেট ভিডিও ক্যাপচার করতে পারবেন। আরও গুরুত্বপূর্ণ হল, নতুন ফিচার গ্রুপ API আপনাকে ১০-বিট HDR এবং ৬০ FPS-এর মতো জটিল কম্বিনেশন আত্মবিশ্বাসের সাথে চালু করতে দেয়, যা কাজ করে এমন ডিভাইস জুড়ে একই ধরনের ফলাফল নিশ্চিত করে।

ইমেজ ক্যাপচার করার ক্ষেত্রে, আপনি প্রসেস না করা, কম্প্রেস না করা DNG (RAW) ফাইল ক্যাপচার করার জন্য সর্বাধিক সুবিধা পাবেন। এছাড়াও, আপনি এখন শক্তিশালী ক্যামেরা এক্সটেনশন ব্যবহার করার সময়ও Ultra HDR আউটপুট ব্যবহার করতে পারবেন।

এইসব ফিচারের ভিত্তি হল নতুন SessionConfig API, যা ক্যামেরা সেট-আপ ও রিকনফিগারেশনকে আরও সহজ করে তোলে। এখন, আসুন এই নতুন ফিচারগুলি সম্পর্কে বিস্তারিত জেনে নেওয়া যাক।

শক্তিশালী ভিডিও রেকর্ডিং: হাই-স্পিড ও ফিচারের কম্বিনেশন

CameraX 1.5 উল্লেখযোগ্যভাবে তার ভিডিও ক্ষমতা প্রসারিত করে, আরও সৃজনশীল এবং শক্তিশালী রেকর্ডিং অভিজ্ঞতা সক্ষম করে।

স্লো মোশন ও হাই ফ্রেম রেট ভিডিও

আমাদের সবচেয়ে প্রত্যাশিত ফিচারগুলির মধ্যে একটি, স্লো-মোশন ভিডিও, এখন উপলভ্য। আপনি এখন হাই-স্পিড ভিডিও (যেমন, ১২০ বা ২৪০ fps) ক্যাপচার করতে এবং সরাসরি একটি ড্রামাটিক স্লো-মোশন ভিডিওতে এনকোড করতে পারবেন। অন্যথায়, আপনি একই বেশি ফ্রেম রেটে রেকর্ড করতে পারেন যাতে ভিডিওটি অত্যন্ত মসৃণ হয়।

আপনি VideoCapture API সম্পর্কে জানলে, এটি প্রয়োগ করা সহজ।

১. হাই-স্পিড সাপোর্ট চেক করুন: ডিভাইসটি এই ফিচার সাপোর্ট করে কিনা তা কোয়েরি করতে নতুন Recorder.getHighSpeedVideoCapabilities() পদ্ধতি ব্যবহার করুন।

val cameraInfo = cameraProvider.getCameraInfo(cameraSelector)

val highSpeedCapabilities = Recorder.getHighSpeedVideoCapabilities(cameraInfo)

if (highSpeedCapabilities == null) {
    // This camera device does not support high-speed video.
    return
}

২. ব্যবহারের ক্ষেত্র কনফিগার ও বাইন্ড করুন: HighSpeedVideoSessionConfig তৈরি করতে, ফেরত আসা videoCapabilities (যেটিতে কাজ করে এমন ভিডিও কোয়ালিটি সংক্রান্ত তথ্য থাকে) ব্যবহার করুন। তারপর আপনাকে cameraInfo.getSupportedFrameRateRanges()-এর মাধ্যমে কাজ করে এমন ফ্রেম রেট রেঞ্জ কোয়েরি করতে হবে এবং পছন্দসই রেঞ্জ সেট করতে হবে। স্লো মোশন ভিডিও রেকর্ড করতে setSlowMotionEnabled(true) কল করুন, অন্যথায় এটি হাই-ফ্রেম-রেট ভিডিও রেকর্ড করবে। ভিডিও রেকর্ডিং শুরু করার জন্য শেষ ধাপ হল, সাধারণ Recorder.prepareRecording().start() ব্যবহার করা।

val preview = Preview.Builder().build()
val quality = highSpeedCapabilities
        .getSupportedQualities(DynamicRange.SDR).first()

val recorder = Recorder.Builder()
      .setQualitySelector(QualitySelector.from(quality)))
      .build()

val videoCapture = VideoCapture.withOutput(recorder)

val frameRateRange = cameraInfo.getSupportedFrameRateRanges(      
       HighSpeedVideoSessionConfig(videoCapture, preview)
).first()

val sessionConfig = HighSpeedVideoSessionConfig(
    videoCapture, 
    preview, 
    frameRateRange = frameRateRange, 
    // Set true for slow-motion playback, or false for high-frame-rate
    isSlowMotionEnabled = true
)

cameraProvider.bindToLifecycle(
     lifecycleOwner, cameraSelector, sessionConfig)

// Start recording slow motion videos. 
val recording = recorder.prepareRecording(context, outputOption)
      .start(executor, {})

মানানসই ও সীমাবদ্ধতা

হাই-স্পিড রেকর্ডিংয়ের জন্য নির্দিষ্ট CameraConstrainedHighSpeedCaptureSession এবং CamcorderProfile সাপোর্ট প্রয়োজন। ব্যবহারকারীর অভিজ্ঞতা যাতে খারাপ না হয়, তার জন্য সবসময় ক্যাপাবিলিটি চেক করুন এবং শুধুমাত্র কাজ করে এমন ডিভাইসে হাই-স্পিড রেকর্ডিং চালু করুন। বর্তমানে, এই ফিচার প্রায় সব Pixel ডিভাইসের রিয়ার ক্যামেরা এবং অন্যান্য প্রস্তুতকারকের বেছে নেওয়া মডেলে কাজ করে।

আরও জানতে ব্লগ পোস্ট দেখুন।

ফিচার গ্রুপ API: আত্মবিশ্বাসের সাথে ফিচার একত্রিত করুন

CameraX 1.5-এ ফিচার গ্রুপ API নিয়ে আসা হয়েছে, যা ফিচার মানানসই কিনা তা অনুমান করার প্রয়োজনীয়তা দূর করে। Android 15-এর ফিচার কম্বিনেশন কোয়েরি API-এর উপর ভিত্তি করে, আপনি এখন একসাথে একাধিক ফিচার চালু করতে পারবেন এবং এর ফলে ক্যামেরা সেশন স্টেবল থাকবে। ফিচার গ্রুপ বর্তমানে এগুলি সাপোর্ট করে: HDR (HLG), ৬০ fps, প্রিভিউ স্টেবিলাইজেশন ও আলট্রা HDR। যেমন, আপনি Pixel 10 এবং Galaxy S25 সিরিজে একসাথে HDR, ৬০ fps এবং প্রিভিউ স্ট্যাবিলাইজেশন চালু করতে পারবেন। ভবিষ্যতে 4K রেকর্ডিং ও আল্ট্রা-ওয়াইড জুমের মতো ফিচার যোগ করার পরিকল্পনা করা হয়েছে। 

ফিচার গ্রুপ API দুটি গুরুত্বপূর্ণ ব্যবহারের ক্ষেত্রে সাহায্য করে:

ব্যবহারের ক্ষেত্র ১: সেরা কোয়ালিটিকে অগ্রাধিকার দেওয়া

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

val sessionConfig = SessionConfig(
    useCases = listOf(preview, videoCapture),
    preferredFeatureGroup = listOf(
        GroupableFeature.HDR_HLG10,
        GroupableFeature.FPS_60,
        GroupableFeature.PREVIEW_STABILIZATION
    )
).apply {
    // (Optional) Get a callback with the enabled features to update your UI.
    setFeatureSelectionListener { selectedFeatures ->
        updateUiIndicators(selectedFeatures)
    }
}
processCameraProvider.bindToLifecycle(activity, cameraSelector, sessionConfig)

এই উদাহরণে, CameraX এই ক্রমে ফিচার চালু করার চেষ্টা করে:

  1. HDR + ৬০ FPS + প্রিভিউ স্টেবিলাইজেশন
  2. HDR + ৬০ FPS
  3. HDR + প্রিভিউ স্টেবিলাইজেশন
  4. HDR
  5. ৬০ FPS + প্রিভিউ স্টেবিলাইজেশন
  6. ৬০ FPS
  7. প্রিভিউ স্টেবিলাইজেশন
  8. কোনওটিই নয়

ব্যবহারের উদাহরণ ২: ব্যবহারকারী নিজে ইন্টার‌্যাক্ট করতে পারেন এমন সেটিংস UI তৈরি করা

আপনার অ্যাপের সেটিংস UI-তে কোন কোন ফিচারের কম্বিনেশন কাজ করে তা এখন আপনি সঠিকভাবে দেখাতে পারবেন। এর জন্য নিচের ছবির মতো কাজ না করা বিকল্পের টগল বন্ধ করে দিতে হবে। 

unsupported-features-disabled.gif

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

fun disableFeatureIfNotSuported(
   enabledFeatures: Set<GroupableFeature>,     
   featureToCheck:GroupableFeature
) {
 val sessionConfig = SessionConfig(
     useCases = useCases,
     requiredFeatureGroup = enabledFeatures + featureToCheck
 )
 val isSupported = cameraInfo.isFeatureGroupSupported(sessionConfig)

 if (!isSupported) {
     // disable the toggle for featureToCheck
 }
}

আরও তথ্যের জন্য ফিচার গ্রুপ ব্লগ পোস্ট দেখুন। 

আরও ভিডিও এনহ্যান্সমেন্ট

  • কনকারেন্ট ক্যামেরা সংক্রান্ত উন্নতি: CameraX 1.5.1-এর মাধ্যমে, আপনি এখন নন-কম্পোজিশন মোডে প্রতিটি SingleCameraConfig-এর জন্য প্রিভিউ + ImageCapture + VideoCapture ব্যবহারের কেস একসাথে বাইন্ড করতে পারবেন। এছাড়াও, কম্পোজিশন মোডে (CompositionSettings-এর সাথে একই ধরনের ব্যবহার),  আপনি এখন CameraEffect সেট করতে পারবেন যা চূড়ান্ত কম্পোজিশন ফলাফলে প্রয়োগ করা হয়।
  • ডায়নামিক মিউট করা: আপনি এখন PendingRecording.withAudioEnabled(boolean initialMuted) ব্যবহার করে মিউট করা অবস্থায় রেকর্ডিং শুরু করতে পারবেন এবং ব্যবহারকারীকে পরে Recording.mute(boolean muted) ব্যবহার করে আনমিউট করার অনুমতি দিতে পারবেন।
  • স্টোরেজ কম থাকার সমস্যা আরও ভালোভাবে ম্যানেজ করা: CameraX এখন নির্ভরযোগ্যভাবে VideoRecordEvent.Finalize.ERROR_INSUFFICIENT_STORAGE সমস্যা ডিসপ্যাচ করে, যার ফলে আপনার অ্যাপ স্টোরেজ কম থাকার সমস্যা আরও ভালোভাবে ম্যানেজ করতে এবং ব্যবহারকারীকে জানাতে পারে।
  • লো লাইট বুস্ট: কাজ করে এমন ডিভাইসে (যেমন Pixel 10 সিরিজ), অন্ধকার পরিবেশে প্রিভিউ ও ভিডিও স্ট্রিম অটোমেটিক উজ্জ্বল করতে আপনি CameraControl.enableLowLightBoostAsync চালু করতে পারবেন।

পেশাদার-গ্রেড ইমেজ ক্যাপচার

CameraX 1.5, ImageCapture-এ বড় ধরনের আপগ্রেড নিয়ে এসেছে, যা ডেভেলপারদের জন্য সর্বাধিক কোয়ালিটি ও নমনীয়তা প্রদান করে।

DNG (RAW) ক্যাপচারের মাধ্যমে ক্রিয়েটিভ কন্ট্রোলকে মেলে ধরুন

পোস্ট-প্রসেসিংয়ের উপর সম্পূর্ণ কন্ট্রোল পেতে, CameraX এখন DNG (RAW) ক্যাপচার করতে পারে। এটি আপনাকে সরাসরি ক্যামেরা সেন্সর থেকে প্রসেস না করা, কম্প্রেস না করা ছবির ডেটা অ্যাক্সেস করতে দেয়, যা পেশাদার-গ্রেডের এডিটিং এবং কালার গ্রেডিংয়ের সুবিধা দেয়। API শুধুমাত্র DNG ফাইল ক্যাপচার করতে পারে অথবা একই সাথে JPEG ও DNG আউটপুট ক্যাপচার করতে পারে। JPEG ও DNG ফাইল একসাথে কীভাবে ক্যাপচার করবেন তা জানতে নিচে দেওয়া স্যাম্পেল কোড দেখুন।

val capabilities = ImageCapture.getImageCaptureCapabilities(cameraInfo)
val imageCapture = ImageCapture.Builder().apply {
    if (capabilities.supportedOutputFormats
             .contains(OUTPUT_FORMAT_RAW_JPEG)) {
        // Capture both RAW and JPEG formats.
        setOutputFormat(OUTPUT_FORMAT_RAW_JPEG)
    }
}.build()
// ... bind imageCapture to lifecycle ...


// Provide separate output options for each format.
val outputOptionRaw = /* ... configure for image/x-adobe-dng ... */
val outputOptionJpeg = /* ... configure for image/jpeg ... */
imageCapture.takePicture(
    outputOptionRaw,
    outputOptionJpeg,
    executor,
    object : ImageCapture.OnImageSavedCallback {
        override fun onImageSaved(results: OutputFileResults) {
            // This callback is invoked twice: once for the RAW file
            // and once for the JPEG file.
        }

        override fun onError(exception: ImageCaptureException) {}
    }
)

ক্যামেরা এক্সটেনশনের জন্য আলট্রা HDR

দুটি জগতেরই সেরাটি পান: ক্যামেরা এক্সটেনশনের (যেমন নাইট মোড) অত্যাশ্চর্য কম্পিউটেশনাল ফটোগ্রাফি এবং আলট্রা HDR-এর উজ্জ্বল রঙ ও ডায়নামিক রেঞ্জের সংমিশ্রণ। এই ফিচার এখন Pixel 9/10 সিরিজ এবং Samsung S24/S25 সিরিজের মতো সাম্প্রতিক অনেক প্রিমিয়াম Android ফোনে কাজ করে।

// Support UltraHDR when Extension is enabled. 

val extensionsEnabledCameraSelector = extensionsManager
     .getExtensionEnabledCameraSelector(
        CameraSelector.DEFAULT_BACK_CAMERA, ExtensionMode.NIGHT)

val imageCapabilities = ImageCapture.getImageCaptureCapabilities(
               cameraProvider.getCameraInfo(extensionsEnabledCameraSelector)

val imageCapture = ImageCapture.Builder()
     .apply {
       if (imageCapabilities.supportedOutputFormats
                .contains(OUTPUT_FORMAT_JPEG_ULTRA_HDR) {
           setOutputFormat(OUTPUT_FORMAT_JPEG_ULTRA_HDR)

       }

     }.build()

কোর API এবং ব্যবহারযোগ্যতা বাড়ানো

কনফিগার করার নতুন উপায়: SessionConfig

উপরের উদাহরণে যেমন দেখানো হয়েছে, SessionConfig হল CameraX 1.5-এর একটি নতুন ধারণা। এটি কনফিগারেশনকে কেন্দ্রীভূত করে এবং দুটি মূল উপায়ে API-কে সহজ করে:

  1. আর কোনও ম্যানুয়াল unbind() কল নয়: CameraX API লাইফসাইকেল-সচেতন। অ্যাক্টিভিটি বা অন্য LifecycleOwner নষ্ট হয়ে গেলে এটি আপনার ব্যবহারের কেসকে অন্তর্নিহিতভাবে "আনবাইন্ড" করবে। তবে, ব্যবহারের ক্ষেত্রে আপডেট করা বা ক্যামেরা পরিবর্তন করার জন্য এখনও আপনাকে আবার বাইন্ড করার আগে unbind() বা unbindAll() কল করতে হবে। এখন CameraX 1.5-এর মাধ্যমে, আপনি নতুন SessionConfig বাইন্ড করলে, CameraX আপনার জন্য সেশন নির্বিঘ্নে আপডেট করে, যার ফলে আনবাইন্ড কলের প্রয়োজন হয় না।
  2. নির্ধারক ফ্রেম রেট কন্ট্রোল: নতুন SessionConfig API ফ্রেম রেট ম্যানেজ করার জন্য একটি নির্ধারক পদ্ধতি চালু করেছে। আগের setTargetFrameRate-এর মতো নয়, যা শুধুমাত্র একটি ইঙ্গিত ছিল, এই নতুন পদ্ধতি গ্যারান্টি দেয় যে নির্দিষ্ট করা ফ্রেম রেট রেঞ্জ সফল কনফিগারেশনের পরে প্রয়োগ করা হবে। সঠিক তথ্য পেতে, আপনাকে অবশ্যই CameraInfo.getSupportedFrameRateRanges(SessionConfig) ব্যবহার করে কাজ করে এমন ফ্রেম রেট কোয়েরি করতে হবে। সম্পূর্ণ SessionConfig পাস করার মাধ্যমে, CameraX স্ট্রিম কনফিগারেশনের উপর ভিত্তি করে কাজ করে এমন রেঞ্জ সঠিকভাবে নির্ধারণ করতে পারে।

Camera-Compose এখন স্টেবল

আমরা জানি যে আপনি Jetpack Compose কতটা উপভোগ করেন এবং আমরা আনন্দের সাথে ঘোষণা করছি যে camera-compose লাইব্রেরি এখন 1.5.1 ভার্সনে স্টেবল! এই রিলিজে CameraXViewfinder-এর সাথে moveableContentOf ও Pager-এর মতো Compose ফিচার ব্যবহার করার সময় হওয়া গুরুতর সমস্যার সমাধান করা হয়েছে এবং প্রিভিউ স্ট্রেচিং সংক্রান্ত সমস্যারও সমাধান করা হয়েছে। ভবিষ্যতে রিলিজের সময় আমরা camera-compose-এ আরও ফিচার যোগ করা চালিয়ে যাব।

ImageAnalysis ও CameraControl সংক্রান্ত উন্নতি

  • টর্চের আলো অ্যাডজাস্ট করা: নতুন API-এর সাহায্যে ডিভাইসের টর্চের আলো আরও সূক্ষ্মভাবে কন্ট্রোল করুন। আপনি CameraInfo.getMaxTorchStrengthLevel() ব্যবহার করে সর্বাধিক সমর্থিত স্ট্রেংথ কোয়েরি করতে পারবেন এবং তারপর CameraControl.setTorchStrengthLevel()-এর মাধ্যমে পছন্দসই লেভেল সেট করতে পারবেন।
  • ImageAnalysis-এ NV21 সাপোর্ট: আপনি এখন সরাসরি ImageAnalysis থেকে NV21 ইমেজ ফর্ম্যাটের জন্য অনুরোধ করতে পারবেন, যা অন্যান্য লাইব্রেরি এবং API-এর সাথে ইন্টিগ্রেশনকে সহজ করে তোলে। ImageAnalysis.Builder.setOutputImageFormat(OUTPUT_IMAGE_FORMAT_NV21)-কে কল করার মাধ্যমে এটি চালু করা হয়।

আজই শুরু করুন

আজই আপনার ডিপেন্ডেন্সি CameraX 1.5-এ আপডেট করুন এবং নতুন ও আকর্ষণীয় ফিচার এক্সপ্লোর করুন। আপনি কী তৈরি করেন তা দেখার জন্য আমরা উৎসুক।

CameraX 1.5 ব্যবহার করতে,  আপনার libs.versions.toml-এ নিম্নলিখিত ডিপেন্ডেন্সি যোগ করুন। (আমরা 1.5.1 ব্যবহার করার সাজেশন দিই, কারণ এতে অনেক গুরুত্বপূর্ণ সমস্যার সমাধান করা হয়েছে এবং একই সাথে ক্যামেরা ব্যবহারের ক্ষেত্রেও উন্নতি করা হয়েছে।) 

[versions]

camerax = "1.5.1"


[libraries]

..

androidx-camera-core = { module = "androidx.camera:camera-core", version.ref = "camerax" }

androidx-camera-compose = { module = "androidx.camera:camera-compose", version.ref = "camerax" }

androidx-camera-view = { module = "androidx.camera:camera-view", version.ref = "camerax" }

androidx-camera-lifecycle = { group = "androidx.camera", name = "camera-lifecycle", version.ref = "camerax" }

androidx-camera-camera2 = { module = "androidx.camera:camera-camera2", version.ref = "camerax" }

androidx-camera-extensions = { module = "androidx.camera:camera-extensions", version.ref = "camerax" }

তারপর আপনার মডিউল build.gradle.kts ডিপেন্ডেন্সিতে এগুলি যোগ করুন:

dependencies {

  ..

  implementation(libs.androidx.camera.core)
  implementation(libs.androidx.camera.lifecycle)

  implementation(libs.androidx.camera.camera2)

  implementation(libs.androidx.camera.view) // for PreviewView 
  implementation(libs.androidx.camera.compose) // for compose UI

  implementation(libs.androidx.camera.extensions) // For Extensions 

}

CameraX টিমের সাথে যোগাযোগ করতে চান বা কোনও প্রশ্ন আছে? CameraX ডেভেলপার আলোচনা গ্রুপে যোগ দিন বা কোনও সমস্যার ব্যাপারে অভিযোগ জানান:

লিখেছেন:
পড়া চালিয়ে যান