چگونه‌ها

فیلمبرداری با سرعت بالا و فیلم‌برداری اسلوموشن با CameraX 1.5

مطالعه ۶ دقیقه‌ای
Leo Huang
مهندس نرم‌افزار

ثبت حرکات سریع با وضوح بالا، یکی از ویژگی‌های کلیدی برنامه‌های دوربین مدرن است. این امر از طریق ضبط با سرعت بالا - فرآیند ثبت فریم‌ها با نرخ‌هایی مانند ۱۲۰ یا ۲۴۰ فریم در ثانیه - حاصل می‌شود. این ضبط با کیفیت بالا می‌تواند برای دو هدف متمایز مورد استفاده قرار گیرد: ایجاد یک ویدیوی با نرخ فریم بالا برای تجزیه و تحلیل دقیق فریم به فریم، یا تولید یک ویدیوی اسلوموشن که در آن حرکات به طور چشمگیری روی صفحه نمایش داده می‌شوند.

پیش از این، پیاده‌سازی این ویژگی‌ها با Camera2 API یک فرآیند عملی‌تر بود. اکنون، با API جدید پرسرعت در CameraX 1.5، کل فرآیند ساده شده است و به شما انعطاف‌پذیری لازم برای ایجاد ویدیوهای با نرخ فریم بالا یا کلیپ‌های اسلوموشن آماده پخش را می‌دهد. این پست به شما نشان می‌دهد که چگونه در هر دو مهارت پیدا کنید. برای کسانی که در CameraX تازه‌کار هستند، می‌توانید بابررسی اجمالی CameraX سرعت عمل بیشتری کسب کنید.


اصل پشت صحنه آهسته

اصل اساسی اسلوموشن، ضبط ویدیو با نرخ فریم بسیار بالاتر از نرخ فریمی است که پخش می‌شود. برای مثال، اگر یک رویداد یک ثانیه‌ای را با سرعت ۱۲۰ فریم در ثانیه (fps) ضبط کنید و سپس آن ضبط را با سرعت استاندارد ۳۰ فریم در ثانیه پخش کنید، پخش ویدیو چهار ثانیه طول می‌کشد. این «کشش» زمان همان چیزی است که جلوه اسلوموشن چشمگیر را ایجاد می‌کند و به شما امکان می‌دهد جزئیاتی را ببینید که برای چشم غیرمسلح خیلی سریع هستند.

برای اطمینان از روان و روان بودن ویدیوی خروجی نهایی، معمولاً باید حداقل با سرعت ۳۰ فریم در ثانیه رندر شود. این بدان معناست که برای ایجاد یک ویدیوی اسلوموشن ۴x، سرعت فریم ضبط اولیه باید حداقل ۱۲۰ فریم در ثانیه باشد (۱۲۰ فریم در ثانیه ضبط ÷ ۴ = ۳۰ فریم در ثانیه پخش).

پس از ضبط فیلم با نرخ فریم بالا، دو راه اصلی برای رسیدن به نتیجه مطلوب وجود دارد:

  • حرکت آهسته (ویدئو با نرخ فریم بالا) که توسط پخش‌کننده مدیریت می‌شود: ضبط با سرعت بالا (مثلاً ۱۲۰ فریم در ثانیه) مستقیماً به عنوان یک فایل ویدئویی با نرخ فریم بالا ذخیره می‌شود. سپس وظیفه پخش‌کننده ویدئو کاهش سرعت پخش است. این به کاربر انعطاف‌پذیری می‌دهد تا بین پخش عادی و آهسته جابجا شود.
  • آماده پخش حرکت آهسته (ویدئوی کدگذاری مجدد شده): جریان ویدئویی پرسرعت پردازش شده و دوباره در فایلی با نرخ فریم استاندارد (مثلاً 30 فریم در ثانیه) کدگذاری می‌شود. جلوه حرکت آهسته با تنظیم مهرهای زمانی فریم "پخت" می‌شود. ویدئوی حاصل بدون دستکاری خاص، در هر پخش‌کننده ویدئوی استاندارد با حرکت آهسته پخش می‌شود. در حالی که ویدئو به طور پیش‌فرض با حرکت آهسته پخش می‌شود، پخش‌کننده‌های ویدئو همچنان می‌توانند کنترل‌های سرعت پخش را ارائه دهند که به کاربر امکان افزایش سرعت و تماشای ویدئو با سرعت اصلی آن را می‌دهد.

رابط برنامه‌نویسی کاربردی CameraX این کار را با ارائه یک روش واحد برای انتخاب رویکرد مورد نظر شما، همانطور که در ادامه خواهید دید، ساده می‌کند.


API جدید ویدیوی پرسرعت

راهکار جدید CameraX بر دو جزء اصلی ساخته شده است:

  • Recorder#getHighSpeedVideoCapabilities(CameraInfo) : این متد به شما امکان می‌دهد بررسی کنید که آیا دوربین می‌تواند با سرعت بالا ضبط کند و اگر چنین است، از چه رزولوشن‌هایی (اشیاء Quality ) پشتیبانی می‌کند.
  • HighSpeedVideoSessionConfig : این یک شیء پیکربندی ویژه است که موارد استفاده VideoCapture و Preview شما را گروه‌بندی می‌کند و به CameraX می‌گوید که یک جلسه دوربین پرسرعت یکپارچه ایجاد کند. توجه داشته باشید که در حالی که جریان VideoCapture با نرخ فریم بالای پیکربندی شده کار می‌کند، جریان Preview معمولاً توسط سیستم دوربین به نرخ استاندارد حداقل 30 FPS محدود می‌شود تا نمایش روان روی صفحه تضمین شود.

شروع به کار

قبل از شروع، مطمئن شوید که وابستگی‌های لازم CameraX را به فایل build.gradle.kts برنامه خود اضافه کرده‌اید. شما به camera-video artifact به همراه کتابخانه‌های اصلی CameraX نیاز خواهید داشت.

  // 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")

}

نکته‌ای در مورد APIهای آزمایشی

لازم به ذکر است که APIهای ضبط پرسرعت در حال حاضر آزمایشی هستند. این بدان معناست که در نسخه‌های آینده ممکن است تغییر کنند. برای استفاده از آنها، باید با اضافه کردن حاشیه‌نویسی زیر به کد خود، موافقت خود را اعلام کنید:

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

پیاده‌سازی

پیاده‌سازی هر دو نتیجه با مراحل راه‌اندازی یکسانی آغاز می‌شود. انتخاب بین ایجاد یک ویدیوی با نرخ فریم بالا یا یک ویدیوی اسلوموشن به یک تنظیم واحد بستگی دارد.

۱. ضبط با سرعت بالا را تنظیم کنید

اول، صرف نظر از هدفتان، باید ProcessCameraProvider را دریافت کنید، قابلیت‌های دستگاه را بررسی کنید و موارد استفاده خود را ایجاد کنید.

بلوک کد زیر جریان کامل راه‌اندازی را در یک تابع suspend نشان می‌دهد. می‌توانید این تابع را از یک محدوده‌ی coroutine، مانند 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...

}

۲. انتخاب خروجی

حالا، شما تصمیم می‌گیرید که چه نوع ویدیویی می‌خواهید ایجاد کنید. این کد درون تابع setupCamera() suspend که در بالا نشان داده شده است، اجرا می‌شود.

گزینه الف: ایجاد یک ویدیوی با نرخ فریم بالا

اگر می‌خواهید فایل نهایی نرخ فریم بالایی داشته باشد (مثلاً یک ویدیوی ۱۲۰ فریم بر ثانیه)، این گزینه را انتخاب کنید.

  // 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())

گزینه ب: یک ویدیوی اسلوموشن آماده پخش بسازید

اگر می‌خواهید ویدیویی به صورت خودکار در هر پخش‌کننده ویدیوی استاندارد با حرکت آهسته پخش شود، این گزینه را انتخاب کنید.

  // 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 استریم پرسرعت را پردازش کرده و آن را به عنوان یک فایل ویدیویی استاندارد 30 فریم در ثانیه ذخیره می‌کند. سرعت اسلوموشن با نسبت نرخ فریم ضبط به این نرخ پخش استاندارد تعیین می‌شود.

