মোবাইল অ্যাপ্লিকেশনে ক্যামেরা হল ডিভাইসের একটি হার্ডওয়্যার মডিউল যা ডেভেলপারের জন্য সিস্টেম API-এর মাধ্যমে ইমেজ এবং ভিডিও ক্যাপচার করার জন্য উপলব্ধ। Google Android Developers (2025) অনুসারে, ক্যামেরা কার্যকারিতা প্রয়োজন এমন 85% এর বেশি Android অ্যাপ্লিকেশনে CameraX ব্যবহৃত হয়। iOS-এ AVFoundation এবং Android-এ CameraX উচ্চ-স্তরের ইন্টারফেস প্রদান করে যা হার্ডওয়্যার ম্যানেজমেন্টের জটিলতা লুকিয়ে রাখে।
মূল বিষয়
মোবাইল ক্যামেরা হল একটি ইন্টিগ্রেটেড অপটিক্যাল মডিউল যা একটি লেন্স, ইমেজ সেন্সর এবং ইমেজ সিগন্যাল প্রসেসর (ISP) নিয়ে গঠিত। ডেভেলপার বিশেষায়িত ফ্রেমওয়ার্ক ব্যবহার করে অপারেটিং সিস্টেমের মাধ্যমে ক্যামেরায় অ্যাক্সেস পায়। Android-এ, এগুলো হল Camera2 API (নিম্ন-স্তরের) এবং CameraX (উচ্চ-স্তরের, Camera2-এর উপর ভিত্তি করে), এবং iOS-এ — AVFoundation এবং সহজ পরিস্থিতির জন্য UIKit। প্রতিটি প্ল্যাটফর্ম তার নিজস্ব টুলসেট প্রদান করে, কিন্তু সাধারণ ধারণা একই: অ্যাপ্লিকেশন একটি ক্যাপচার সেশন শুরু করে, প্যারামিটার (রেজোলিউশন, ফোকাস, এক্সপোজার) কনফিগার করে এবং ফ্রেম স্ট্রিম বা পৃথক ইমেজ গ্রহণ করে।
আধুনিক মোবাইল ক্যামেরা অনেক শুটিং মোড সমর্থন করে: HDR, নাইট মোড, ব্যাকগ্রাউন্ড ব্লার সহ পোর্ট্রেট, স্লো-মোশন ভিডিও এবং RAW ফরম্যাটে রেকর্ডিং। ডেভেলপারের সফটওয়্যার সেটিংসে অ্যাক্সেস রয়েছে: ISO (সেন্সর সংবেদনশীলতা), শাটার স্পিড (এক্সপোজার), হোয়াইট ব্যালেন্স, ফোকাস (অটোমেটিক এবং ম্যানুয়াল) এবং ইমেজ স্টেবিলাইজেশন। ফ্ল্যাগশিপ ডিভাইসে বিভিন্ন ফোকাল লেন্থ সহ ৪টি পর্যন্ত ক্যামেরা থাকতে পারে এবং অ্যাপ্লিকেশন আইডি দ্বারা একটি নির্দিষ্ট ক্যামেরা নির্বাচন করতে পারে।
মোবাইল প্ল্যাটফর্মগুলি ক্যামেরার সাথে কাজ করার জন্য বেশ কয়েকটি API প্রদান করে, যা অ্যাবস্ট্রাকশন স্তর এবং কার্যকারিতায় ভিন্ন। একটি নির্দিষ্ট API-এর পছন্দ প্রকল্পের প্রয়োজনীয়তার উপর নির্ভর করে: সাধারণ ফটো ক্যাপচারের জন্য, CameraX বা UIImagePickerController যথেষ্ট; পেশাদার অ্যাপ্লিকেশনের জন্য, সরাসরি সেন্সর নিয়ন্ত্রণ সহ Camera2 বা AVFoundation প্রয়োজন। নীচে প্রধান API-গুলির তুলনা দেওয়া হল।
| API | প্ল্যাটফর্ম | স্তর | বৈশিষ্ট্য |
|---|---|---|---|
| CameraX | Android | উচ্চ | লাইফসাইকেল-সচেতন, 95% ডিভাইস |
| Camera2 | Android | নিম্ন | পূর্ণ নিয়ন্ত্রণ, RAW, Burst |
| AVFoundation | iOS | মধ্যম | পূর্ণ ক্যাপচার নিয়ন্ত্রণ |
| UIKit (UIImagePickerController) | iOS | উচ্চ | প্রস্তুত UI, কোনো কাস্টমাইজেশন নেই |
CameraX হল বেশিরভাগ Android অ্যাপ্লিকেশনের জন্য সর্বোত্তম পছন্দ যাদের গভীর কাস্টমাইজেশন ছাড়াই ক্যামেরা প্রয়োজন। লাইব্রেরি স্বয়ংক্রিয়ভাবে Activity এবং Fragment লাইফসাইকেল পরিচালনা করে, অনুমতি সমর্থন করে এবং বিভিন্ন Android সংস্করণ জুড়ে সামঞ্জস্য নিশ্চিত করে। CameraX তার সামঞ্জস্য স্তরের জন্য 95% Android ডিভাইসে ধারাবাহিক আচরণের গ্যারান্টি দেয়। যদি আপনার ক্যামেরা প্রিভিউ (Preview), ফটো ক্যাপচার (ImageCapture) বা ফ্রেম বিশ্লেষণ (ImageAnalysis) প্রয়োজন হয় — CameraX জটিল কোড না লিখেই তিনটি পরিস্থিতি পরিচালনা করে।
Camera2 পেশাদার পরিস্থিতির জন্য একটি নিম্ন-স্তরের API: RAW রেকর্ডিং, ম্যানুয়াল এক্সপোজার অ্যাডজাস্টমেন্ট, বর্ষ্ট ক্যাপচার এবং একসঙ্গে একাধিক ক্যামেরার নিয়ন্ত্রণ। Camera2-এর জন্য ডেভেলপারের ইমেজ ক্যাপচার পাইপলাইন, স্টেটমেশিন ম্যানেজমেন্ট এবং কলব্যাক হ্যান্ডলিং-এর গভীর বোঝাপড়া প্রয়োজন। Camera2 শুধুমাত্র তখনই ব্যবহার করুন যখন CameraX প্রয়োজনীয়তা পূরণ করে না: উদাহরণস্বরূপ, ম্যানুয়াল ফোকাস সহ ডকুমেন্ট স্ক্যানিং অ্যাপ্লিকেশন বা অ-মানক রেজোলিউশন সহ কাস্টম ক্যামেরা।
ক্যামেরায় অ্যাক্সেসের জন্য উভয় প্ল্যাটফর্মে ব্যবহারকারীর স্পষ্ট অনুমতি প্রয়োজন। Android-এ, CAMERA অনুমতি ম্যানিফেস্টে যোগ করা হয় এবং Android 6.0 থেকে শুরু করে, রানটাইমে ActivityCompat.requestPermissions-এর মাধ্যমেও অনুমতি অনুরোধ করতে হবে। iOS-এ, ক্যামেরা ব্যবহারের কারণের বিবরণ সহ Info.plist-এ NSCameraUsageDescription কী যোগ করা হয়। এই বিবরণ ছাড়া, ক্যামেরা অ্যাক্সেস করার চেষ্টা করলে অ্যাপ্লিকেশন ক্র্যাশ হবে। iOS 14 থেকে শুরু করে, অনুমতি ডায়ালগ শুধুমাত্র অ্যাপ্লিকেশনের নামই নয় বরং নির্দিষ্ট কারণও প্রদর্শন করে — শব্দচয়ন ব্যবহারকারীর কাছে স্পষ্ট হতে হবে।
CameraX কোডের কয়েক লাইনে ক্যামেরার সাথে কাজকে সহজ করে তোলে। প্রিভিউ শুরু করতে, আপনাকে Preview-এর একটি ইনস্ট্যান্স তৈরি করতে হবে, এটি LifecycleOwner-এর সাথে বাঁধতে হবে এবং প্রদর্শনের জন্য SurfaceProvider পেতে হবে। ফটো ক্যাপচারের জন্য, সেভ টার্গেট সহ ImageCapture ব্যবহার করা হয়। নীচে Kotlin-এ CameraX ব্যবহার করে ক্যামেরা শুরু এবং ফটো তোলার সম্পূর্ণ উদাহরণ দেওয়া হল।
val preview = Preview.Builder()
.build()
.also {
it.surfaceProvider = viewFinder.surfaceProvider
}
val imageCapture = ImageCapture.Builder()
.setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
.build()
val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener(Runnable {
val cameraProvider = cameraProviderFuture.get()
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
try {
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(
this, cameraSelector, preview, imageCapture
)
} catch (e: Exception) {
Log.e("CameraX", "বাইন্ড ব্যর্থ", e)
}
}, ContextCompact.getMainExecutor(this))
bindToLifecycle মেথড ক্যামেরাকে Activity-র লাইফসাইকেলের সাথে বাঁধে — যখন স্ক্রিন ঘোরে বা অ্যাপ্লিকেশন ব্যাকগ্রাউন্ডে যায়, ক্যামেরা স্বয়ংক্রিয়ভাবে রিলিজ হয়। CameraSelector.DEFAULT_BACK_CAMERA পিছনের ক্যামেরা নির্বাচন করে; সামনের ক্যামেরার জন্য DEFAULT_FRONT_CAMERA ব্যবহার করা হয়। বাঁধার পর, Preview PreviewView-এ ক্যামেরা ফিড প্রদর্শন শুরু করে এবং ব্যবহারকারী স্ক্রিনে ক্যামেরার ছবি দেখে।
val photoFile = File(
externalMediaDirs.firstOrNull(),
"IMG_${System.currentTimeMillis()}.jpg"
)
val outputOptions = ImageCapture.OutputFileOptions
.Builder(photoFile)
.build()
imageCapture.takePicture(
outputOptions,
ContextCompact.getMainExecutor(this),
object : ImageCapture.OnImageSavedCallback {
override fun onImageSaved(output: ImageCapture.OutputFileResults) {
Log.d("CameraX", "Photo saved: ${photoFile.absolutePath}")
}
override fun onError(exception: ImageCaptureException) {
Log.e("CameraX", "ক্যাপচার ত্রুটি", exception)
}
}
)
takePicture মেথড ক্যামেরা থেকে একটি ফ্রেম ক্যাপচার করে এবং ফাইলে সংরক্ষণ করে। OutputFileOptions File, ContentResolver এবং MediaStore-এ লেখা সমর্থন করে। onImageSaved কলব্যাকে, অ্যাপ্লিকেশন সফল সংরক্ষণের নোটিফিকেশন পায় এবং UI আপডেট করতে পারে। CAPTURE_MODE_MINIMIZE_LATENCY পোস্ট-প্রসেসিং কমিয়ে সর্বোচ্চ শাটার গতি নিশ্চিত করে।
iOS-এ, ক্যামেরায় অ্যাক্সেস AVFoundation ফ্রেমওয়ার্ক দ্বারা AVCaptureSession ক্লাসের মাধ্যমে প্রদান করা হয়। ডেভেলপার একটি ক্যাপচার সেশন তৈরি করে, প্রয়োজনীয় ইনপুট (AVCaptureDeviceInput) এবং আউটপুট (AVCapturePhotoOutput, AVCaptureVideoDataOutput) যোগ করে এবং সেশন শুরু করে। প্রিভিউ প্রদর্শনের জন্য AVCaptureVideoPreviewLayer ব্যবহার করা হয়। নীচে Swift-এ ফটো ক্যাপচারের জন্য সেশন সেটআপের উদাহরণ দেওয়া হল।
import AVFoundation
let captureSession = AVCaptureSession()
captureSession.sessionPreset = .photo
guard let camera = AVCaptureDevice.default(
for: .video
) else { return }
guard let input = try? AVCaptureDeviceInput(device: camera)
else { return }
let output = AVCapturePhotoOutput()
captureSession.addInput(input)
captureSession.addOutput(output)
DispatchQueue.global(qos: .userInitiated).async {
captureSession.startRunning()
}
AVCaptureSessionPreset.photo ফটোর জন্য সর্বোত্তম রেজোলিউশন সেট করে (সাধারণত আধুনিক ডিভাইসে 12 MP)। ইনপুট হল ডিভাইসের ক্যামেরার জন্য তৈরি AVCaptureDeviceInput। ইনপুট এবং আউটপুট যোগ করার পর, সেশন startRunning-এর মাধ্যমে ব্যাকগ্রাউন্ড থ্রেডে শুরু হয় — পুরনো ডিভাইসে সেশন শুরু হতে 200 ms পর্যন্ত সময় লাগতে পারে। ফটো ক্যাপচার করতে, capturePhoto(with:delegate:) কল করা হয় এবং ফলাফল AVCapturePhotoCaptureDelegate-এর মাধ্যমে ফেরত দেওয়া হয়।
ক্যামেরার সাথে মোবাইল ডিভাইসে কাজ করার সময়, হার্ডওয়্যার সীমাবদ্ধতা বিবেচনা করতে হবে: দীর্ঘ রেকর্ডিংয়ের সময় ডিভাইস গরম হওয়া, উচ্চ রেজোলিউশনে কাজ করার সময় ব্যাটারি খরচ এবং বিভিন্ন ডিভাইসে ভিন্ন ভিন্ন ক্যামেরা গুণমান। Android-এ, ইকোসিস্টেম ফ্র্যাগমেন্টেশনের অর্থ হল একই CameraX কনফিগারেশন বিভিন্ন মডেলে ভিন্নভাবে আচরণ করতে পারে। iOS-এ, সীমাবদ্ধতা প্রধানত লাইসেন্সিং সম্পর্কিত: ব্যাকগ্রাউন্ডে ক্যামেরা ব্যবহারের জন্য Apple-এর বিশেষ অনুমতি প্রয়োজন। এটাও মনে রাখা গুরুত্বপূর্ণ যে সিমুলেটরগুলির প্রকৃত ক্যামেরায় অ্যাক্সেস নেই — পরীক্ষা শুধুমাত্র ফিজিক্যাল ডিভাইসে সম্ভব।
CameraX CameraXConfig সামঞ্জস্য স্তরের মাধ্যমে Android ফ্র্যাগমেন্টেশনের সমস্যা সমাধান করে — লাইব্রেরি পরিচিত প্রস্তুতকারক বাগের জন্য স্বয়ংক্রিয়ভাবে ওয়ার্কঅ্যারাউন্ড প্রয়োগ করে। iOS-এ, AVFoundation iOS 6 থেকে শুরু করে সব ডিভাইসে একইভাবে কাজ করে, কিন্তু কিছু ফিচার (যেমন পোর্ট্রেট মোড বা LiDAR) শুধুমাত্র iPhone 12 এবং নতুন মডেলে উপলব্ধ। ক্রস-প্ল্যাটফর্ম অ্যাপ্লিকেশন ডেভেলপ করার সময়, ক্যামেরা প্লাগইন সহ Flutter বা React Native ব্যবহার করার পরামর্শ দেওয়া হয় — তারা প্ল্যাটফর্মের পার্থক্যগুলো অ্যাবস্ট্রাক্ট করে এবং উভয় অপারেটিং সিস্টেমের জন্য একটি ইউনিফাইড API প্রদান করে।
সচরাচর জিজ্ঞাসিত প্রশ্ন
বেশিরভাগ অ্যাপ্লিকেশনের জন্য, ব্যবহারের সহজতা, বিল্ট-ইন লাইফসাইকেল ম্যানেজমেন্ট এবং 95% ডিভাইসের সাথে সামঞ্জস্যের কারণে CameraX সুপারিশ করা হয়। Camera2 শুধুমাত্র তখনই নির্বাচন করা উচিত যখন RAW, বর্ষ্ট ক্যাপচার বা ম্যানুয়াল সেন্সর নিয়ন্ত্রণের প্রয়োজন হয়।
Android-এ, ম্যানিফেস্টে CAMERA অনুমতি যোগ করুন এবং রানটাইমে ActivityCompat.requestPermissions-এর মাধ্যমে অনুরোধ করুন। iOS-এ, ক্যামেরা ব্যবহারের কারণের স্পষ্ট ব্যাখ্যা সহ Info.plist-এ NSCameraUsageDescription যোগ করুন।
iOS-এ, ব্যাকগ্রাউন্ডে ক্যামেরা ব্যবহার কঠোরভাবে সীমিত — বিশেষ Apple অনুমতি প্রয়োজন। Android-এ, ক্যামেরা ফোরগ্রাউন্ড সার্ভিসের মাধ্যমে ব্যাকগ্রাউন্ডে কাজ করতে পারে, কিন্তু এটি ব্যাটারি লাইফ এবং ডিভাইস গরম হওয়ার উপর নেতিবাচক প্রভাব ফেলে।
iOS সিমুলেটর এবং Android এমুলেটরের হার্ডওয়্যার ক্যামেরায় অ্যাক্সেস নেই — তারা ফিজিক্যাল সেন্সর ইমুলেট করে না। ক্যামেরা কার্যকারিতা পরীক্ষা করতে, সবসময় ফিজিক্যাল ডিভাইস বা কম্পিউটারের সাথে সংযুক্ত বাহ্যিক ক্যামেরা ব্যবহার করুন।
ImageAnalysis হল CameraX-এর একটি ফ্রেম স্ট্রিম অ্যানালাইজার যা প্রসেসিংয়ের জন্য প্রতিটি ফ্রেম ImageAnalysis.Analyzer-এ পাঠায়। এটি QR কোড শনাক্তকরণ, মুখ শনাক্তকরণ, ডকুমেন্ট স্ক্যানিং এবং অন্যান্য কম্পিউটার ভিশন কাজের জন্য ব্যবহৃত হয়।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন