দ্রষ্টব্য: এই পৃষ্ঠাটি Camera2 প্যাকেজকে বোঝায়। আপনার অ্যাপের Camera2 থেকে নির্দিষ্ট, নিম্ন-স্তরের বৈশিষ্ট্যের প্রয়োজন না হলে, আমরা CameraX ব্যবহার করার পরামর্শ দিই। CameraX এবং Camera2 উভয়ই Android 5.0 (API স্তর 21) এবং উচ্চতর সমর্থন করে।
Camera2 APIs হাই ডায়নামিক রেঞ্জ (HDR) ভিডিও ক্যাপচার সমর্থন করে, যা আপনাকে আপনার ক্যামেরা ব্যবহার করে HDR ভিডিও সামগ্রীর পূর্বরূপ দেখতে এবং রেকর্ড করতে সক্ষম করে। স্ট্যান্ডার্ড ডায়নামিক রেঞ্জের (এসডিআর) তুলনায়, HDR রঙের বিস্তৃত পরিসর সরবরাহ করে এবং লুমিন্যান্স উপাদানের গতিশীল পরিসর বাড়ায় (বর্তমান 100 cd/m2 থেকে cd/m2 এর 1000s পর্যন্ত)। এর ফলে ভিডিওর গুণমান পাওয়া যায় যা বাস্তব জীবনের সাথে আরও ঘনিষ্ঠভাবে মেলে, সমৃদ্ধ রং, উজ্জ্বল হাইলাইট এবং গাঢ় ছায়া।
দেখুন কিভাবে HDR ভিডিও আরও প্রাণবন্ত বিশদে সূর্যাস্ত ক্যাপচার করে।
ডিভাইসের পূর্বশর্ত
সমস্ত Android ডিভাইস HDR ভিডিও ক্যাপচার সমর্থন করে না। আপনার অ্যাপে HDR ভিডিও ক্যাপচার করার আগে, আপনার ডিভাইস নিম্নলিখিত পূর্বশর্তগুলি পূরণ করে কিনা তা নির্ধারণ করুন:
- লক্ষ্য করে Android 13 (API স্তর 33)।
- একটি 10-বিট বা উচ্চতর সক্ষম ক্যামেরা সেন্সর আছে। HDR সমর্থন সম্পর্কে আরও তথ্যের জন্য, দেখুন HDR সমর্থনের জন্য চেক করুন ।
যেহেতু সমস্ত ডিভাইস পূর্বশর্তগুলি পূরণ করে না, তাই আপনার অ্যাপে HDR ভিডিও ক্যাপচার সেট আপ করার সময় আপনি একটি পৃথক কোড পাথ যোগ করতে পারেন। এটি আপনার অ্যাপটিকে বেমানান ডিভাইসে SDR-এ ফিরে যেতে দেয়। এছাড়াও, SDR-এর জন্য একটি UI বিকল্প যোগ করার কথা বিবেচনা করুন। ব্যবহারকারী তখন তাদের ভিডিও রেকর্ডিং প্রয়োজনের জন্য SDR এবং HDR-এর মধ্যে টগল করতে পারেন।
HDR ক্যাপচার আর্কিটেকচার
নিম্নলিখিত চিত্রটি HDR ক্যাপচার আর্কিটেকচারের প্রধান উপাদানগুলি দেখায়৷
যখন একটি ক্যামেরা ডিভাইস HDR-এ একটি ফ্রেম ক্যাপচার করে, তখন Camera2 ফ্রেমওয়ার্ক একটি বাফার বরাদ্দ করে যা প্রক্রিয়াকৃত ক্যামেরা সেন্সর আউটপুট সংরক্ষণ করে। HDR প্রোফাইলের প্রয়োজন হলে এটি সংশ্লিষ্ট HDR মেটাডেটাও সংযুক্ত করে। Camera2 ফ্রেমওয়ার্ক তখন CaptureRequest
উল্লেখ করা আউটপুট পৃষ্ঠের জন্য জনবহুল বাফারকে সারিবদ্ধ করে, যেমন একটি প্রদর্শন বা ভিডিও এনকোডার, যেমন চিত্রে দেখানো হয়েছে।
HDR সমর্থনের জন্য পরীক্ষা করুন
আপনার অ্যাপে HDR ভিডিও ক্যাপচার করার আগে, ডিভাইসটি আপনার পছন্দসই HDR প্রোফাইল সমর্থন করে কিনা তা নির্ধারণ করুন।
CameraManager
getCameraCharacteristics()
পদ্ধতি ব্যবহার করুন একটি CameraCharacteristics
উদাহরণ পেতে, যা আপনি আপনার ডিভাইসের HDR ক্ষমতার জন্য অনুসন্ধান করতে পারেন।
নিম্নলিখিত পদক্ষেপগুলি একটি ডিভাইস HLG10 সমর্থন করে কিনা তা পরীক্ষা করে দেখুন৷ HLG10 হল বেসলাইন HDR স্ট্যান্ডার্ড যা ডিভাইস নির্মাতাদের অবশ্যই 10-বিট আউটপুট সহ ক্যামেরাগুলিতে সমর্থন করতে হবে।
প্রথমে, ডিভাইসটি 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 }
এরপরে, ডিভাইসটি 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 নমুনা দেখুন।