পণ্যের খবর

ক্যামেরাএক্স ১.৫ চালু করা হচ্ছে: শক্তিশালী ভিডিও রেকর্ডিং এবং প্রো-লেভেল ইমেজ ক্যাপচার

৭ মিনিট পঠিত
Scott Nien
সফটওয়্যার ইঞ্জিনিয়ার

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

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

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

এই বৈশিষ্ট্যগুলির ভিত্তি হল নতুন SessionConfig API , যা ক্যামেরা সেটআপ এবং পুনর্গঠনকে সহজতর করে। এখন, আসুন এই আকর্ষণীয় নতুন বৈশিষ্ট্যগুলির বিশদ বিবরণে ডুব দেই।

শক্তিশালী ভিডিও রেকর্ডিং: উচ্চ-গতি এবং বৈশিষ্ট্যের সমন্বয়

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

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

আমাদের সবচেয়ে প্রত্যাশিত বৈশিষ্ট্যগুলির মধ্যে একটি, স্লো-মোশন ভিডিও, এখন উপলব্ধ। আপনি এখন উচ্চ-গতির ভিডিও (যেমন, 120 বা 240 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 চালু করেছে, যা ফিচার সামঞ্জস্যের অনুমানকে দূর করে। অ্যান্ড্রয়েড 15 এর ফিচার কম্বিনেশন কোয়েরি API এর উপর ভিত্তি করে, আপনি এখন আত্মবিশ্বাসের সাথে একসাথে একাধিক বৈশিষ্ট্য সক্ষম করতে পারেন, যা একটি স্থিতিশীল ক্যামেরা সেশনের নিশ্চয়তা দেয়। ফিচার গ্রুপ বর্তমানে সমর্থন করে: HDR (HLG), 60 fps, প্রিভিউ স্ট্যাবিলাইজেশন এবং আল্ট্রা HDR । উদাহরণস্বরূপ, আপনি Pixel 10 এবং Galaxy S25 সিরিজে একসাথে HDR, 60 fps এবং প্রিভিউ স্ট্যাবিলাইজেশন সক্ষম করতে পারেন। ভবিষ্যতের বর্ধিতকরণগুলিতে 4K রেকর্ডিং এবং আল্ট্রা-ওয়াইড জুম অন্তর্ভুক্ত করার পরিকল্পনা করা হয়েছে।

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

ব্যবহারের ধরণ ১: সর্বোত্তম মানের অগ্রাধিকার দেওয়া

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

  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 + 60 FPS + প্রিভিউ স্থিতিশীলতা
  2. এইচডিআর + ৬০ এফপিএস
  3. HDR + প্রিভিউ স্থিতিশীলতা
  4. এইচডিআর
  5. ৬০ FPS + প্রিভিউ স্থিতিশীলতা
  6. ৬০ এফপিএস
  7. প্রিভিউ স্থিতিশীলকরণ
  8. কোনটিই নয়

কেস ২ ব্যবহার করুন: একটি ব্যবহারকারী-মুখী সেটিংস UI তৈরি করা

নিচের ছবির মতো অসমর্থিত বিকল্পগুলির জন্য টগলগুলি অক্ষম করে, আপনি এখন আপনার অ্যাপের সেটিংস UI-তে কোন বৈশিষ্ট্যগুলির সমন্বয়গুলি সমর্থিত তা সঠিকভাবে প্রতিফলিত করতে পারবেন।

অসমর্থিত-বৈশিষ্ট্য-অক্ষম.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 এর জন্য Preview + 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) {}
    }
)

ক্যামেরা এক্সটেনশনের জন্য আল্ট্রা এইচডিআর

উভয় জগতের সেরাটা পান: ক্যামেরা এক্সটেনশনের (যেমন নাইট মোড) অত্যাশ্চর্য কম্পিউটেশনাল ফটোগ্রাফি, আল্ট্রা এইচডিআরের উজ্জ্বল রঙ এবং গতিশীল পরিসরের সাথে মিলিত। এই বৈশিষ্ট্যটি এখন অনেক সাম্প্রতিক প্রিমিয়াম অ্যান্ড্রয়েড ফোনে সমর্থিত, যেমন Pixel 9/10 সিরিজ এবং Samsung S24/S25 সিরিজ।

  // 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

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

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

ক্যামেরা-রচনা এখন স্থিতিশীল

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

ইমেজ অ্যানালাইসিস এবং ক্যামেরা কন্ট্রোলের উন্নতি

  • টর্চ স্ট্রেংথ অ্যাডজাস্টমেন্ট: নতুন 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 ডেভেলপার আলোচনা গোষ্ঠীতে যোগ দিন অথবা একটি বাগ রিপোর্ট দাখিল করুন:

    লিখেছেন: