How-tos

ক্যামেরাএক্স ১.৫ দিয়ে হাই-স্পিড ক্যাপচার এবং স্লো-মোশন ভিডিও

6-min read
Leo Huang
Software Engineer

দ্রুত চলমান দৃশ্য স্পষ্টভাবে ধারণ করা আধুনিক ক্যামেরা অ্যাপগুলোর একটি প্রধান বৈশিষ্ট্য। এটি হাই-স্পিড ক্যাপচারের মাধ্যমে করা হয়—যা হলো প্রতি সেকেন্ডে ১২০ বা ২৪০ ফ্রেমের মতো হারে ফ্রেম সংগ্রহ করার প্রক্রিয়া। এই উচ্চ মানের ক্যাপচার দুটি ভিন্ন উদ্দেশ্যে ব্যবহার করা যেতে পারে: বিস্তারিত, ফ্রেম-বাই-ফ্রেম বিশ্লেষণের জন্য একটি হাই-ফ্রেম-রেট ভিডিও তৈরি করা, অথবা একটি স্লো-মোশন ভিডিও তৈরি করা যেখানে পর্দায় দৃশ্যটি নাটকীয়ভাবে উন্মোচিত হয়।

পূর্বে, Camera2 API ব্যবহার করে এই ফিচারগুলো প্রয়োগ করা একটি বেশ শ্রমসাধ্য প্রক্রিয়া ছিল। এখন, CameraX 1.5-এর নতুন হাই-স্পিড API-এর মাধ্যমে পুরো প্রক্রিয়াটি সহজ হয়ে গেছে, যা আপনাকে সত্যিকারের হাই-ফ্রেম-রেট ভিডিও অথবা প্লে করার জন্য প্রস্তুত স্লো-মোশন ক্লিপ তৈরি করার সুবিধা দেয়। এই পোস্টে দেখানো হবে কীভাবে উভয় ক্ষেত্রেই দক্ষতা অর্জন করা যায়। যারা CameraX-এ নতুন, তারাCameraX Overview দেখে এর খুঁটিনাটি জেনে নিতে পারেন।


The Principle Behind Slow-Motion

স্লো-মোশনের মূল নীতি হলো, ভিডিওকে প্লেব্যাকের চেয়ে অনেক বেশি ফ্রেম রেটে ধারণ করা। উদাহরণস্বরূপ, যদি আপনি এক সেকেন্ডের কোনো ঘটনা প্রতি সেকেন্ডে ১২০ ফ্রেমে (fps) রেকর্ড করেন এবং তারপর সেই রেকর্ডিংটি সাধারণ ৩০ fps-এ প্লেব্যাক করেন, তাহলে ভিডিওটি চলতে চার সেকেন্ড সময় নেবে। সময়ের এই "প্রসারণই" নাটকীয় স্লো-মোশন প্রভাব তৈরি করে, যার ফলে আপনি এমন সব খুঁটিনাটি বিষয় দেখতে পান যা খালি চোখে দেখা সম্ভব নয়।

চূড়ান্ত আউটপুট ভিডিওটি মসৃণ এবং সাবলীল হয় তা নিশ্চিত করার জন্য, এটিকে সাধারণত ন্যূনতম ৩০ এফপিএস-এ রেন্ডার করা উচিত। এর মানে হলো, একটি ৪x স্লো-মোশন ভিডিও তৈরি করতে হলে, মূল ক্যাপচার ফ্রেম রেট অবশ্যই কমপক্ষে ১২০ এফপিএস হতে হবে (১২০ ক্যাপচার এফপিএস ÷ ৪ = ৩০ প্লেব্যাক এফপিএস)।

