HDR ভিডিও ক্যাপচার

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

Camera2 APIs হাই ডায়নামিক রেঞ্জ (HDR) ভিডিও ক্যাপচার সমর্থন করে, যা আপনাকে আপনার ক্যামেরা ব্যবহার করে HDR ভিডিও সামগ্রীর পূর্বরূপ দেখতে এবং রেকর্ড করতে সক্ষম করে। স্ট্যান্ডার্ড ডায়নামিক রেঞ্জের (এসডিআর) তুলনায়, HDR রঙের বিস্তৃত পরিসর সরবরাহ করে এবং লুমিন্যান্স উপাদানের গতিশীল পরিসর বাড়ায় (বর্তমান 100 cd/m2 থেকে cd/m2 এর 1000s পর্যন্ত)। এর ফলে ভিডিওর গুণমান পাওয়া যায় যা বাস্তব জীবনের সাথে আরও ঘনিষ্ঠভাবে মেলে, সমৃদ্ধ রং, উজ্জ্বল হাইলাইট এবং গাঢ় ছায়া।

দেখুন কিভাবে HDR ভিডিও আরও প্রাণবন্ত বিশদে সূর্যাস্ত ক্যাপচার করে।

চিত্র 1. SDR (শীর্ষ) বনাম HDR (নীচে) ভিডিও মানের তুলনা।

ডিভাইসের পূর্বশর্ত

সমস্ত Android ডিভাইস HDR ভিডিও ক্যাপচার সমর্থন করে না। আপনার অ্যাপে HDR ভিডিও ক্যাপচার করার আগে, আপনার ডিভাইস নিম্নলিখিত পূর্বশর্তগুলি পূরণ করে কিনা তা নির্ধারণ করুন:

  • লক্ষ্য করে Android 13 (API স্তর 33)।
  • একটি 10-বিট বা উচ্চতর সক্ষম ক্যামেরা সেন্সর আছে। HDR সমর্থন সম্পর্কে আরও তথ্যের জন্য, দেখুন HDR সমর্থনের জন্য চেক করুন

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

HDR ক্যাপচার আর্কিটেকচার

নিম্নলিখিত চিত্রটি HDR ক্যাপচার আর্কিটেকচারের প্রধান উপাদানগুলি দেখায়৷

HDR ক্যাপচার আর্কিটেকচার ডায়াগ্রাম।
চিত্র 2. HDR ক্যাপচার আর্কিটেকচার ডায়াগ্রাম।

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

HDR সমর্থনের জন্য পরীক্ষা করুন

আপনার অ্যাপে HDR ভিডিও ক্যাপচার করার আগে, ডিভাইসটি আপনার পছন্দসই HDR প্রোফাইল সমর্থন করে কিনা তা নির্ধারণ করুন।

CameraManager getCameraCharacteristics() পদ্ধতি ব্যবহার করুন একটি CameraCharacteristics উদাহরণ পেতে, যা আপনি আপনার ডিভাইসের HDR ক্ষমতার জন্য অনুসন্ধান করতে পারেন।

নিম্নলিখিত পদক্ষেপগুলি একটি ডিভাইস HLG10 সমর্থন করে কিনা তা পরীক্ষা করে দেখুন৷ HLG10 হল বেসলাইন HDR স্ট্যান্ডার্ড যা ডিভাইস নির্মাতাদের অবশ্যই 10-বিট আউটপুট সহ ক্যামেরাগুলিতে সমর্থন করতে হবে।

  1. প্রথমে, ডিভাইসটি 10-বিট প্রোফাইল সমর্থন করে কিনা তা পরীক্ষা করুন (HLG10 এর জন্য বিট-গভীরতা):

    কোটলিন

    private fun isTenBitProfileSupported(cameraId: String): Boolean {
      val cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId)
      val availableCapabilities = cameraCharacteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES)
      for (capability in availableCapabilities!!) {
          if (capability == CameraMetadata.REQUEST_AVAILABLE_CAPABILITIES_DYNAMIC_RANGE_TEN_BIT) {
              return true
          }
      }
      return false
    }
  2. এরপরে, ডিভাইসটি HLG10 (বা অন্য সমর্থিত প্রোফাইল ) সমর্থন করে কিনা তা পরীক্ষা করুন:

    কোটলিন

    @RequiresApi(api = 33)
    private fun isHLGSupported(cameraId: String): Boolean {
    if (isTenBitProfileSupported(cameraId)) {
      Val cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId)
      val availableProfiles = cameraCharacteristics
      .get(CameraCharacteristics.REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES)!!
      .getSupportedProfiles()
    
      // Checks for the desired profile, in this case HLG10
      return availableProfiles.contains(DynamicRangeProfiles.HLG10)
    }
    return false;
    }

যদি ডিভাইসটি HDR সমর্থন করে, isHLGSupported() সর্বদা true ফেরত দেয়। আরও তথ্যের জন্য, CameraCharacteristics রেফারেন্স ডকুমেন্টেশন দেখুন।

HDR ক্যাপচার সেট আপ করুন

আপনার ডিভাইস HDR সমর্থন করে তা নিশ্চিত করার পরে, ক্যামেরা থেকে একটি কাঁচা HDR ভিডিও স্ট্রিম ক্যাপচার করতে আপনার অ্যাপ সেট আপ করুন। একটি ডিভাইস-সমর্থিত HDR প্রোফাইল সহ স্ট্রিমের OutputConfiguration প্রদান করতে setDynamicRangeProfile() ব্যবহার করুন, যা তৈরি করার পরে CameraCaptureSession এ পাস করা হয়। সমর্থিত HDR প্রোফাইলের তালিকা দেখুন।

নিম্নলিখিত কোড নমুনায়, setupSessionDynamicRangeProfile() প্রথমে চেক করে যে ডিভাইসটি Android 13 চালাচ্ছে। তারপর, এটি একটি OutputConfiguration হিসাবে ডিভাইস-সমর্থিত HDR প্রোফাইলের সাথে CameraCaptureSession সেট আপ করে:

কোটলিন

  /**
  * Creates a [CameraCaptureSession] with a dynamic range profile.
  */
  private fun setupSessionWithDynamicRangeProfile(
          dynamicRange: Long,
          device: CameraDevice,
          targets: List,
          handler: Handler? = null,
          stateCallback: CameraCaptureSession.StateCallback
  ): Boolean {
      if (android.os.Build.VERSION.SDK_INT >=
              android.os.Build.VERSION_CODES.TIRAMISU) {
          val outputConfigs = mutableListOf()
              for (target in targets) {
                  val outputConfig = OutputConfiguration(target)
                  //sets the dynamic range profile, for example DynamicRangeProfiles.HLG10
                  outputConfig.setDynamicRangeProfile(dynamicRange)
                  outputConfigs.add(outputConfig)
              }

          device.createCaptureSessionByOutputConfigurations(
                  outputConfigs, stateCallback, handler)
          return true
      } else {
          device.createCaptureSession(targets, stateCallback, handler)
          return false
      }
  }

}

যখন আপনার ক্যামেরা অ্যাপটি ক্যামেরা শুরু করে, তখন এটি রেকর্ডিংয়ের পূর্বরূপ দেখতে একটি পুনরাবৃত্তি করা CaptureRequest পাঠায়:

কোটলিন

session.setRepeatingRequest(previewRequest, null, cameraHandler)

এবং ভিডিও রেকর্ডিং শুরু করতে:

কোটলিন

// Start recording repeating requests, which stops the ongoing preview
//  repeating requests without having to explicitly call
//  `session.stopRepeating`
session.setRepeatingRequest(recordRequest,
        object : CameraCaptureSession.CaptureCallback() {
    override fun onCaptureCompleted(session: CameraCaptureSession,
            request: CaptureRequest, result: TotalCaptureResult) {
        if (currentlyRecording) {
            encoder.frameAvailable()
        }
    }
}, cameraHandler)

HDR ক্যামেরা স্ট্রীম এনকোড করুন

HDR ক্যামেরা স্ট্রীম এনকোড করতে এবং ফাইলটি ডিস্কে লিখতে, MediaCodec ব্যবহার করুন।

প্রথমে, OutputSurface পান, যা একটি বাফারে ম্যাপ করে যা কাঁচা ভিডিও ডেটা সঞ্চয় করে। MediaCodec এর জন্য, createInputSurface() ব্যবহার করুন।

MediaCodec আরম্ভ করার জন্য, একটি অ্যাপকে অবশ্যই একটি নির্দিষ্ট কোডেক প্রোফাইল, রঙের স্থান, রঙের পরিসর এবং স্থানান্তর ফাংশন সহ একটি MediaFormat তৈরি করতে হবে:

কোটলিন

val mimeType = when {
    dynamicRange == DynamicRangeProfiles.STANDARD -> MediaFormat.MIMETYPE_VIDEO_AVC
    dynamicRange < DynamicRangeProfiles.PUBLIC_MAX ->
            MediaFormat.MIMETYPE_VIDEO_HEVC
    else -> throw IllegalArgumentException("Unknown dynamic range format")
}

val codecProfile = when {
    dynamicRange == DynamicRangeProfiles.HLG10 ->
            MediaCodecInfo.CodecProfileLevel.HEVCProfileMain10
    dynamicRange == DynamicRangeProfiles.HDR10 ->
            MediaCodecInfo.CodecProfileLevel.HEVCProfileMain10HDR10
    dynamicRange == DynamicRangeProfiles.HDR10_PLUS ->
            MediaCodecInfo.CodecProfileLevel.HEVCProfileMain10HDR10Plus
    else -> -1
}
// Failing to correctly set color transfer causes quality issues
// for example, washout and color clipping
val transferFunction = when (codecProfile) {
    MediaCodecInfo.CodecProfileLevel.HEVCProfileMain10 ->
            MediaFormat.COLOR_TRANSFER_HLG
    MediaCodecInfo.CodecProfileLevel.HEVCProfileMain10HDR10 ->
            MediaFormat.COLOR_TRANSFER_ST2084
    MediaCodecInfo.CodecProfileLevel.HEVCProfileMain10HDR10Plus ->
            MediaFormat.COLOR_TRANSFER_ST2084
    else -> MediaFormat.COLOR_TRANSFER_SDR_VIDEO
}

val format = MediaFormat.createVideoFormat(mimeType, width, height)

// Set some properties.  Failing to specify some of these can cause the MediaCodec
// configure() call to throw an exception.
format.setInteger(MediaFormat.KEY_COLOR_FORMAT,
        MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface)
format.setInteger(MediaFormat.KEY_BIT_RATE, bitRate)
format.setInteger(MediaFormat.KEY_FRAME_RATE, frameRate)
format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, IFRAME_INTERVAL)

if (codecProfile != -1) {
    format.setInteger(MediaFormat.KEY_PROFILE, codecProfile)
    format.setInteger(MediaFormat.KEY_COLOR_STANDARD,
            MediaFormat.COLOR_STANDARD_BT2020)
    format.setInteger(MediaFormat.KEY_COLOR_RANGE, MediaFormat.COLOR_RANGE_LIMITED)
    format.setInteger(MediaFormat.KEY_COLOR_TRANSFER, transferFunction)
    format.setFeatureEnabled(MediaCodecInfo.CodecCapabilities.FEATURE_HdrEditing,
            true)
}

mediaCodec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE)

বাস্তবায়ন সম্পর্কে আরো বিস্তারিত জানার জন্য, Camera2Video নমুনা অ্যাপের EncoderWrapper.kt দেখুন।

HDR ফরম্যাট

Android 13 থেকে শুরু করে, 10-বিট আউটপুট ক্ষমতা সহ ক্যামেরা ডিভাইসগুলিকে HDR ক্যাপচার এবং প্লেব্যাকের জন্য HLG10 সমর্থন করতে হবে৷ এছাড়াও, ডিভাইস নির্মাতারা HDR ক্যাপচার আর্কিটেকচার ব্যবহার করে তাদের পছন্দের যেকোনো HDR ফরম্যাট সক্ষম করতে পারে।

নিম্নলিখিত সারণীতে উপলব্ধ HDR ফর্ম্যাট এবং HDR ভিডিও ক্যাপচারের জন্য তাদের ক্ষমতার যোগফল রয়েছে৷

বিন্যাস স্থানান্তর ফাংশন (TF) মেটাডেটা কোডেক বিট গভীরতা
HLG10 এইচএলজি না HEVC 10-বিট
HDR10 পিকিউ স্থির HEVC 10-বিট
HDR10+ পিকিউ গতিশীল HEVC 10-বিট
ডলবি ভিশন 8.4 এইচএলজি গতিশীল HEVC 10-বিট

সম্পদ

HDR ভিডিও ক্যাপচার কার্যকারিতা সহ একটি কার্যকরী অ্যাপের জন্য, GitHub-এ Camera2Video নমুনা দেখুন।