एचडीआर वीडियो रिकॉर्ड करना

ध्यान दें: इस पेज पर Camera2 पैकेज के बारे में बताया गया है. अगर आपके ऐप्लिकेशन को Camera2 की खास और बुनियादी सुविधाओं की ज़रूरत नहीं है, तो हमारा सुझाव है कि आप CameraX का इस्तेमाल करें. CameraX और Camera2, दोनों Android 5.0 (एपीआई लेवल 21) और इसके बाद के वर्शन पर काम करते हैं.

Camera2 एपीआई, हाई डाइनैमिक रेंज (एचडीआर) वीडियो कैप्चर करने की सुविधा के साथ काम करते हैं. इससे आपको अपने कैमरे का इस्तेमाल करके, एचडीआर वीडियो कॉन्टेंट को रिकॉर्ड करने और उसका पूर्वावलोकन करने की सुविधा मिलती है. स्टैंडर्ड डाइनैमिक रेंज (एसडीआर) के मुकाबले, एचडीआर में रंगों की ज़्यादा रेंज मिलती है. साथ ही, यह ल्यूमिनेंस कॉम्पोनेंट की डाइनैमिक रेंज को बढ़ाता है. जैसे, मौजूदा 100 cd/m2 से लेकर हज़ारों cd/m2 तक. इससे वीडियो की क्वालिटी बेहतर होती है. साथ ही, वीडियो में ज़्यादा चटख रंग, चमकदार हाइलाइट, और गहरे शैडो दिखते हैं.

देखें कि एचडीआर वीडियो में, सूर्यास्त को ज़्यादा वाइब्रेंट तरीके से कैसे कैप्चर किया जाता है.

पहली इमेज. एसडीआर (ऊपर) बनाम एचडीआर (नीचे) वीडियो क्वालिटी की तुलना.

डिवाइस से जुड़ी ज़रूरी शर्तें

सभी Android डिवाइसों पर एचडीआर वीडियो कैप्चर करने की सुविधा काम नहीं करती. अपने ऐप्लिकेशन में एचडीआर वीडियो कैप्चर करने से पहले, यह पता लगाएं कि आपका डिवाइस इन ज़रूरी शर्तों को पूरा करता है या नहीं:

ज़रूरी शर्तें पूरी न करने वाले डिवाइसों के लिए, अपने ऐप्लिकेशन में एचडीआर वीडियो कैप्चर करने की सुविधा सेट अप करते समय, एक अलग कोड पाथ जोड़ा जा सकता है. इससे आपका ऐप्लिकेशन, ज़रूरी शर्तें पूरी न करने वाले डिवाइसों पर एसडीआर वीडियो कैप्चर करने की सुविधा पर वापस आ जाता है. साथ ही, एसडीआर के लिए यूज़र इंटरफ़ेस (यूआई) का विकल्प भी जोड़ें. इसके बाद, उपयोगकर्ता वीडियो रिकॉर्डिंग की ज़रूरतों के हिसाब से, एसडीआर और एचडीआर के बीच टॉगल कर सकता है.

एचडीआर कैप्चर करने का आर्किटेक्चर

इस डायग्राम में, एचडीआर कैप्चर आर्किटेक्चर के मुख्य कॉम्पोनेंट दिखाए गए हैं.

एचडीआर कैप्चर करने के आर्किटेक्चर का डायग्राम.
दूसरी इमेज. एचडीआर कैप्चर करने के आर्किटेक्चर का डायग्राम.

जब कोई कैमरा डिवाइस एचडीआर में फ़्रेम कैप्चर करता है, तो Camera2 फ़्रेमवर्क एक बफ़र असाइन करता है. यह बफ़र, प्रोसेस किए गए कैमरा सेंसर के आउटपुट को सेव करता है. अगर एचडीआर प्रोफ़ाइल के लिए ज़रूरी हो, तो यह उससे जुड़ा एचडीआर मेटाडेटा भी अटैच करता है. इसके बाद, Camera2 फ़्रेमवर्क, भरे गए बफ़र को CaptureRequest में रेफ़र किए गए आउटपुट सर्फ़ेस के लिए लाइन में लगाता है. जैसे, कोई डिसप्ले या वीडियो एन्कोडर. इसे डायग्राम में दिखाया गया है.

देखें कि एचडीआर टेक्नोलॉजी काम करती है या नहीं

अपने ऐप्लिकेशन में एचडीआर वीडियो रिकॉर्ड करने से पहले, यह पता लगाएं कि डिवाइस पर आपकी पसंद की एचडीआर प्रोफ़ाइल काम करती है या नहीं.

CameraManager getCameraCharacteristics() तरीके का इस्तेमाल करके, CameraCharacteristics इंस्टेंस पाएं. इस इंस्टेंस का इस्तेमाल करके, अपने डिवाइस पर एचडीआर की सुविधाओं के बारे में क्वेरी की जा सकती है.