একবার উচ্চ-ফ্রেম-রেটের ফুটেজ ধারণ করা হয়ে গেলে, কাঙ্ক্ষিত ফলাফল অর্জনের দুটি প্রধান উপায় রয়েছে:

  • প্লেয়ার-নিয়ন্ত্রিত স্লো-মোশন (হাই-ফ্রেম-রেট ভিডিও): উচ্চ-গতির রেকর্ডিং (যেমন, ১২০ এফপিএস) সরাসরি একটি হাই-ফ্রেম-রেট ভিডিও ফাইল হিসেবে সংরক্ষিত হয়। এরপর প্লেব্যাকের গতি কমিয়ে আনার দায়িত্ব ভিডিও প্লেয়ারের। এটি ব্যবহারকারীকে সাধারণ এবং স্লো-মোশন প্লেব্যাকের মধ্যে পরিবর্তন করার সুবিধা দেয়।
  • প্লে করার জন্য প্রস্তুত স্লো-মোশন (পুনরায় এনকোড করা ভিডিও): হাই-স্পিড ভিডিও স্ট্রিমটিকে প্রসেস করে একটি স্ট্যান্ডার্ড ফ্রেম রেটের (যেমন, ৩০ এফপিএস) ফাইলে পুনরায় এনকোড করা হয়। ফ্রেম টাইমস্ট্যাম্পগুলো অ্যাডজাস্ট করার মাধ্যমে স্লো-মোশন এফেক্টটি এতে স্থায়ীভাবে যুক্ত করা হয়। এর ফলে তৈরি হওয়া ভিডিওটি কোনো বিশেষ ব্যবস্থা ছাড়াই যেকোনো স্ট্যান্ডার্ড ভিডিও প্লেয়ারে স্লো-মোশনে চলবে। যদিও ভিডিওটি ডিফল্টভাবে স্লো-মোশনে চলে, তবুও ভিডিও প্লেয়ারগুলোতে প্লেব্যাক স্পিড কন্ট্রোলের সুবিধা থাকে, যার মাধ্যমে ব্যবহারকারী গতি বাড়িয়ে ভিডিওটি তার আসল গতিতে দেখতে পারেন।

CameraX API এই প্রক্রিয়াটিকে সহজ করে তোলে, কারণ এটি আপনাকে আপনার পছন্দের অ্যাপ্রোচটি বেছে নেওয়ার জন্য একটি সমন্বিত উপায় দেয়, যেমনটি আপনি নিচে দেখতে পাবেন।


The New High-Speed Video API

নতুন CameraX সলিউশনটি দুটি প্রধান উপাদানের উপর নির্মিত:

  • Recorder#getHighSpeedVideoCapabilities(CameraInfo) : এই মেথডটির মাধ্যমে আপনি যাচাই করতে পারবেন যে ক্যামেরাটি হাই-স্পিডে রেকর্ড করতে পারে কি না এবং যদি পারে, তবে কোন কোন রেজোলিউশন ( Quality অবজেক্ট) এটি সাপোর্ট করে।
  • HighSpeedVideoSessionConfig : এটি একটি বিশেষ কনফিগারেশন অবজেক্ট যা আপনার VideoCapture এবং Preview ব্যবহারের ক্ষেত্রগুলোকে একত্রিত করে এবং CameraX-কে একটি সমন্বিত হাই-স্পিড ক্যামেরা সেশন তৈরি করতে নির্দেশ দেয়। উল্লেখ্য যে, VideoCapture স্ট্রিমটি কনফিগার করা উচ্চ ফ্রেম রেটে কাজ করলেও, স্ক্রিনে মসৃণ প্রদর্শন নিশ্চিত করার জন্য ক্যামেরা সিস্টেম দ্বারা Preview স্ট্রিমটি সাধারণত কমপক্ষে 30 FPS-এর একটি স্ট্যান্ডার্ড রেটে সীমাবদ্ধ থাকবে।

শুরু করা

শুরু করার আগে, নিশ্চিত করুন যে আপনি আপনার অ্যাপের build.gradle.kts ফাইলে প্রয়োজনীয় CameraX ডিপেন্ডেন্সিগুলো যোগ করেছেন। আপনার মূল CameraX লাইব্রেরিগুলোর সাথে camera-video আর্টিফ্যাক্টটিরও প্রয়োজন হবে।

// build.gradle.kts (Module: app)

dependencies {

    val camerax_version = "1.5.1"


    implementation("androidx.camera:camera-core:$camerax_version")

    implementation("androidx.camera:camera-camera2:$camerax_version")

    implementation("androidx.camera:camera-lifecycle:$camerax_version")

    implementation("androidx.camera:camera-video:$camerax_version")

    implementation("androidx.camera:camera-view:$camerax_version")

}

A Note on Experimental APIs

এটা মনে রাখা গুরুত্বপূর্ণ যে হাই-স্পিড রেকর্ডিং এপিআইগুলো বর্তমানে পরীক্ষামূলক পর্যায়ে রয়েছে। এর মানে হলো, ভবিষ্যতের রিলিজগুলোতে এগুলোতে পরিবর্তন আসতে পারে। এগুলো ব্যবহার করার জন্য, আপনাকে অবশ্যই আপনার কোডে নিম্নলিখিত অ্যানোটেশনটি যোগ করে সম্মতি জানাতে হবে:

@kotlin.OptIn(ExperimentalSessionConfig::class, ExperimentalHighSpeedVideo::class)

বাস্তবায়ন

উভয় ফলাফলের বাস্তবায়ন একই সেটআপ ধাপ দিয়ে শুরু হয়। হাই-ফ্রেম-রেট ভিডিও বা স্লো-মোশন ভিডিও তৈরির সিদ্ধান্তটি একটিমাত্র সেটিংয়ের ওপর নির্ভর করে।

1. Set up High-Speed Capture

প্রথমত, আপনার লক্ষ্য যাই হোক না কেন, আপনাকে ProcessCameraProvider সংগ্রহ করতে হবে, ডিভাইসের সক্ষমতা যাচাই করতে হবে এবং আপনার ব্যবহারের ক্ষেত্রগুলো (use cases) তৈরি করতে হবে।

নিম্নলিখিত কোড ব্লকটি একটি সাসপেন্ড ফাংশনের মধ্যে সম্পূর্ণ সেটআপ প্রবাহ দেখায়। আপনি এই ফাংশনটি একটি কো-রুটিন স্কোপ থেকে কল করতে পারেন, যেমন lifecycleScope.launch

// Add the OptIn annotation at the top of your function or class

@kotlin.OptIn(ExperimentalSessionConfig::class, ExperimentalHighSpeedVideo::class)

private suspend fun setupCamera() {

    // Asynchronously get the CameraProvider

    val cameraProvider = ProcessCameraProvider.awaitInstance(this)



    // -- CHECK CAPABILITIES --

    val cameraInfo = cameraProvider.getCameraInfo(CameraSelector.DEFAULT_BACK_CAMERA)

    val videoCapabilities = Recorder.getHighSpeedVideoCapabilities(cameraInfo)

    if (videoCapabilities == null) {

        // This camera device does not support high-speed video.

        return

    }




    // -- CREATE USE CASES --

    val preview = Preview.Builder().build()    


    // You can create a Recorder with default settings.

    // CameraX will automatically select a suitable quality.

    val recorder = Recorder.Builder().build()


    // Alternatively, to use a specific resolution, you can configure the
    // Recorder with a QualitySelector. This is useful if your app has
    // specific resolution requirements or you want to offer user
    // preferences. 

    // To use a specific quality, you can uncomment the following lines.

    // Get the list of qualities supported for high-speed video. 

    // val supportedQualities = videoCapabilities.getSupportedQualities(DynamicRange.SDR)

    // Build the Recorder using the quality from the supported list.

    // val recorderWithQuality = Recorder.Builder()

    //     .setQualitySelector(QualitySelector.from(supportedQualities.first()))

    //     .build()



    // Create the VideoCapture use case, using either recorder or recorderWithQuality

    val videoCapture = VideoCapture.withOutput(recorder)

    // Now you are ready to configure the session for your desired output...

}

2. Choosing Your Output

এখন, আপনি কী ধরনের ভিডিও তৈরি করতে চান তা ঠিক করুন। এই কোডটি উপরে দেখানো setupCamera() suspend ফাংশনের ভিতরে রান করবে।

Option A: Create a High-Frame-Rate Video

চূড়ান্ত ফাইলটিতে উচ্চ ফ্রেম রেট (যেমন, একটি ১২০এফপিএস ভিডিও) চাইলে এই অপশনটি বেছে নিন।

// Create a builder for the high-speed session

val sessionConfigBuilder = HighSpeedVideoSessionConfig.Builder(videoCapture)

    .setPreview(preview)


// Query and apply a supported frame rate. Common supported frame rates include 120 and 240 fps.

val supportedFrameRateRanges =

    cameraInfo.getSupportedFrameRateRanges(sessionConfigBuilder.build())


sessionConfigBuilder.setFrameRateRange(supportedFrameRateRanges.first())

বিকল্প B: প্লে করার জন্য প্রস্তুত একটি স্লো-মোশন ভিডিও তৈরি করুন

যেকোনো সাধারণ ভিডিও প্লেয়ারে ভিডিওটি স্বয়ংক্রিয়ভাবে স্লো-মোশনে চলতে চাইলে এই অপশনটি বেছে নিন।

// Create a builder for the high-speed session

val sessionConfigBuilder = HighSpeedVideoSessionConfig.Builder(videoCapture)

    .setPreview(preview)



// This is the key: enable automatic slow-motion!

sessionConfigBuilder.setSlowMotionEnabled(true)



// Query and apply a supported frame rate. Common supported frame rates include 120, 240, and 480 fps.

val supportedFrameRateRanges =

   cameraInfo.getSupportedFrameRateRanges(sessionConfigBuilder.build())

sessionConfigBuilder.setFrameRateRange(supportedFrameRateRanges.first())

