কম্পিউটার

অ্যান্ড্রয়েড ক্যামেরা 2 - ফটো এবং ভিডিও তোলার জন্য ক্যামেরা 2 এপিআই কীভাবে ব্যবহার করবেন

আমরা সবাই আমাদের ফোনে ক্যামেরা ব্যবহার করি এবং আমরা এটি একটি l-o-t ব্যবহার করি। এমনকি এমন কিছু অ্যাপ্লিকেশন রয়েছে যা ক্যামেরাটিকে একটি বৈশিষ্ট্য হিসাবে সংহত করেছে।

এক প্রান্তে, ক্যামেরার সাথে ইন্টারঅ্যাক্ট করার একটি আদর্শ উপায় রয়েছে। অন্যদিকে, ক্যামেরার সাথে আপনার মিথস্ক্রিয়া কাস্টমাইজ করার একটি উপায় রয়েছে। এই পার্থক্য করা একটি গুরুত্বপূর্ণ এক. এবং সেখানেই ক্যামেরা2 আসে৷

ক্যামেরা2 কি?

যদিও এটি এপিআই লেভেল 21 থেকে পাওয়া যাচ্ছে, ক্যামেরা 2 এপিআই আর্কিটেকচার ডেভেলপারদের মোকাবেলা করার জন্য আরও জটিল অংশগুলির মধ্যে একটি হয়ে উঠেছে।

এই API এবং এর পূর্বসূরী স্থাপন করা হয়েছিল যাতে ডেভেলপাররা তাদের অ্যাপ্লিকেশনের ভিতরে ক্যামেরার সাথে ইন্টারঅ্যাক্ট করার ক্ষমতা ব্যবহার করতে পারে।

কিভাবে মাইক্রোফোন বা ডিভাইসের ভলিউমের সাথে ইন্টারঅ্যাক্ট করার উপায় আছে, ক্যামেরা2 API আপনাকে ডিভাইসের ক্যামেরার সাথে ইন্টারঅ্যাক্ট করার জন্য টুল দেয়।

সাধারণভাবে, আপনি যদি Camera2 API ব্যবহার করতে চান তবে এটি সম্ভবত একটি ছবি তোলা বা একটি ভিডিও রেকর্ড করার চেয়ে বেশি কিছুর জন্য হতে পারে। এর কারণ হল API আপনাকে বিভিন্ন ক্লাস এক্সপোজ করে ক্যামেরার গভীরতা নিয়ন্ত্রণ করতে দেয় যা নির্দিষ্ট ডিভাইসের জন্য কনফিগার করতে হবে।

এমনকি যদি আপনি আগে ক্যামেরার সাথে মোকাবিলা করে থাকেন তবে এটি প্রাক্তন ক্যামেরা API থেকে এমন একটি কঠোর পরিবর্তন, যা আপনি যা জানেন তা ভুলে যেতে পারেন।

সেখানে প্রচুর সংস্থান রয়েছে যা এই APIটি কীভাবে সরাসরি ব্যবহার করতে হয় তা প্রদর্শন করার চেষ্টা করে, তবে তাদের মধ্যে কিছু পুরানো হতে পারে এবং কিছু পুরো চিত্রটি উপস্থাপন করে না।

সুতরাং, নিজের দ্বারা অনুপস্থিত অংশগুলি পূরণ করার চেষ্টা করার পরিবর্তে, এই নিবন্ধটি (আশা করি) Camera2 API এর সাথে ইন্টারঅ্যাক্ট করার জন্য আপনার ওয়ান স্টপ শপ হবে৷

Camera2 ব্যবহারের ক্ষেত্রে

আমরা কিছুতে ডুব দেওয়ার আগে, এটি বোঝা গুরুত্বপূর্ণ যে আপনি যদি শুধুমাত্র একটি ছবি তুলতে বা একটি ভিডিও রেকর্ড করার জন্য ক্যামেরা ব্যবহার করতে চান তবে আপনাকে Camera2 API নিয়ে নিজেকে বিরক্ত করার দরকার নেই৷

Camera2 API ব্যবহার করার প্রাথমিক কারণ হল যদি আপনার অ্যাপ্লিকেশনটির ক্যামেরা বা এর কার্যকারিতার সাথে কিছু কাস্টম মিথস্ক্রিয়া প্রয়োজন।

আপনি যদি পরেরটির পরিবর্তে আগেরটি করতে আগ্রহী হন তবে আমি আপনাকে Google থেকে নিম্নলিখিত ডকুমেন্টেশন দেখার পরামর্শ দেব:

  1. ফটো তুলুন
  2. ভিডিও ক্যাপচার করুন

সেখানে আপনি আপনার ক্যামেরা দিয়ে দুর্দান্ত ফটো এবং ভিডিওগুলি ক্যাপচার করার জন্য প্রয়োজনীয় সমস্ত পদক্ষেপগুলি পাবেন৷ কিন্তু এই নিবন্ধে, মূল ফোকাস হবে কিভাবে Camera2 ব্যবহার করতে হয়।

এখন, আমাদের ম্যানিফেস্ট ফাইলে কিছু জিনিস যোগ করতে হবে:

ক্যামেরা অনুমতি:

<uses-permission android:name="android.permission.CAMERA" />

ক্যামেরা বৈশিষ্ট্য:

<uses-feature android:name="android.hardware.camera" />

ক্যামেরার অনুমতি দেওয়া হয়েছে কি না তা আপনাকে পরীক্ষা করে দেখতে হবে, কিন্তু যেহেতু এই বিষয়টি ব্যাপকভাবে কভার করা হয়েছে, তাই আমরা এই নিবন্ধে এটি নিয়ে কাজ করব না।

ক্যামেরা2 এপিআই উপাদানগুলি কীভাবে সেট আপ করবেন

Camera2 API বেশ কিছু নতুন ইন্টারফেস এবং ক্লাস প্রবর্তন করে। আসুন সেগুলির প্রত্যেকটিকে ভেঙে ফেলি যাতে আমরা তাদের কীভাবে ব্যবহার করতে হয় তা আরও ভালভাবে বুঝতে পারি৷

অ্যান্ড্রয়েড ক্যামেরা 2 - ফটো এবং ভিডিও তোলার জন্য ক্যামেরা 2 এপিআই কীভাবে ব্যবহার করবেন
এই সমস্ত উপাদানগুলি দেখুন

প্রথমত, আমরা টেক্সচারভিউ দিয়ে শুরু করব।

Camera2 টেক্সচারভিউ উপাদান

একটি TextureView হল একটি UI উপাদান যা আপনি একটি বিষয়বস্তু স্ট্রিম (ভিডিও চিন্তা করুন) প্রদর্শন করতে ব্যবহার করেন। ক্যামেরা থেকে ফিড প্রদর্শন করার জন্য আমাদের একটি টেক্সচারভিউ ব্যবহার করতে হবে, তা একটি প্রিভিউ হোক বা ছবি/ভিডিও তোলার আগে।

টেক্সচারভিউ সম্পর্কিত দুটি বৈশিষ্ট্য ব্যবহার করা গুরুত্বপূর্ণ:

  • সারফেসটেক্সচার ক্ষেত্র
  • The SurfaceTextureListener ইন্টারফেস

প্রথমটি যেখানে বিষয়বস্তু প্রদর্শিত হবে, এবং দ্বিতীয়টিতে চারটি কলব্যাক রয়েছে:

  1. অনসারফেসটেক্সচার উপলভ্য
  2. onSurfaceTextureSizeChanged
  3. onSurfaceTextureUpdated
  4. onSurfaceTextureDestroyed
private val surfaceTextureListener = object : TextureView.SurfaceTextureListener {
        override fun onSurfaceTextureAvailable(texture: SurfaceTexture, width: Int, height: Int) {

        }
        override fun onSurfaceTextureSizeChanged(texture: SurfaceTexture, width: Int, height: Int) {
        
        }
        
        override fun onSurfaceTextureDestroyed(texture: SurfaceTexture) {
           
        }
        override fun onSurfaceTextureUpdated(texture: SurfaceTexture) {
          
        }
}

ক্যামেরা ব্যবহার করার সময় প্রথম কলব্যাক অত্যন্ত গুরুত্বপূর্ণ। এর কারণ হল আমরা যখন সারফেসটেক্সচার উপলব্ধ থাকে তখন আমরা বিজ্ঞপ্তি পেতে চাই যাতে আমরা এটিতে ফিড প্রদর্শন করা শুরু করতে পারি।

সচেতন থাকুন যে একবার টেক্সচারভিউ একটি উইন্ডোতে সংযুক্ত হলেই এটি উপলব্ধ হয়৷

ক্যামেরার সাথে ইন্টারঅ্যাক্ট করা আগের API থেকে পরিবর্তিত হয়েছে। এখন, আমাদের কাছে ক্যামেরা ম্যানেজার আছে। এটি একটি সিস্টেম পরিষেবা যা আমাদের ক্যামেরাডিভাইস অবজেক্টের সাথে ইন্টারঅ্যাক্ট করতে দেয়।

আপনি যে পদ্ধতিগুলিতে গভীর মনোযোগ দিতে চান তা হল:

  • ওপেন ক্যামেরা
  • গেটক্যামেরার বৈশিষ্ট্য
  • getCameraIdList

TextureView উপলব্ধ এবং প্রস্তুত তা জানার পরে, ক্যামেরার সাথে একটি সংযোগ খুলতে আমাদের openCamera কল করতে হবে। এই পদ্ধতিতে তিনটি আর্গুমেন্ট লাগে:

  1. CameraId - স্ট্রিং
  2. CameraDevice.StateCallback
  3. একজন হ্যান্ডলার

CameraId আর্গুমেন্ট বোঝায় আমরা কোন ক্যামেরার সাথে সংযোগ করতে চাই। আপনার ফোনে, প্রধানত দুটি ক্যামেরা আছে, সামনে এবং পিছনে। প্রত্যেকের নিজস্ব স্বতন্ত্র আইডি আছে। সাধারণত, এটি হয় একটি শূন্য বা একটি।

আমরা কিভাবে ক্যামেরা আইডি পেতে পারি? আমরা CameraManager-এর getCamerasIdList পদ্ধতি ব্যবহার করি। এটি ডিভাইস থেকে চিহ্নিত সমস্ত ক্যামেরা আইডির স্ট্রিং ধরনের একটি অ্যারে ফিরিয়ে দেবে।

val cameraManager: CameraManager = getSystemService(Context.CAMERA_SERVICE) as CameraManager
val cameraIds: Array<String> = cameraManager.cameraIdList
var cameraId: String = ""
for (id in cameraIds) {
    val cameraCharacteristics = cameraManager.getCameraCharacteristics(id)
    //If we want to choose the rear facing camera instead of the front facing one
    if (cameraCharacteristics.get(CameraCharacteristics.LENS_FACING) == CameraCharacteristics.LENS_FACING_FRONT) 
      continue
    }
    
    val previewSize = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP)!!.getOutputSizes(ImageFormat.JPEG).maxByOrNull { it.height * it.width }!!
    val imageReader = ImageReader.newInstance(previewSize.width, previewSize.height, ImageFormat.JPEG, 1)
    imageReader.setOnImageAvailableListener(onImageAvailableListener, backgroundHandler)
    cameraId = id
}

আমরা এটি খোলার চেষ্টা করার পর পরবর্তী আর্গুমেন্ট হল ক্যামেরা স্টেটে কলব্যাক। আপনি যদি এটি সম্পর্কে চিন্তা করেন তবে এই কর্মের জন্য শুধুমাত্র কয়েকটি ফলাফল হতে পারে:

  • ক্যামেরা সফলভাবে খুলতে পরিচালনা করে
  • ক্যামেরা সংযোগ বিচ্ছিন্ন হয়
  • কিছু ​​ত্রুটি ঘটে

এবং এটিই আপনি ক্যামেরা ডিভাইসের ভিতরে পাবেন।StateCallback:

 private val cameraStateCallback = object : CameraDevice.StateCallback() {
        override fun onOpened(camera: CameraDevice) {
           
        }

        override fun onDisconnected(cameraDevice: CameraDevice) {
           
        }

        override fun onError(cameraDevice: CameraDevice, error: Int) {
            val errorMsg = when(error) {
                ERROR_CAMERA_DEVICE -> "Fatal (device)"
                ERROR_CAMERA_DISABLED -> "Device policy"
                ERROR_CAMERA_IN_USE -> "Camera in use"
                ERROR_CAMERA_SERVICE -> "Fatal (service)"
                ERROR_MAX_CAMERAS_IN_USE -> "Maximum cameras in use"
                else -> "Unknown"
            }
            Log.e(TAG, "Error when trying to connect camera $errorMsg")
        }
    }

তৃতীয় যুক্তিটি এই কাজটি কোথায় ঘটবে তা নিয়ে আলোচনা করে। যেহেতু আমরা মূল থ্রেডটি দখল করতে চাই না, তাই এই কাজটি পটভূমিতে করা ভাল।

এজন্য আমাদের এটিতে একজন হ্যান্ডলারকে পাস করতে হবে। এই হ্যান্ডলার ইনস্ট্যান্সকে আমাদের পছন্দের একটি থ্রেড দিয়ে ইনস্ট্যান্ট করা বুদ্ধিমানের কাজ হবে যাতে আমরা এটিতে কাজ অর্পণ করতে পারি৷

private lateinit var backgroundHandlerThread: HandlerThread
private lateinit var backgroundHandler: Handler

 private fun startBackgroundThread() {
    backgroundHandlerThread = HandlerThread("CameraVideoThread")
    backgroundHandlerThread.start()
    backgroundHandler = Handler(
        backgroundHandlerThread.looper)
}

private fun stopBackgroundThread() {
    backgroundHandlerThread.quitSafely()
    backgroundHandlerThread.join()
}

আমরা যা করেছি তার সাথে আমরা এখন openCamera:

কল করতে পারি
cameraManager.openCamera(cameraId, cameraStateCallback,backgroundHandler)

তারপর ওপেনড -এ কলব্যাক, আমরা টেক্সচারভিউ-এর মাধ্যমে ব্যবহারকারীর কাছে ক্যামেরা ফিড কীভাবে উপস্থাপন করতে পারি তার যুক্তির সাথে মোকাবিলা শুরু করতে পারি।

অ্যান্ড্রয়েড ক্যামেরা 2 - ফটো এবং ভিডিও তোলার জন্য ক্যামেরা 2 এপিআই কীভাবে ব্যবহার করবেন
আনস্প্ল্যাশে মার্কাস স্পিসকের ছবি

কিভাবে ফিডের একটি পূর্বরূপ দেখাবেন

আমরা ফিড দেখানোর জন্য আমাদের ক্যামেরা (ক্যামেরা ডিভাইস) এবং আমাদের টেক্সচার ভিউ পেয়েছি। কিন্তু আমাদের তাদের একে অপরের সাথে সংযোগ করতে হবে যাতে আমরা ফিডের একটি পূর্বরূপ দেখাতে পারি।

এটি করার জন্য, আমরা TextureView এর SurfaceTexture সম্পত্তি ব্যবহার করব এবং আমরা একটি CaptureRequest তৈরি করব৷

val surfaceTexture : SurfaceTexture? = textureView.surfaceTexture // 1

val cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId) //2
val previewSize = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP)!!
  .getOutputSizes(ImageFormat.JPEG).maxByOrNull { it.height * it.width }!!

surfaceTexture?.setDefaultBufferSize(previewSize.width, previewSize.height) //3

val previewSurface: Surface = Surface(surfaceTexture)

captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW) //4
captureRequestBuilder.addTarget(previewSurface) //5

cameraDevice.createCaptureSession(listOf(previewSurface, imageReader.surface), captureStateCallback, null) //6
প্রিভিউ তৈরি করা হচ্ছে

উপরের কোডে, প্রথমে আমরা আমাদের TextureView থেকে সারফেসটেক্সচার পাই। তারপরে আমরা সমস্ত আউটপুট আকারের তালিকা পেতে ক্যামেরার বৈশিষ্ট্য অবজেক্ট ব্যবহার করি। কাঙ্খিত আকার পেতে, আমরা এটিকে সারফেসটেক্সচারের জন্য সেট করি।

এরপরে, আমরা একটি captureRequest তৈরি করি যেখানে আমরা TEMPLATE_PREVIEW এ পাস করি . আমরা ক্যাপচার রিকোয়েস্টে আমাদের ইনপুট সারফেস যোগ করি।

অবশেষে, আমরা আমাদের ইনপুট এবং আউটপুট সারফেস, ক্যাপচার স্টেটকলব্যাক সহ একটি ক্যাপচার সেশন শুরু করি এবং হ্যান্ডলারের জন্য নাল পাস করি

তাই এই captureStateCallback কি? আপনি যদি এই নিবন্ধের শুরু থেকে চিত্রটি মনে রাখেন তবে এটি ক্যামেরা ক্যাপচার সেশনের অংশ যা আমরা শুরু করছি। এই বস্তুটি নিম্নলিখিত কলব্যাকগুলির সাথে ক্যাপচার রিকোয়েস্টের অগ্রগতি ট্র্যাক করে:

  • কনফিগার করা হয়েছে
  • onConfigureFailed
private val captureStateCallback = object : CameraCaptureSession.StateCallback() {
        override fun onConfigureFailed(session: CameraCaptureSession) {
            
        }
        override fun onConfigured(session: CameraCaptureSession) {
         
        }
}

যখন ক্যামেরা ক্যাপচার সেশন সফলভাবে কনফিগার করা হয়েছে, আমরা একটি বারবার প্রিভিউ দেখাতে অনুমতি দেওয়ার জন্য সেশনের জন্য একটি পুনরাবৃত্তি অনুরোধ সেট করেছি।

এটি করার জন্য, আমরা কলব্যাকে যে সেশন অবজেক্টটি পাই তা ব্যবহার করি:

 session.setRepeatingRequest(captureRequestBuilder.build(), null, backgroundHandler)

আপনি আমাদের captureRequestBuilder অবজেক্ট চিনতে পারবেন যা আমরা এই পদ্ধতির জন্য প্রথম আর্গুমেন্ট হিসাবে আগে তৈরি করেছি। আমরা বিল্ড পদ্ধতি প্রণয়ন করি যাতে পাস করা চূড়ান্ত প্যারামিটারটি একটি CaptureRequest হয়।

দ্বিতীয় যুক্তিটি হল একটি CameraCaptureSession.captureCallback শ্রোতা, কিন্তু যেহেতু আমরা ক্যাপচার করা ছবিগুলির সাথে কিছু করতে চাই না (যেহেতু এটি একটি প্রিভিউ), আমরা শূন্য করে দিই৷

তৃতীয় যুক্তিটি হ্যান্ডলার, এবং এখানে আমরা আমাদের নিজস্ব ব্যাকগ্রাউন্ডহ্যান্ডলার ব্যবহার করি। এই কারণেই আমরা পূর্ববর্তী বিভাগে শূন্য পাস করেছি, যেহেতু পুনরাবৃত্তি অনুরোধটি ব্যাকগ্রাউন্ড থ্রেডে চলবে৷

অ্যান্ড্রয়েড ক্যামেরা 2 - ফটো এবং ভিডিও তোলার জন্য ক্যামেরা 2 এপিআই কীভাবে ব্যবহার করবেন
আনস্প্ল্যাশে ডিকি জিয়াং-এর ছবি