برای مثال:

  • ضبط با سرعت ۱۲۰ فریم در ثانیه، ویدیویی تولید می‌کند که با سرعت ۱/۴ برابر پخش می‌شود (۱۲۰ ÷ ۳۰ = ۴).
  • ضبط با سرعت ۲۴۰ فریم در ثانیه ، ویدیویی تولید می‌کند که با سرعت ۱/۸ برابر پخش می‌شود (۲۴۰ ÷ ۳۰ = ۸).

کنار هم قرار دادن همه چیز: ضبط ویدیو

پس از پیکربندی 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)

    }

پشتیبانی گوگل فوتوز از ویدیوهای اسلوموشن

وقتی setSlowMotionEnabled(true) در CameraX فعال می‌کنید، فایل ویدیویی حاصل به گونه‌ای طراحی می‌شود که فوراً قابل تشخیص و پخش به عنوان حرکت آهسته در پخش‌کننده‌های ویدیوی استاندارد و برنامه‌های گالری باشد. به طور خاص، Google Photos عملکرد پیشرفته‌ای را برای این ویدیوهای حرکت آهسته ارائه می‌دهد، زمانی که نرخ فریم ضبط ۱۲۰، ۲۴۰، ۳۶۰، ۴۸۰ یا ۹۶۰ فریم در ثانیه باشد:

  • تشخیص رابط کاربری متمایز در تصویر بندانگشتی: در کتابخانه گوگل فوتوز شما، ویدیوهای اسلوموشن را می‌توان با عناصر رابط کاربری خاصی شناسایی کرد و آنها را از ویدیوهای معمولی متمایز کرد.
عادی.png
  • بخش‌های سرعت قابل تنظیم در حین پخش: هنگام پخش یک ویدیوی اسلوموشن، گوگل فوتوز کنترل‌هایی را برای تنظیم اینکه کدام قسمت‌های ویدیو با سرعت آهسته و کدام قسمت‌ها با سرعت عادی پخش شوند، ارائه می‌دهد و به کاربران کنترل خلاقانه می‌دهد. ویدیوی ویرایش‌شده سپس می‌تواند با استفاده از دکمه اشتراک‌گذاری به عنوان یک فایل ویدیویی جدید صادر شود و بخش‌های اسلوموشن تعریف‌شده توسط شما حفظ شوند.
normal2.png

نکته‌ای در مورد پشتیبانی دستگاه

API پرسرعت CameraX برای تعیین اینکه دستگاه از چه رزولوشن‌ها و نرخ فریم‌های پرسرعتی پشتیبانی می‌کند، به سیستم زیرین CamcorderProfile اندروید متکی است. CamcorderProfileها توسط مجموعه تست سازگاری اندروید (CTS) تأیید می‌شوند، به این معنی که می‌توانید به قابلیت‌های ضبط ویدیوی گزارش‌شده توسط دستگاه اطمینان داشته باشید.

این بدان معناست که توانایی یک دستگاه برای ضبط ویدیوی اسلوموشن با برنامه دوربین داخلی آن، عملکرد API پرسرعت CameraX را تضمین نمی‌کند. این اختلاف به این دلیل رخ می‌دهد که تولیدکنندگان دستگاه مسئول پر کردن ورودی‌های 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 نیز از قابلیت‌های ویدیوی پرسرعت پشتیبانی می‌کنند.


نتیجه‌گیری

API ویدیوی پرسرعت CameraX هم قدرتمند و هم انعطاف‌پذیر است. چه برای تحلیل فنی به فیلم با نرخ فریم بالا نیاز داشته باشید و چه بخواهید جلوه‌های حرکت آهسته سینمایی را به برنامه خود اضافه کنید، HighSpeedVideoSessionConfig یک راه‌حل یکپارچه و ساده ارائه می‌دهد. با درک نقش پرچم setSlowMotionEnabled ، می‌توانید به راحتی از هر دو مورد استفاده پشتیبانی کنید و به کاربران خود کنترل خلاقانه‌تری بدهید.

    نوشته شده توسط:

    ادامه مطلب