পণ্যের খবর

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

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

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

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

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

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

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

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

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

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

আপনি যদি 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
}

২. ইউজ কেস কনফিগার এবং বাইন্ড করুন: ফেরত আসা videoCapabilities (যেটিতে সমর্থিত ভিডিও কোয়ালিটির তথ্য থাকে) ব্যবহার করে একটি HighSpeedVideoSessionConfig তৈরি করুন। এরপর আপনাকে অবশ্যই 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 সাপোর্টের প্রয়োজন হয়। সর্বদা সক্ষমতা যাচাই করুন এবং ব্যবহারকারীর খারাপ অভিজ্ঞতা এড়াতে শুধুমাত্র সমর্থিত ডিভাইসগুলিতেই হাই-স্পিড রেকর্ডিং চালু করুন। বর্তমানে, এই ফিচারটি প্রায় সমস্ত পিক্সেল ডিভাইস এবং অন্যান্য নির্মাতাদের নির্বাচিত কিছু মডেলের পেছনের ক্যামেরায় সমর্থিত।

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

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

CameraX 1.5-এ ফিচার গ্রুপ এপিআই (Feature Group API) চালু করা হয়েছে, যা ফিচারের সামঞ্জস্যতা নিয়ে অনুমানের ঝামেলা দূর করে। অ্যান্ড্রয়েড ১৫-এর ফিচার কম্বিনেশন কোয়েরি এপিআই (feature combination query API)-এর উপর ভিত্তি করে, আপনি এখন আত্মবিশ্বাসের সাথে একসাথে একাধিক ফিচার চালু করতে পারবেন, যা একটি স্থিতিশীল ক্যামেরা সেশন নিশ্চিত করে। ফিচার গ্রুপ বর্তমানে সাপোর্ট করে: HDR (HLG), 60 fps, প্রিভিউ স্ট্যাবিলাইজেশন (Preview Stabilization), এবং আল্ট্রা HDR । উদাহরণস্বরূপ, আপনি পিক্সেল ১০ এবং গ্যালাক্সি এস২৫ সিরিজে একই সাথে HDR, 60 fps, এবং প্রিভিউ স্ট্যাবিলাইজেশন চালু করতে পারেন। ভবিষ্যতে ৪কে রেকর্ডিং এবং আল্ট্রা-ওয়াইড জুম অন্তর্ভুক্ত করার পরিকল্পনা রয়েছে।

ফিচার গ্রুপ এপিআই দুটি অপরিহার্য ব্যবহারের সুযোগ করে দেয়:

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

আপনি যদি ফিচারগুলোর সর্বোত্তম সমন্বয় ব্যবহার করে ছবি তুলতে চান, তাহলে একটি অগ্রাধিকার তালিকা দিতে পারেন। 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 + 60 FPS + প্রিভিউ স্ট্যাবিলাইজেশন
  2. HDR + 60 FPS
  3. HDR + প্রিভিউ স্থিতিশীলতা
  4. HDR
  5. ৬০ এফপিএস + প্রিভিউ স্ট্যাবিলাইজেশন
  6. ৬০ এফপিএস
  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-এর জন্য Preview + ImageCapture + VideoCapture ব্যবহারের ক্ষেত্রগুলো একযোগে বাইন্ড করতে পারবেন। এছাড়াও, কম্পোজিশন মোডে ( CompositionSettings-এর সাথে একই ব্যবহারের ক্ষেত্র), আপনি এখন সেই CameraEffect সেট করতে পারবেন যা চূড়ান্ত কম্পোজিশন ফলাফলে প্রয়োগ করা হবে।
  • ডাইনামিক মিউটিং: এখন আপনি PendingRecording.withAudioEnabled(boolean initialMuted) ব্যবহার করে মিউট করা অবস্থায় রেকর্ডিং শুরু করতে পারেন এবং পরে Recording.mute(boolean muted) ব্যবহার করে ব্যবহারকারীকে আনমিউট করার সুযোগ দিতে পারেন।
  • অপর্যাপ্ত স্টোরেজ ব্যবস্থাপনার উন্নতি: CameraX এখন নির্ভরযোগ্যভাবে VideoRecordEvent.Finalize.ERROR_INSUFFICIENT_STORAGE ত্রুটিটি প্রেরণ করে, যা আপনার অ্যাপকে স্টোরেজ কম থাকার পরিস্থিতি সুন্দরভাবে সামলাতে এবং ব্যবহারকারীকে অবহিত করতে সাহায্য করে।
  • লো লাইট বুস্ট: সমর্থিত ডিভাইসগুলিতে (যেমন পিক্সেল ১০ সিরিজ), আপনি 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-এর উজ্জ্বল রঙ এবং ডাইনামিক রেঞ্জের মেলবন্ধন। এই ফিচারটি এখন পিক্সেল ৯/১০ সিরিজ এবং স্যামসাং এস২৪/এস২৫ সিরিজের মতো অনেক আধুনিক প্রিমিয়াম অ্যান্ড্রয়েড ফোনে সমর্থিত।

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

কোর এপিআই এবং ব্যবহারযোগ্যতা বর্ধন

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

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

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

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

আমরা জানি আপনারা Jetpack Compose কতটা পছন্দ করেন, এবং আমরা আনন্দের সাথে জানাচ্ছি যে camera-compose লাইব্রেরিটি এখন সংস্করণ 1.5.1 এ স্থিতিশীল হয়েছে ! এই রিলিজে moveableContentOf এবং Pager মতো Compose ফিচারগুলির সাথে CameraXViewfinder ব্যবহারের সাথে সম্পর্কিত কিছু গুরুত্বপূর্ণ বাগ ফিক্স করা হয়েছে, এবং সেই সাথে একটি প্রিভিউ স্ট্রেচিং সমস্যারও সমাধান করা হয়েছে। আমরা ভবিষ্যতের রিলিজগুলিতে 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-এ এগুলি যোগ করুন:

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 ডেভেলপার আলোচনা গ্রুপে যোগ দিন অথবা একটি বাগ রিপোর্ট ফাইল করুন:

    লিখেছেন:

    পড়তে থাকুন