কিভাবে একটি ছবি তুলবেন

ক্যামেরার একটি লাইভ প্রিভিউ থাকা দুর্দান্ত, তবে বেশিরভাগ ব্যবহারকারী সম্ভবত এটির সাথে কিছু করতে চাইবেন। ছবি তোলার জন্য আমরা যে যুক্তিগুলি লিখব তার কিছু যুক্তি আমরা আগের বিভাগে যা করেছি তার অনুরূপ হবে৷

  1. আমরা একটি captureRequest তৈরি করব
  2. তোলা ছবি সংগ্রহ করতে আমরা একটি ImageReader এবং এর শ্রোতা ব্যবহার করব
  3. আমাদের ক্যামেরা ক্যাপচার সেশন ব্যবহার করে, আমরা ক্যাপচার পদ্ধতি চালু করব
val orientations : SparseIntArray = SparseIntArray(4).apply {
    append(Surface.ROTATION_0, 0)
    append(Surface.ROTATION_90, 90)
    append(Surface.ROTATION_180, 180)
    append(Surface.ROTATION_270, 270)
}

val captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE)
captureRequestBuilder.addTarget(imageReader.surface)

val rotation = windowManager.defaultDisplay.rotation
captureRequestBuilder.set(CaptureRequest.JPEG_ORIENTATION, orientations.get(rotation))
cameraCaptureSession.capture(captureRequestBuilder.build(), captureCallback, null)
এবার আমরা TEMPLATE_STILL_CAPTURE দিয়ে একটি ক্যাপচার অনুরোধ তৈরি করছি

কিন্তু এই ImageReader কি? ভাল, একটি ImageReader একটি পৃষ্ঠের উপর রেন্ডার করা হয় যে ইমেজ ডেটা অ্যাক্সেস প্রদান করে. আমাদের ক্ষেত্রে, এটি TextureView এর পৃষ্ঠ।

আপনি যদি পূর্ববর্তী বিভাগের কোড স্নিপেটটি দেখেন, আপনি লক্ষ্য করবেন আমরা ইতিমধ্যে সেখানে একটি ImageReader সংজ্ঞায়িত করেছি৷

val cameraManager: CameraManager = getSystemService(Context.CAMERA_SERVICE) as CameraManager
val cameraIds: Array<String> = cameraManager.cameraIdList
var cameraId: String = ""
for (id in cameraIds) {
    val cameraCharacteristics = cameraManager.getCameraCharacteristics(id)
    //If we want to choose the rear facing camera instead of the front facing one
    if (cameraCharacteristics.get(CameraCharacteristics.LENS_FACING) == CameraCharacteristics.LENS_FACING_FRONT) 
      continue
    }
    
    val previewSize = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP)!!.getOutputSizes(ImageFormat.JPEG).maxByOrNull { it.height * it.width }!!
    val imageReader = ImageReader.newInstance(previewSize.width, previewSize.height, ImageFormat.JPEG, 1)
    imageReader.setOnImageAvailableListener(onImageAvailableListener, backgroundHandler)
    cameraId = id
}
সূচনা লাইন 12 – 14

আপনি উপরে দেখতে পাচ্ছেন, আমরা একটি প্রস্থ এবং উচ্চতা অতিক্রম করে একটি ইমেজরিডারকে ইনস্ট্যান্টিয়েট করি, যে ইমেজ ফরম্যাটে আমরা চাই যে আমাদের ইমেজটি থাকুক এবং এটি ক্যাপচার করতে পারে এমন ছবির সংখ্যা।

ইমেজরিডার ক্লাসের একটি বৈশিষ্ট্য হল একটি শ্রোতা যাকে বলা হয় onImageAvailableListener। একবার একটি ফটো তোলা হলে এই শ্রোতা ট্রিগার হয়ে যাবে (যেহেতু আমরা আমাদের ক্যাপচার অনুরোধের আউটপুট উত্স হিসাবে এটির পৃষ্ঠে পাস করেছি)।

