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

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

ক্যামেরা২ এপিআই হাই ডাইনামিক রেঞ্জ (এইচডিআর) ভিডিও ক্যাপচার সমর্থন করে, যা আপনাকে আপনার ক্যামেরা ব্যবহার করে এইচডিআর ভিডিও কন্টেন্ট প্রিভিউ এবং রেকর্ড করতে সক্ষম করে। স্ট্যান্ডার্ড ডাইনামিক রেঞ্জ (এসডিআর)-এর তুলনায়, এইচডিআর আরও বিস্তৃত রঙের পরিসর প্রদান করে এবং লুমিন্যান্স উপাদানের ডাইনামিক রেঞ্জ বৃদ্ধি করে (বর্তমান ১০০ cd/m2 থেকে হাজার হাজার cd/m2 পর্যন্ত)। এর ফলে ভিডিওর মান বাস্তব জীবনের সাথে আরও বেশি মিলে যায়, যেখানে থাকে আরও সমৃদ্ধ রঙ, উজ্জ্বল হাইলাইট এবং গাঢ় শ্যাডো।

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

চিত্র ১. এসডিআর (উপরে) বনাম এইচডিআর (নিচে) ভিডিও মানের তুলনা।

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

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

  • অ্যান্ড্রয়েড ১৩ (এপিআই লেভেল ৩৩) লক্ষ্য করে তৈরি।
  • এতে ১০-বিট বা তার চেয়ে উচ্চতর সক্ষমতাসম্পন্ন ক্যামেরা সেন্সর রয়েছে। HDR সাপোর্ট সম্পর্কে আরও তথ্যের জন্য, ‘HDR সাপোর্ট যাচাই করুন’ দেখুন।

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

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

নিম্নোক্ত ডায়াগ্রামটিতে HDR ক্যাপচার আর্কিটেকচারের প্রধান উপাদানগুলো দেখানো হয়েছে।

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

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

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

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

CameraManager getCameraCharacteristics() মেথড ব্যবহার করে একটি CameraCharacteristics ইনস্ট্যান্স পাওয়া যায়, যেখান থেকে আপনি আপনার ডিভাইসের HDR সক্ষমতা সম্পর্কে জানতে পারবেন।

নিচের ধাপগুলো একটি ডিভাইস HLG10 সমর্থন করে কিনা তা যাচাই করে। HLG10 হলো HDR-এর ভিত্তিগত মান, যা ১০-বিট আউটপুটযুক্ত ক্যামেরাগুলোতে ডিভাইস নির্মাতাদের অবশ্যই সমর্থন করতে হয়।

  1. প্রথমে, ডিভাইসটি ১০-বিট প্রোফাইল সমর্থন করে কিনা তা যাচাই করুন (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 ভিডিও স্ট্রিম ক্যাপচার করার জন্য আপনার অ্যাপটি সেট আপ করুন। স্ট্রিমটির OutputConfiguration কে একটি ডিভাইস-সমর্থিত HDR প্রোফাইল সরবরাহ করতে setDynamicRangeProfile() ব্যবহার করুন, যা পরবর্তীতে CameraCaptureSession তৈরির সময় সেখানে পাঠানো হয়। সমর্থিত HDR প্রোফাইলগুলোর তালিকা দেখুন।

নিম্নলিখিত কোড নমুনায়, setupSessionDynamicRangeProfile() প্রথমে পরীক্ষা করে দেখে যে ডিভাইসটিতে অ্যান্ড্রয়েড ১৩ চলছে কিনা। তারপর, এটি ডিভাইস-সমর্থিত HDR প্রোফাইলটিকে একটি OutputConfiguration হিসেবে ব্যবহার করে 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 ফরম্যাট

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

নিম্নলিখিত সারণিতে উপলব্ধ HDR ফরম্যাটগুলো এবং HDR ভিডিও ধারণের জন্য সেগুলোর সক্ষমতা সংক্ষেপে তুলে ধরা হলো।

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

সম্পদ

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