এই একটিমাত্র ফ্ল্যাগই হলো প্লে করার জন্য প্রস্তুত একটি স্লো-মোশন ভিডিও তৈরি করার মূল চাবিকাঠি। যখন setSlowMotionEnabled মান true হয়, CameraX হাই-স্পিড স্ট্রিমটিকে প্রসেস করে এবং এটিকে একটি স্ট্যান্ডার্ড ৩০ এফপিএস ভিডিও ফাইল হিসেবে সংরক্ষণ করে। ক্যাপচার ফ্রেম রেট এবং এই স্ট্যান্ডার্ড প্লেব্যাক রেটের অনুপাতের মাধ্যমে স্লো-মোশনের গতি নির্ধারিত হয়।

উদাহরণস্বরূপ:

  • ১২০ এফপিএস -এ রেকর্ড করলে যে ভিডিওটি তৈরি হবে, তা ১/৪ গুণ গতিতে প্লেব্যাক হবে (১২০ ÷ ৩০ = ৪)।
  • ২৪০ এফপিএস -এ রেকর্ড করলে যে ভিডিওটি তৈরি হবে, তা ১/৮ গুণ গতিতে প্লেব্যাক হবে (২৪০ ÷ ৩০ = ৮)।

Putting It All Together: Recording the Video

একবার আপনি আপনার HighSpeedVideoSessionConfig কনফিগার করে লাইফসাইকেলের সাথে যুক্ত করে ফেললে, চূড়ান্ত ধাপটি হলো রেকর্ডিং শুরু করা। আউটপুট অপশন প্রস্তুত করা, রেকর্ডিং শুরু করা এবং ভিডিও ইভেন্টগুলি পরিচালনা করার প্রক্রিয়াটি একটি সাধারণ ভিডিও ক্যাপচারের মতোই।

এই পোস্টে দ্রুতগতির কনফিগারেশনের উপর আলোকপাত করা হয়েছে, তাই আমরা রেকর্ডিং প্রক্রিয়াটি বিস্তারিতভাবে আলোচনা করব না। FileOutputOptions বা MediaStoreOutputOptions অবজেক্ট প্রস্তুত করা থেকে শুরু করে VideoRecordEvent কলব্যাকগুলি পরিচালনা করা পর্যন্ত সবকিছুর একটি বিশদ নির্দেশিকার জন্য, অনুগ্রহ করে VideoCapture ডকুমেন্টেশন দেখুন।

// Bind the session config to the lifecycle

cameraProvider.bindToLifecycle(

    this as LifecycleOwner,

    CameraSelector.DEFAULT_BACK_CAMERA,

    sessionConfigBuilder.build() // Bind the config object from Option A or B

)



// Start the recording using the VideoCapture use case

val recording = videoCapture.output

    .prepareRecording(context, outputOptions) // See docs for creating outputOptions

    .start(ContextCompat.getMainExecutor(context)) { recordEvent ->

        // Handle recording events (e.g., Start, Pause, Finalize)

    }

Google Photos Support for Slow-Motion Videos

আপনি যখন CameraX-এ setSlowMotionEnabled(true) চালু করেন, তখন তৈরি হওয়া ভিডিও ফাইলটি সাধারণ ভিডিও প্লেয়ার এবং গ্যালারি অ্যাপে তাৎক্ষণিকভাবে স্লো-মোশন হিসেবে চেনা ও প্লে করার জন্য ডিজাইন করা হয়। বিশেষ করে Google Photos এই স্লো-মোশন ভিডিওগুলির জন্য উন্নত কার্যকারিতা প্রদান করে, যখন ক্যাপচার ফ্রেম রেট 120, 240, 360, 480 বা 960fps হয়:

  • থাম্বনেইলে স্বতন্ত্র UI শনাক্তকরণ: আপনার গুগল ফটোস লাইব্রেরিতে, স্লো-মোশন ভিডিওগুলোকে নির্দিষ্ট UI উপাদানের মাধ্যমে শনাক্ত করা যায়, যা সেগুলোকে সাধারণ ভিডিও থেকে আলাদা করে।
normal.png
slowmotion.png
Normal video thumbnail Slow-motion video thumbnail
  • প্লেব্যাকের সময় গতি পরিবর্তনযোগ্য অংশ: একটি স্লো-মোশন ভিডিও চালানোর সময়, গুগল ফটোস ভিডিওর কোন অংশ ধীর গতিতে এবং কোন অংশ স্বাভাবিক গতিতে চলবে তা সামঞ্জস্য করার জন্য কন্ট্রোল প্রদান করে, যা ব্যবহারকারীদের সৃজনশীল নিয়ন্ত্রণ দেয়। এরপর সম্পাদিত ভিডিওটি শেয়ার বাটন ব্যবহার করে একটি নতুন ভিডিও ফাইল হিসেবে এক্সপোর্ট করা যায়, যেখানে আপনার নির্ধারণ করা স্লো-মোশন অংশগুলো সংরক্ষিত থাকে।