val onImageAvailableListener = object: ImageReader.OnImageAvailableListener{
        override fun onImageAvailable(reader: ImageReader) {
            val image: Image = reader.acquireLatestImage()
        }
    }

⚠️ ছবিটি প্রক্রিয়াকরণের পরে বন্ধ করতে ভুলবেন না অন্যথায় আপনি অন্য ছবি তুলতে পারবেন না৷

অ্যান্ড্রয়েড ক্যামেরা 2 - ফটো এবং ভিডিও তোলার জন্য ক্যামেরা 2 এপিআই কীভাবে ব্যবহার করবেন
আনস্প্ল্যাশে জ্যাকব ওয়েন্সের ছবি

কিভাবে একটি ভিডিও রেকর্ড করবেন

একটি ভিডিও রেকর্ড করার জন্য, আমাদের মিডিয়া রেকর্ডার নামে একটি নতুন বস্তুর সাথে যোগাযোগ করতে হবে। মিডিয়া রেকর্ডার অবজেক্টটি অডিও এবং ভিডিও রেকর্ড করার দায়িত্বে রয়েছে এবং আমরা এটি ব্যবহার করব।

আমরা কিছু করার আগে, আমাদের মিডিয়া রেকর্ডার সেটআপ করতে হবে। মোকাবেলা করার জন্য বিভিন্ন কনফিগারেশন রয়েছে এবং সেগুলি অবশ্যই সঠিক ক্রমে হতে হবে অন্যথায় ব্যতিক্রমগুলি নিক্ষেপ করা হবে .

নিচে কনফিগারেশনের একটি নির্বাচনের উদাহরণ দেওয়া হল যা আমাদের ভিডিও ক্যাপচার করতে দেয় (অডিও ছাড়া)।

fun setupMediaRecorder(width: Int, height: Int) {
  val mediaRecorder: MediaRecorder = MediaRecorder()
  mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE)
  mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)
  mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264)
  mediaRecorder.setVideoSize(videoSize.width, videoSize.height)
  mediaRecorder.setVideoFrameRate(30)
  mediaRecorder.setOutputFile(PATH_TO_FILE)
  mediaRecorder.setVideoEncodingBitRate(10_000_000)
  mediaRecorder.prepare()
}
সেটারের ক্রম গুরুত্বপূর্ণ

setOutputFile -এ মনোযোগ দিন পদ্ধতি হিসাবে এটি ফাইলের একটি পথ আশা করে যা আমাদের ভিডিও সংরক্ষণ করবে। এই সমস্ত কনফিগারেশন সেট করার শেষে আমাদের প্রস্তুত কল করতে হবে।

মনে রাখবেন যে mediaRecorder-এরও একটি স্টার্ট মেথড আছে এবং এটিকে কল করার আগে আমাদের অবশ্যই প্রস্তুত কল করতে হবে।

আমাদের mediaRecoder সেট আপ করার পরে, আমাদের একটি ক্যাপচার অনুরোধ এবং একটি ক্যাপচার সেশন তৈরি করতে হবে৷

fun startRecording() {
        val surfaceTexture : SurfaceTexture? = textureView.surfaceTexture
        surfaceTexture?.setDefaultBufferSize(previewSize.width, previewSize.height)
        val previewSurface: Surface = Surface(surfaceTexture)
        val recordingSurface = mediaRecorder.surface
        captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD)
        captureRequestBuilder.addTarget(previewSurface)
        captureRequestBuilder.addTarget(recordingSurface)

        cameraDevice.createCaptureSession(listOf(previewSurface, recordingSurface), captureStateVideoCallback, backgroundHandler)
    }

প্রিভিউ সেট আপ করা বা ছবি তোলার মতোই, আমাদের ইনপুট এবং আউটপুট পৃষ্ঠগুলিকে সংজ্ঞায়িত করতে হবে।

