आम तौर पर, कैप्चर करने वाला सिस्टम वीडियो और ऑडियो स्ट्रीम को रिकॉर्ड करता है, उन्हें कंप्रेस करता है, दोनों स्ट्रीम को मैक्स करता है, फिर नतीजे की स्ट्रीम को डिस्क पर लिखता है.
CameraX में, वीडियो कैप्चर करने की सुविधा यह है कि
VideoCapture
इस्तेमाल का उदाहरण:
VideoCapture के इस्तेमाल के उदाहरण को हैंडल करता है.जैसा कि दूसरी इमेज में दिखाया गया है, CameraX में कुछ हाई-लेवल वीडियो कैप्चर करने की सुविधा होती है आर्किटेक्चर से जुड़े कॉम्पोनेंट:
- वीडियो सोर्स के लिए
SurfaceProvider. - ऑडियो सोर्स के लिए
AudioSource. - वीडियो/ऑडियो को एन्कोड और कंप्रेस करने के लिए दो एन्कोडर.
- दो स्ट्रीम को मर्ज करने के लिए एक मीडिया मक्सर.
- नतीजा लिखने के लिए फ़ाइल सेवर.
Videoकैप्चर एपीआई, जटिल कैप्चर करने वाले इंजन को ऐब्स्ट्रैक्ट करता है और ज़्यादा सरल और आसान API वाले ऐप्लिकेशन हैं.
Videoकैप्चर एपीआई की खास जानकारी
VideoCapture, CameraX इस्तेमाल करने का एक उदाहरण है, जो अपने-आप या जब भी बेहतर काम करता है, तब
इसके साथ अन्य इस्तेमाल के उदाहरण भी दिए जाते हैं. कुछ खास कॉम्बिनेशन, इन बातों पर निर्भर करते हैं:
कैमरा हार्डवेयर की क्षमता है, लेकिन Preview और VideoCapture ऐसी
सभी डिवाइसों पर, इस्तेमाल के उदाहरण का मान्य कॉम्बिनेशन डालें.
Video Capture API में ये ऑब्जेक्ट शामिल होते हैं, जो एक-दूसरे से बातचीत करते हैं ऐप्स के साथ:
VideoCaptureटॉप लेवल इस्तेमाल का उदाहरण क्लास.VideoCaptureइससे बाइंड करता हैCameraSelectorऔर अन्य CameraX के साथLifecycleOwnerयूज़केस. इन सिद्धांतों और इस्तेमाल के बारे में ज़्यादा जानने के लिए, देखें CameraX आर्किटेक्चर.Recorderवीडियो आउटपुट को लागू करना, जोVideoCaptureके साथ काम करता हो.Recorderका इस्तेमाल वीडियो और ऑडियो कैप्चर करने के लिए किया जाता है. अगर आप ऐप्लिकेशन किसीRecorderसे रिकॉर्डिंग बनाता है.PendingRecordingऑडियो चालू करने और सेटिंग जैसे विकल्प देकर, रिकॉर्डिंग को कॉन्फ़िगर करता है एक व्यक्ति की तरह.PendingRecordingबनाने के लिए, आपकोRecorderका इस्तेमाल करना होगा.PendingRecordingकुछ भी रिकॉर्ड नहीं करता है.Recordingरिकॉर्ड कर रहे हैं.Recordingबनाने के लिए, आपकोPendingRecordingका इस्तेमाल करना होगा.
इमेज 3 में इन ऑब्जेक्ट के बीच के संबंध दिखाए गए हैं:
लेजेंड:
- इसकी मदद से
RecorderबनाएंQualitySelector. Recorderको इनमें से किसी एक के साथ कॉन्फ़िगर करेंOutputOptions.- इससे ऑडियो चालू करें
withAudioEnabled()यह जानकारी देखें. start()पर कॉल करेंVideoRecordEventके साथ लिसनर का इस्तेमाल करें.- इस पर
pause()/resume()/stop()का इस्तेमाल करें:Recordingका इस्तेमाल करें. VideoRecordEventsको जवाब दें आपके इवेंट लिसनर के अंदर.
एपीआई की ज़्यादा जानकारी वाली सूची, सोर्स कोड के अंदर मौजूदा.txt में मौजूद है.
Video Capture API का इस्तेमाल करना
अपने ऐप्लिकेशन में CameraX VideoCapture के इस्तेमाल के उदाहरण को इंटिग्रेट करने के लिए,
ये काम करें:
VideoCaptureबाइंड करें.- रिकॉर्डिंग तैयार करें और कॉन्फ़िगर करें.
- रनटाइम रिकॉर्डिंग को शुरू और कंट्रोल करें.
यहां दिए गए सेक्शन में बताया गया है कि कन्वर्ज़न इंपोर्ट करने के लिए हर चरण पर शुरू से आखिर तक रिकॉर्डिंग सेशन होता है.
Videoकैप्चर बाइंड करें
VideoCapure के इस्तेमाल के उदाहरण से जोड़ने के लिए, यह तरीका अपनाएं:
Recorderऑब्जेक्ट बनाएं.VideoCaptureऑब्जेक्ट बनाएं.Lifecycleसे बाइंड करें.
CameraX Video Capture API, बिल्डर डिज़ाइन पैटर्न का इस्तेमाल करता है. आवेदन
Recorder बनाने के लिए, Recorder.Builder का इस्तेमाल करें. आप यह भी कॉन्फ़िगर कर सकते हैं कि
QualitySelector ऑब्जेक्ट के ज़रिए Recorder के लिए वीडियो रिज़ॉल्यूशन.
CameraX Recorder, पहले से तय किए गए इन Qualities के साथ काम करता है
वीडियो रिज़ॉल्यूशन के लिए:
- 4K अल्ट्रा एचडी वीडियो (2160 पिक्सल) के लिए
Quality.UHD - फ़ुल एचडी वीडियो साइज़ (1080 पिक्सल) के लिए
Quality.FHD - एचडी वीडियो साइज़ (720 पिक्सल) के लिए
Quality.HD - एसडी वीडियो (480p) के लिए
Quality.SD
ध्यान दें कि ऐप्लिकेशन से अनुमति मिलने पर, CameraX दूसरे रिज़ॉल्यूशन भी चुन सकता है.
हर वीडियो का सटीक साइज़, कैमरे और एन्कोडर के साइज़ पर निर्भर करता है
सुविधाएं. ज़्यादा जानकारी के लिए,
CamcorderProfile.
ऐप्लिकेशन,
QualitySelector.
QualitySelector बनाने के लिए, इनमें से किसी एक तरीके का इस्तेमाल किया जा सकता है:
fromOrderedList()का इस्तेमाल करके अपनी समस्या को हल करने के लिए कुछ और इस्तेमाल करने के लिए फ़ॉलबैक रणनीति शामिल होगी. पसंदीदा रिज़ॉल्यूशन काम करता है.CameraX, चुने गए कैमरे के आधार पर सबसे अच्छा फ़ॉलबैक मैच तय कर सकता है सुविधा के बारे में ज़्यादा जानने के लिए,
QualitySelectorकेFallbackStrategy specificationदेखें देखें. उदाहरण के लिए, नीचे दिया गया कोड, सबसे ज़्यादा वैल्यू वाले रिज़ॉल्यूशन मौजूद हो सकता है और अगर अनुरोध का कोई भी समाधान काम नहीं करता, CameraX को ऐसा करने की अनुमति दें जो क्वालिटी.एसडी रिज़ॉल्यूशन के सबसे करीब हो:val qualitySelector = QualitySelector.fromOrderedList( listOf(Quality.UHD, Quality.FHD, Quality.HD, Quality.SD), FallbackStrategy.lowerQualityOrHigherThan(Quality.SD))कैमरे की क्षमताओं के बारे में क्वेरी करें और उसके लिए उपलब्ध विकल्पों में से किसी एक को चुनें
QualitySelector::from()का इस्तेमाल करके रिज़ॉल्यूशन:val cameraInfo = cameraProvider.availableCameraInfos.filter { Camera2CameraInfo .from(it) .getCameraCharacteristic(CameraCharacteristics.LENS\_FACING) == CameraMetadata.LENS_FACING_BACK } val supportedQualities = QualitySelector.getSupportedQualities(cameraInfo[0]) val filteredQualities = arrayListOf (Quality.UHD, Quality.FHD, Quality.HD, Quality.SD) .filter { supportedQualities.contains(it) } // Use a simple ListView with the id of simple_quality_list_view viewBinding.simpleQualityListView.apply { adapter = ArrayAdapter(context, android.R.layout.simple_list_item_1, filteredQualities.map { it.qualityToString() }) // Set up the user interaction to manually show or hide the system UI. setOnItemClickListener { _, _, position, _ -> // Inside View.OnClickListener, // convert Quality.* constant to QualitySelector val qualitySelector = QualitySelector.from(filteredQualities[position]) // Create a new Recorder/VideoCapture for the new quality // and bind to lifecycle val recorder = Recorder.Builder() .setQualitySelector(qualitySelector).build() // ... } } // A helper function to translate Quality to a string fun Quality.qualityToString() : String { return when (this) { Quality.UHD -> "UHD" Quality.FHD -> "FHD" Quality.HD -> "HD" Quality.SD -> "SD" else -> throw IllegalArgumentException() } }ध्यान दें कि यहां से लौटाए गए फ़ंक्शन की क्षमता
QualitySelector.getSupportedQualities()VideoCaptureके इस्तेमाल के उदाहरण या इसके लिए,VideoCaptureऔरPreviewका इस्तेमाल किया जा सकता है. जब इन्हें साथ में जोड़ा जा रहा होImageCaptureयाImageAnalysisइस्तेमाल का उदाहरण, CameraX जब ज़रूरी कॉम्बिनेशन काम नहीं करता है, तब भी बाइंडिंग विफल हो सकती है कैमरे को ब्लॉक कर दिया गया है.
QualitySelector मिलने के बाद, ऐप्लिकेशन
VideoCapture ऑब्जेक्ट और बाइंडिंग शुरू करें. ध्यान दें कि यह बाइंडिंग
इसके लिए, इस्तेमाल के अन्य उदाहरणों के जैसा:
val recorder = Recorder.Builder()
.setExecutor(cameraExecutor).setQualitySelector(qualitySelector)
.build()
val videoCapture = VideoCapture.withOutput(recorder)
try {
// Bind use cases to camera
cameraProvider.bindToLifecycle(
this, CameraSelector.DEFAULT_BACK_CAMERA, preview, videoCapture)
} catch(exc: Exception) {
Log.e(TAG, "Use case binding failed", exc)
}
ध्यान दें कि bindToLifecycle(), Camera ऑब्जेक्ट दिखाता है. ज़ूम और एक्सपोज़र जैसे कैमरे के आउटपुट को कंट्रोल करने के बारे में ज़्यादा जानकारी के लिए, यह गाइड देखें.
Recorder, सिस्टम के हिसाब से सबसे सही फ़ॉर्मैट चुनता है. सबसे ज़्यादा
सामान्य वीडियो कोडेक है
H.264 AVC)
कंटेनर फ़ॉर्मैट
MPEG-4.
रिकॉर्डिंग कॉन्फ़िगर करें और बनाएं
ऐप्लिकेशन, Recorder से रिकॉर्डिंग ऑब्जेक्ट बना सकता है
वीडियो और ऑडियो कैप्चर कर सकते हैं. ऐप्लिकेशन ये काम करके रिकॉर्डिंग बनाते हैं
निम्न:
OutputOptionsकोprepareRecording()के साथ कॉन्फ़िगर करें.- (ज़रूरी नहीं) ऑडियो रिकॉर्डिंग चालू करें.
start()का इस्तेमाल करकेVideoRecordEventऔर वीडियो कैप्चर करना शुरू करने के लिए किया जा सकता है.
start() फ़ंक्शन को कॉल करने पर, Recorder एक Recording ऑब्जेक्ट दिखाता है.
आपका ऐप्लिकेशन, प्रोसेस पूरी करने के लिए, इस Recording ऑब्जेक्ट का इस्तेमाल कर सकता है
कैप्चर करने या कोई दूसरी कार्रवाई करने में मदद करता हो. जैसे, रोकना या फिर से शुरू करना.
Recorder में, एक बार में एक Recording ऑब्जेक्ट को इस्तेमाल किया जा सकता है. Google News
Recording.stop() कॉल करने के बाद, आप एक नई रिकॉर्डिंग
पिछले Recording ऑब्जेक्ट पर Recording.close().
आइए, इन चरणों के बारे में ज़्यादा जानकारी देखें. सबसे पहले, ऐप्लिकेशन कॉन्फ़िगर करता है कि
Recorder.prepareRecording() के साथ रिकॉर्डर के लिए, OutputOptions.
Recorder इस तरह के OutputOptions के साथ काम करता है:
- स्क्रीनशॉट में कैप्चर करने के लिए
FileDescriptorOutputOptionsFileDescriptor. Fileमें कैप्चर करने के लिएFileOutputOptions.- स्क्रीनशॉट में कैप्चर करने के लिए
MediaStoreOutputOptionsMediaStore.
सभी OutputOptions टाइप की मदद से, फ़ाइल का ज़्यादा से ज़्यादा साइज़ सेट किया जा सकता है
setFileSizeLimit(). दूसरे विकल्प हर आउटपुट के हिसाब से होते हैं
टाइप, जैसे कि FileDescriptorOutputOptions के लिए ParcelFileDescriptor.
prepareRecording(), PendingRecording ऑब्जेक्ट दिखाता है, जो कि
इंटरमीडिएट ऑब्जेक्ट, जिसका इस्तेमाल संबंधित
Recording ऑब्जेक्ट. PendingRecording एक अस्थायी क्लास है जिसे
ज़्यादातर मामलों में नहीं दिखती और ऐप्लिकेशन में शायद ही कभी कैश मेमोरी में सेव किया जाता है.
ऐप्लिकेशन, रिकॉर्डिंग को और कॉन्फ़िगर कर सकते हैं, जैसे:
withAudioEnabled()के साथ ऑडियो चालू करें.- वीडियो रिकॉर्डिंग इवेंट पाने के लिए, लिसनर को रजिस्टर करें
start(Executor, Consumer<VideoRecordEvent>)के साथ. - वीडियो कैप्चर के अटैच होने पर, रिकॉर्डिंग को लगातार रिकॉर्ड करने की अनुमति दें
वापस आ गया है और
PendingRecording.asPersistentRecording().
रिकॉर्डिंग शुरू करने के लिए, PendingRecording.start() पर कॉल करें. CameraX,
PendingRecording को Recording में, रिकॉर्डिंग के अनुरोध को सूची में शामिल करता है,
और ऐप्लिकेशन में नया बनाया गया Recording ऑब्जेक्ट लौटाता है.
संबंधित कैमरा डिवाइस पर रिकॉर्डिंग शुरू होने पर, CameraX
VideoRecordEvent.EVENT_TYPE_START इवेंट.
नीचे दिए गए उदाहरण में बताया गया है कि
MediaStore फ़ाइल:
// Create MediaStoreOutputOptions for our recorder
val name = "CameraX-recording-" +
SimpleDateFormat(FILENAME_FORMAT, Locale.US)
.format(System.currentTimeMillis()) + ".mp4"
val contentValues = ContentValues().apply {
put(MediaStore.Video.Media.DISPLAY_NAME, name)
}
val mediaStoreOutput = MediaStoreOutputOptions.Builder(this.contentResolver,
MediaStore.Video.Media.EXTERNAL_CONTENT_URI)
.setContentValues(contentValues)
.build()
// 2. Configure Recorder and Start recording to the mediaStoreOutput.
val recording = videoCapture.output
.prepareRecording(context, mediaStoreOutput)
.withAudioEnabled()
.start(ContextCompat.getMainExecutor(this), captureListener)
कैमरे की झलक, डिफ़ॉल्ट रूप से फ़्रंट कैमरे की स्क्रीन पर दिखती है. हालांकि, वीडियो के लिए Videoकैप्चर की मदद से रिकॉर्ड किए गए वीडियो का डुप्लीकेट वर्शन नहीं बनाया जाता. CameraX 1.3 के साथ, अब वीडियो रिकॉर्डिंग को मिरर किया जा सकता है, ताकि फ़्रंट कैमरे की झलक और रिकॉर्ड किए गए मिलते-जुलते वीडियो.
मिररमोड के तीन विकल्प हैं: MIRROR_Mode_OFF, MIRROR_mode_ON, और
MIRROR_Mode_ON_FRONT_ONLY. के साथ अलाइन करने के लिए
कैमरा प्रीव्यू, Google MIROR_Mode_ON_FRONT_ONLY का इस्तेमाल करने का सुझाव देता है, जिसका मतलब है
वह
पीछे के कैमरे के लिए डुप्लीकेट वर्शन बनाने की सुविधा चालू नहीं है, लेकिन सामने के हिस्से के लिए यह सुविधा चालू है
कैमरा. मिररमोड के बारे में ज़्यादा जानकारी के लिए, यहां देखें
MirrorMode constants.
यह कोड स्निपेट कॉल करने का तरीका बताता है
MIRROR_MODE_ON_FRONT_ONLY का इस्तेमाल करके VideoCapture.Builder.setMirrorMode(). इसके लिए
ज़्यादा जानकारी के लिए, setMirrorMode() देखें.
Kotlin
val recorder = Recorder.Builder().build() val videoCapture = VideoCapture.Builder(recorder) .setMirrorMode(MIRROR_MODE_ON_FRONT_ONLY) .build() useCases.add(videoCapture);
Java
Recorder.Builder builder = new Recorder.Builder(); if (mVideoQuality != QUALITY_AUTO) { builder.setQualitySelector( QualitySelector.from(mVideoQuality)); } VideoCapture<Recorder> videoCapture = new VideoCapture.Builder<>(builder.build()) .setMirrorMode(MIRROR_MODE_ON_FRONT_ONLY) .build(); useCases.add(videoCapture);
चालू रिकॉर्डिंग को कंट्रोल करना
चल रहे Recording को इस तरह से रोका, फिर से शुरू, और बंद किया जा सकता है:
इन तरीकों का इस्तेमाल करके:
pauseताकि मौजूदा चालू रिकॉर्डिंग को रोका जा सके.resume()ताकि रोकी गई हो चुकी रिकॉर्डिंग को फिर से शुरू किया जा सके.stop()का इस्तेमाल करना होगा.mute()का उपयोग करें.
ध्यान दें कि Recording की सदस्यता खत्म करने के लिए, stop() को कॉल किया जा सकता है, भले ही
यह तय करता है कि रिकॉर्डिंग रुकी हुई है या चालू है.
अगर आपने EventListener को इनके साथ रजिस्टर किया है
PendingRecording.start(), Recording लोगों को सूचना देता है
और पासवर्ड का इस्तेमाल करके
VideoRecordEvent.
VideoRecordEvent.EVENT_TYPE_STATUSका इस्तेमाल, आंकड़ों को रिकॉर्ड करने के लिए किया जाता है का इस्तेमाल किया जा सकता है.- रिकॉर्डिंग के नतीजे के लिए
VideoRecordEvent.EVENT_TYPE_FINALIZEका इस्तेमाल किया जा रहा है इसमें फ़ाइनल फ़ाइल के यूआरआई जैसी जानकारी के साथ-साथ, यह जानकारी भी शामिल होती है गड़बड़ी हुई है.
आपके ऐप्लिकेशन को EVENT_TYPE_FINALIZE मिलने के बाद, यह बताता है कि
रिकॉर्डिंग सत्र, तो आप कैप्चर किए गए वीडियो को स्थान से एक्सेस कर सकते हैं
OutputOptions में बताया गया है.
अन्य संसाधन
CameraX के बारे में ज़्यादा जानने के लिए, इन अतिरिक्त संसाधनों को देखें:
- CameraX कोडलैब का इस्तेमाल शुरू करना
- CameraX का आधिकारिक सैंपल ऐप्लिकेशन
- सबसे नया CameraX वीडियो कैप्चर एपीआई की सूची
- CameraX प्रॉडक्ट की जानकारी
- CameraX का सोर्स कोड