একটি ক্যাপচারিং সিস্টেম সাধারণত ভিডিও এবং অডিও স্ট্রীম রেকর্ড করে, সেগুলিকে সংকুচিত করে, দুটি স্ট্রীমকে মিক্স করে, তারপর ফলস্বরূপ স্ট্রিমটিকে ডিস্কে লিখে।
ক্যামেরাএক্সে, ভিডিও ক্যাপচারের সমাধান হল VideoCapture
ব্যবহারের ক্ষেত্রে:
চিত্র 2-এ দেখানো হয়েছে, ক্যামেরাএক্স ভিডিও ক্যাপচারে কয়েকটি উচ্চ-স্তরের স্থাপত্য উপাদান রয়েছে:
- ভিডিও উৎসের জন্য
SurfaceProvider
. - অডিও উৎসের জন্য
AudioSource
। - ভিডিও/অডিও এনকোড এবং সংকুচিত করার জন্য দুটি এনকোডার।
- দুটি স্ট্রিম মিক্স করার জন্য একটি মিডিয়া মুক্সার।
- ফলাফল লিখতে একটি ফাইল সেভার।
ভিডিওক্যাপচার এপিআই জটিল ক্যাপচারিং ইঞ্জিনকে বিমূর্ত করে এবং অনেক সহজ এবং সরল এপিআই সহ অ্যাপ্লিকেশন সরবরাহ করে।
VideoCapture API ওভারভিউ
VideoCapture
হল একটি CameraX ব্যবহারের ক্ষেত্রে যা নিজে থেকে বা অন্যান্য ব্যবহারের ক্ষেত্রে একত্রিত হলে ভাল কাজ করে। নির্দিষ্ট সমর্থিত সংমিশ্রণগুলি ক্যামেরার হার্ডওয়্যার ক্ষমতার উপর নির্ভর করে, তবে Preview
এবং VideoCapture
সমস্ত ডিভাইসে একটি বৈধ ব্যবহারের ক্ষেত্রে সমন্বয়।
ভিডিওক্যাপচার এপিআই নিম্নলিখিত বস্তুগুলি নিয়ে গঠিত যা অ্যাপ্লিকেশনগুলির সাথে যোগাযোগ করে:
-
VideoCapture
হল টপ-লেভেল ইউজ কেস ক্লাস।VideoCapture
একটিCameraSelector
এবং অন্যান্য CameraX UseCases সহ একজনLifecycleOwner
এর সাথে আবদ্ধ হয়। এই ধারণা এবং ব্যবহার সম্পর্কে আরও তথ্যের জন্য, CameraX আর্কিটেকচার দেখুন। - একটি
Recorder
হল ভিডিওআউটপুটের একটি বাস্তবায়ন যাVideoCapture
সাথে শক্তভাবে মিলিত হয়। ভিডিও এবং অডিও ক্যাপচার করার জন্যRecorder
ব্যবহার করা হয়। একটি অ্যাপ্লিকেশন একটিRecorder
থেকে রেকর্ডিং তৈরি করে । - একটি
PendingRecording
একটি রেকর্ডিং কনফিগার করে, অডিও সক্ষম করা এবং একটি ইভেন্ট লিসেনার সেট করার মতো বিকল্পগুলি প্রদান করে। একটিPendingRecording
তৈরি করতে আপনাকে অবশ্যই একটিRecorder
ব্যবহার করতে হবে। একটিPendingRecording
কিছু রেকর্ড করে না। - একটি
Recording
প্রকৃত রেকর্ডিং সম্পাদন করে। একটিRecording
তৈরি করতে আপনাকে অবশ্যই একটিPendingRecording
ব্যবহার করতে হবে৷
চিত্র 3 এই বস্তুর মধ্যে সম্পর্ক দেখায়:
কিংবদন্তি:
-
QualitySelector
দিয়ে একটিRecorder
তৈরি করুন। -
OutputOptions
একটি দিয়েRecorder
কনফিগার করুন। - যদি প্রয়োজন হয় তাহলে
withAudioEnabled()
দিয়ে অডিও সক্ষম করুন। - রেকর্ডিং শুরু করতে একটি
VideoRecordEvent
শ্রোতার সাথেstart()
কল করুন। - রেকর্ডিং নিয়ন্ত্রণ করতে
Recording
-এpause()
/resume()
/stop()
ব্যবহার করুন। - আপনার ইভেন্ট শ্রোতার ভিতরে
VideoRecordEvents
এ সাড়া দিন।
বিস্তারিত API তালিকা উৎস কোডের ভিতরে current.txt- এ রয়েছে।
VideoCapture API ব্যবহার করে
আপনার অ্যাপে CameraX VideoCapture
ব্যবহার কেস সংহত করতে, নিম্নলিখিতগুলি করুন:
-
VideoCapture
বাঁধুন। - রেকর্ডিং প্রস্তুত করুন এবং কনফিগার করুন।
- রানটাইম রেকর্ডিং শুরু করুন এবং নিয়ন্ত্রণ করুন।
নিম্নলিখিত বিভাগগুলি একটি এন্ড-টু-এন্ড রেকর্ডিং সেশন পেতে প্রতিটি ধাপে আপনি কী করতে পারেন তার রূপরেখা দেয়।
ভিডিও ক্যাপচার বাঁধুন
VideoCapure
ব্যবহারের ক্ষেত্রে আবদ্ধ করতে, নিম্নলিখিতগুলি করুন:
- একটি
Recorder
অবজেক্ট তৈরি করুন। -
VideoCapture
অবজেক্ট তৈরি করুন। - একটি
Lifecycle
আবদ্ধ হন।
CameraX VideoCapture API বিল্ডার ডিজাইন প্যাটার্ন অনুসরণ করে। অ্যাপ্লিকেশন একটি Recorder
তৈরি করতে Recorder.Builder
ব্যবহার করে। আপনি একটি QualitySelector
অবজেক্টের মাধ্যমে Recorder
জন্য ভিডিও রেজোলিউশন কনফিগার করতে পারেন।
ক্যামেরাএক্স Recorder
ভিডিও রেজোলিউশনের জন্য নিম্নলিখিত পূর্ব-নির্ধারিত Qualities
সমর্থন করে:
-
Quality.UHD
4K আল্ট্রা এইচডি ভিডিও আকারের জন্য UHD (2160p) - পূর্ণ HD ভিডিও আকারের জন্য
Quality.FHD
(1080p) - HD ভিডিও আকারের জন্য
Quality.HD
(720p) -
Quality.SD
এসডি ভিডিও সাইজের জন্য এসডি (480p)
মনে রাখবেন যে অ্যাপ দ্বারা অনুমোদিত হলে 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
থেকে, অ্যাপ্লিকেশনটি ভিডিও এবং অডিও ক্যাপচার করার জন্য রেকর্ডিং বস্তু তৈরি করতে পারে। অ্যাপ্লিকেশনগুলি নিম্নলিখিতগুলি করে রেকর্ডিং তৈরি করে:
-
prepareRecording()
দিয়েOutputOptions
কনফিগার করুন। - (ঐচ্ছিক) অডিও রেকর্ডিং সক্ষম করুন।
- একটি
VideoRecordEvent
শ্রোতা নিবন্ধন করতেstart()
ব্যবহার করুন এবং ভিডিও ক্যাপচারিং শুরু করুন।
আপনি start()
ফাংশন কল করলে Recorder
একটি Recording
অবজেক্ট প্রদান করে। আপনার অ্যাপ্লিকেশন এই Recording
অবজেক্টটি ক্যাপচার শেষ করতে বা অন্যান্য ক্রিয়া সম্পাদন করতে ব্যবহার করতে পারে, যেমন বিরতি দেওয়া বা পুনরায় শুরু করা।
একটি Recorder
একটি সময়ে একটি Recording
বস্তুকে সমর্থন করে। আগের Recording
অবজেক্টে Recording.stop()
বা Recording.close()
কল করার পরে আপনি একটি নতুন রেকর্ডিং শুরু করতে পারেন।
আসুন আরও বিস্তারিতভাবে এই পদক্ষেপগুলি দেখুন। প্রথমত, অ্যাপ্লিকেশনটি Recorder.prepareRecording()
দিয়ে রেকর্ডারের জন্য OutputOptions
কনফিগার করে। একটি Recorder
নিম্নলিখিত ধরনের OutputOptions
সমর্থন করে:
-
FileDescriptorOutputOptions
একটিFileDescriptor
এ ক্যাপচার করার জন্য। - একটি
File
ক্যাপচার করার জন্যFileOutputOptions
। -
MediaStore
ক্যাপচার করার জন্যMediaStoreOutputOptions
।
সমস্ত 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
পাঠায়।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)
ক্যামেরা প্রিভিউ ডিফল্টরূপে সামনের ক্যামেরায় মিরর করা হলেও, VideoCapture দ্বারা রেকর্ড করা ভিডিওগুলি ডিফল্টরূপে মিরর করা হয় না। CameraX 1.3 এর সাথে, এখন ভিডিও রেকর্ডিং মিরর করা সম্ভব যাতে সামনের ক্যামেরা প্রিভিউ এবং রেকর্ড করা ভিডিও মিলে যায়।
তিনটি মিররমোড বিকল্প রয়েছে: MIRROR_MODE_OFF, MIRROR_MODE_ON, এবং MIRROR_MODE_ON_FRONT_ONLY৷ ক্যামেরা প্রিভিউতে সারিবদ্ধ করার জন্য, Google MIROR_MODE_ON_FRONT_ONLY ব্যবহার করার সুপারিশ করে, যার অর্থ হল পিছনের ক্যামেরার জন্য মিররিং সক্ষম করা হয়নি, কিন্তু সামনের ক্যামেরার জন্য সক্ষম করা হয়েছে৷ MirrorMode সম্পর্কে আরও তথ্যের জন্য, MirrorMode constants
দেখুন।
এই কোড স্নিপেটটি দেখায় কিভাবে MIRROR_MODE_ON_FRONT_ONLY
ব্যবহার করে VideoCapture.Builder.setMirrorMode()
কে কল করতে হয়। আরও তথ্যের জন্য, setMirrorMode()
দেখুন।
কোটলিন
val recorder = Recorder.Builder().build() val videoCapture = VideoCapture.Builder(recorder) .setMirrorMode(MIRROR_MODE_ON_FRONT_ONLY) .build() useCases.add(videoCapture);
জাভা
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()
কল করতে পারেন।
আপনি যদি PendingRecording.start()
এর সাথে একটি EventListener
নিবন্ধন করে থাকেন, তাহলে Recording
একটি VideoRecordEvent
ব্যবহার করে যোগাযোগ করে।
-
VideoRecordEvent.EVENT_TYPE_STATUS
বর্তমান ফাইলের আকার এবং রেকর্ড করা সময়কালের মতো পরিসংখ্যান রেকর্ড করার জন্য ব্যবহৃত হয়। -
VideoRecordEvent.EVENT_TYPE_FINALIZE
রেকর্ডিং ফলাফলের জন্য ব্যবহার করা হয় এবং যেকোন সম্পর্কিত ত্রুটি সহ চূড়ান্ত ফাইলের URI-এর মতো তথ্য অন্তর্ভুক্ত করে৷
একবার আপনার অ্যাপ্লিকেশানটি একটি EVENT_TYPE_FINALIZE
পেয়ে গেলে যা একটি সফল রেকর্ডিং সেশন নির্দেশ করে, তারপর আপনি OutputOptions
এ নির্দিষ্ট অবস্থান থেকে ক্যাপচার করা ভিডিও অ্যাক্সেস করতে পারবেন।
অতিরিক্ত সম্পদ
CameraX সম্পর্কে আরও জানতে, নিম্নলিখিত অতিরিক্ত সংস্থানগুলি দেখুন:
- ক্যামেরাএক্স কোডল্যাব দিয়ে শুরু করা
- অফিসিয়াল ক্যামেরাএক্স নমুনা অ্যাপ
- সর্বশেষ ক্যামেরাএক্স ভিডিও ক্যাপচার API তালিকা
- ক্যামেরাএক্স রিলিজ নোট
- ক্যামেরাএক্স সোর্স কোড