आम तौर पर, कैप्चर करने वाला सिस्टम वीडियो और ऑडियो स्ट्रीम को रिकॉर्ड करता है, उन्हें कंप्रेस करता है, दोनों स्ट्रीम को मैक्स करता है, फिर नतीजे की स्ट्रीम को डिस्क पर लिखता है.
CameraX में, वीडियो कैप्चर करने की सुविधा यह है कि
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
के साथ काम करता है:
- स्क्रीनशॉट में कैप्चर करने के लिए
FileDescriptorOutputOptions
FileDescriptor
. File
में कैप्चर करने के लिएFileOutputOptions
.- स्क्रीनशॉट में कैप्चर करने के लिए
MediaStoreOutputOptions
MediaStore
.
सभी 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 का सोर्स कोड