normal2.png
slowmotion2.png
Normal video playback Slow-motion video
playback with editing
controls

A Note on Device Support

CameraX-এর হাই-স্পিড API, একটি ডিভাইস কোন কোন হাই-স্পিড রেজোলিউশন এবং ফ্রেম রেট সমর্থন করে তা নির্ধারণ করতে অন্তর্নিহিত অ্যান্ড্রয়েড ক্যামকর্ডারপ্রোফাইল সিস্টেমের উপর নির্ভর করে। ক্যামকর্ডারপ্রোফাইলগুলো অ্যান্ড্রয়েড কম্প্যাটিবিলিটি টেস্ট স্যুট (CTS) দ্বারা যাচাই করা হয়, যার অর্থ হলো ডিভাইসটির ঘোষিত ভিডিও রেকর্ডিং ক্ষমতার উপর আপনি আস্থা রাখতে পারেন।

এর মানে হলো, কোনো ডিভাইসের বিল্ট-ইন ক্যামেরা অ্যাপ দিয়ে স্লো-মোশন ভিডিও রেকর্ড করার ক্ষমতা থাকলেই যে CameraX হাই-স্পিড API কাজ করবে, তার কোনো নিশ্চয়তা নেই। এই অসঙ্গতিটি ঘটে কারণ ডিভাইস নির্মাতারা তাদের ডিভাইসের ফার্মওয়্যারে CamcorderProfile এন্ট্রিগুলো পূরণ করার জন্য দায়ী, এবং কখনও কখনও CamcorderProfile.QUALITY_HIGH_SPEED_1080P এবং CamcorderProfile.QUALITY_HIGH_SPEED_720P এর মতো প্রয়োজনীয় হাই-স্পিড প্রোফাইলগুলো অন্তর্ভুক্ত করা হয় না। যখন এই প্রোফাইলগুলো অনুপস্থিত থাকে, তখন Recorder.getHighSpeedVideoCapabilities() null রিটার্ন করবে।

অতএব, সমর্থিত ফিচারগুলো প্রোগ্রাম্যাটিকভাবে পরীক্ষা করার জন্য সর্বদা Recorder.getHighSpeedVideoCapabilities() ব্যবহার করা অপরিহার্য, কারণ বিভিন্ন ডিভাইসে একটি সামঞ্জস্যপূর্ণ অভিজ্ঞতা নিশ্চিত করার জন্য এটিই সবচেয়ে নির্ভরযোগ্য উপায়। যদি আপনি এমন কোনো ডিভাইসে HighSpeedVideoSessionConfig বাইন্ড করার চেষ্টা করেন যেখানে Recorder.getHighSpeedVideoCapabilities() null রিটার্ন করে, তাহলে অপারেশনটি একটি IllegalArgumentException সহ ব্যর্থ হবে। আপনি Google Pixel ডিভাইসগুলোতে এর সমর্থন নিশ্চিত করতে পারেন, কারণ সেগুলোতে ধারাবাহিকভাবে এই হাই-স্পিড প্রোফাইলগুলো অন্তর্ভুক্ত থাকে। এছাড়াও, অন্যান্য নির্মাতাদের বিভিন্ন ডিভাইস, যেমন Motorola Edge 30, OPPO Find N2 Flip, এবং Sony Xperia 1 V, হাই-স্পিড ভিডিও সক্ষমতা সমর্থন করে।


উপসংহার

CameraX হাই-স্পিড ভিডিও এপিআই শক্তিশালী এবং নমনীয় উভয়ই। প্রযুক্তিগত বিশ্লেষণের জন্য আপনার সত্যিকারের হাই-ফ্রেম-রেট ফুটেজ প্রয়োজন হোক বা আপনি আপনার অ্যাপে সিনেম্যাটিক স্লো-মোশন এফেক্ট যোগ করতে চান, HighSpeedVideoSessionConfig একটি সমন্বিত এবং সহজ সমাধান প্রদান করে। setSlowMotionEnabled ফ্ল্যাগের ভূমিকা বোঝার মাধ্যমে, আপনি সহজেই উভয় ব্যবহারের ক্ষেত্রকে সমর্থন করতে পারেন এবং আপনার ব্যবহারকারীদের আরও সৃজনশীল নিয়ন্ত্রণ দিতে পারেন।

    পড়তে থাকুন