यहां दिए गए तरीके से पता लगाया जा सकता है कि किसी डिवाइस पर HLG10 काम करता है या नहीं. HLG10, एचडीआर का बुनियादी स्टैंडर्ड है. डिवाइस बनाने वाली कंपनियों को, 10-बिट आउटपुट वाले कैमरों पर इसे सपोर्ट करना होगा.

  1. सबसे पहले, यह देखें कि डिवाइस पर 10-बिट प्रोफ़ाइलें (एचएलजी10 के लिए बिट-डेप्थ) काम करती हैं या नहीं:

    Kotlin

    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 (या कोई अन्य प्रोफ़ाइल) काम करती है या नहीं:

    Kotlin

    @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;
    }

अगर डिवाइस पर एचडीआर की सुविधा काम करती है, तो isHLGSupported() हमेशा true दिखाता है. ज़्यादा जानकारी के लिए, CameraCharacteristics रेफ़रंस दस्तावेज़ देखें.

एचडीआर कैप्चर करने की सुविधा सेट अप करना

पक्का करें कि आपके डिवाइस पर एचडीआर क्वालिटी में वीडियो देखने की सुविधा उपलब्ध हो. इसके बाद, कैमरे से एचडीआर वीडियो स्ट्रीम कैप्चर करने के लिए, अपना ऐप्लिकेशन सेट अप करें. setDynamicRangeProfile() का इस्तेमाल करके, स्ट्रीम के OutputConfiguration को डिवाइस पर काम करने वाली एचडीआर प्रोफ़ाइल दें. इसके बाद, इसे CameraCaptureSession को पास कर दिया जाता है. एचडीआर की सुविधा के साथ काम करने वाली प्रोफ़ाइलों की सूची देखें.

यहां दिए गए कोड के सैंपल में, setupSessionDynamicRangeProfile() पहले यह जांच करता है कि डिवाइस में Android 13 चल रहा है या नहीं. इसके बाद, यह डिवाइस पर काम करने वाली एचडीआर प्रोफ़ाइल को OutputConfiguration के तौर पर इस्तेमाल करके, CameraCaptureSession को सेट अप करता है:

Kotlin

  /**
  * 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 भेजता है:

Kotlin

session.setRepeatingRequest(previewRequest, null, cameraHandler)

इसके अलावा, वीडियो रिकॉर्डिंग शुरू करने के लिए:

Kotlin

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

एचडीआर कैमरे से किसी और डिवाइस पर स्ट्रीम किए गए वीडियो को कोड में बदलना

एचडीआर कैमरा स्ट्रीम को कोड में बदलने और फ़ाइल को डिस्क में सेव करने के लिए, MediaCodec का इस्तेमाल करें.

सबसे पहले, OutputSurface पाएं. यह एक ऐसे बफ़र पर मैप करता है जो वीडियो का रॉ डेटा सेव करता है. MediaCodec के लिए, createInputSurface() का इस्तेमाल करें.

MediaCodec को शुरू करने के लिए, किसी ऐप्लिकेशन को तय की गई कोडेक प्रोफ़ाइल, कलर स्पेस, कलर रेंज, और ट्रांसफ़र फ़ंक्शन के साथ MediaFormat बनाना होगा:

Kotlin

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 देखें.

एचडीआर फ़ॉर्मैट

Android 13 से, 10-बिट आउटपुट की सुविधा वाले कैमरा डिवाइसों में, एचडीआर कैप्चर और प्लेबैक के लिए HLG10 का इस्तेमाल करना ज़रूरी है. इसके अलावा, डिवाइस बनाने वाली कंपनियां एचडीआर कैप्चर आर्किटेक्चर का इस्तेमाल करके, अपनी पसंद के किसी भी एचडीआर फ़ॉर्मैट को चालू कर सकती हैं.

यहां दी गई टेबल में, एचडीआर वीडियो रिकॉर्ड करने के लिए उपलब्ध एचडीआर फ़ॉर्मैट और उनकी क्षमताओं के बारे में खास जानकारी दी गई है.

फ़ॉर्मैट ट्रांसफ़र फ़ंक्शन (टीएफ़) मेटाडेटा कोडेक बिट डेप्थ
HLG10 HLG नहीं HEVC 10-बिट
HDR10 PQ स्थिर HEVC 10-बिट
HDR10+ PQ डाइनैमिक HEVC 10-बिट
Dolby Vision 8.4 HLG डाइनैमिक HEVC 10-बिट

संसाधन

एचडीआर वीडियो रिकॉर्ड करने की सुविधा वाले ऐप्लिकेशन का उदाहरण देखने के लिए, GitHub पर Camera2Video सैंपल देखें.