এখানে আমরা TextureView এর সারফেস টেক্সচার থেকে একটি সারফেস অবজেক্ট তৈরি করছি এবং মিডিয়া রেকর্ডার থেকে সারফেস নিচ্ছি। আমরা TEMPLATE_RECORD এ পাস করছি একটি ক্যাপচার অনুরোধ তৈরি করার সময় মান।

আমাদের captureStateVideoCallback একই ধরনের আমরা স্থির ছবির জন্য ব্যবহার করেছি, কিন্তু অন-কনফিগারড কলব্যাকের ভিতরে আমরা মিডিয়া রেকর্ডারের স্টার্ট মেথড বলে থাকি।

val captureStateVideoCallback = object : CameraCaptureSession.StateCallback() {
      override fun onConfigureFailed(session: CameraCaptureSession) {
         
      }
      
      override fun onConfigured(session: CameraCaptureSession) {
          session.setRepeatingRequest(captureRequestBuilder.build(), null, backgroundHandler)
          mediaRecorder.start()
      }
  }
এখানে আমরা একটি পুনরাবৃত্তির অনুরোধও সেট করছি যেহেতু আমরা একটি ক্রমাগত ভিডিও ক্যাপচার করতে চাই

এখন আমরা একটি ভিডিও রেকর্ড করছি, কিন্তু কিভাবে আমরা রেকর্ডিং বন্ধ করব? এর জন্য, আমরা mediaRecorder অবজেক্টে স্টপ এবং রিসেট পদ্ধতি ব্যবহার করব:

mediaRecorder.stop()
mediaRecorder.reset()

উপসংহার

যে প্রক্রিয়া অনেক ছিল. তাই যদি আপনি এটি এখানে তৈরি করেন, অভিনন্দন! এটির আশেপাশে কোন উপায় নেই - শুধুমাত্র কোড দিয়ে আপনার হাত নোংরা করে আপনি বুঝতে শুরু করবেন কিভাবে সবকিছু একসাথে সংযুক্ত হয়।

নীচের এই নিবন্ধে বৈশিষ্ট্যযুক্ত সমস্ত কোড দেখার জন্য আপনি আরও বেশি উৎসাহিত হয়েছেন :

মিডিয়াম আর্টিকেলস/ক্যামরিয়া2এপিআই এট মাস্টার · টোমারপ্যাসিফিক/মাঝারি নিবন্ধ একটি সংগ্রহস্থল যা আমার লেখা বিভিন্ন মাঝারি নিবন্ধের সাথে সম্পর্কিত কোড ধারণ করে - মিডিয়ামআর্টিকেলস/ক্যামরিয়া2এপিআই মাস্টার · টোমারপ্যাসিফিক/মাঝারি নিবন্ধ অ্যান্ড্রয়েড ক্যামেরা 2 - ফটো এবং ভিডিও তোলার জন্য ক্যামেরা 2 এপিআই কীভাবে ব্যবহার করবেন TomerPacificGitHub অ্যান্ড্রয়েড ক্যামেরা 2 - ফটো এবং ভিডিও তোলার জন্য ক্যামেরা 2 এপিআই কীভাবে ব্যবহার করবেন

মনে রাখবেন যে Camera2 API এর ক্ষেত্রে এটি আইসবার্গের টিপ মাত্র। স্লো মোশন ভিডিও ক্যাপচার করা, সামনের এবং পিছনের ক্যামেরার মধ্যে স্যুইচ করা, ফোকাস নিয়ন্ত্রণ করা এবং আরও অনেক কিছু আপনি করতে পারেন।


  1. কীভাবে এবং কেন অ্যান্ড্রয়েড ভিজিবিলিটি লিসেনার ব্যবহার করবেন

  2. আইওএস এবং অ্যান্ড্রয়েডে টিমে শিফটে টাইম ক্লক কীভাবে ব্যবহার করবেন

  3. আইফোনে ফটো এবং ভিডিওগুলি কীভাবে লুকাবেন

  4. ফটো লুকানোর জন্য আপনার ডিজিটাল ভল্টে গোপন ক্যামেরাটি কীভাবে ব্যবহার করবেন