اخبار محصول

معرفی CameraX 1.5: ضبط ویدیو قدرتمند و ضبط تصویر در سطح حرفه‌ای

زمان خواندن: ۷ دقیقه
مشاهده نمایه Scott Nien
Scott Nien مهندس نرم‌افزار

تیم CameraX با خوشحالی انتشار نسخه ۱.۵ را اعلام می‌کند! این به‌روزرسانی جدید بر ارائه قابلیت‌های حرفه‌ای به شما تمرکز دارد و درعین‌حال پیکربندی جلسه دوربین را آسان‌تر از همیشه می‌کند.

برای ضبط ویدیو، کاربران اکنون می‌توانند به‌راحتی ویدیوهای صحنه آهسته یا با نرخ فریم بالا ضبط کنند. مهم‌تر اینکه Feature Group API جدید به شما امکان می‌دهد ترکیب‌های پیچیده‌ای مثل HDR‏ ۱۰ بیتی و ۶۰ فریم در ثانیه را با اطمینان فعال کنید و از نتایج یکسان در دستگاه‌های پشتیبانی‌شده مطمئن شوید.

در زمینه ضبط تصویر، با پشتیبانی از ضبط فایل‌های DNG (RAW) پردازش‌نشده و فشرده‌نشده، به حداکثر انعطاف‌پذیری دست می‌یابید. به‌علاوه، اکنون می‌توانید حتی هنگام استفاده از «افزونه‌های دوربین» قدرتمند، از خروجی Ultra HDR بهره ببرید.

پایه و اساس این ویژگی‌ها SessionConfig API جدید است که راه‌اندازی و پیکربندی مجدد دوربین را ساده می‌کند. اکنون بیایید به جزئیات این ویژگی‌های جدید و هیجان‌انگیز بپردازیم.

ضبط ویدیویی قدرتمند: سرعت بالا و ترکیب ویژگی‌ها

CameraX 1.5 قابلیت‌های ویدیویی خود را به‌طور قابل‌توجهی گسترش می‌دهد و تجربه‌های ضبط خلاقانه‌تر و قوی‌تری را ممکن می‌سازد.

ویدیو با نرخ فریم بالا و حرکت آهسته

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

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

۱. بررسی پشتیبانی از سرعت بالا: از روش جدید Recorder.getHighSpeedVideoCapabilities() برای پرس‌وجو درباره اینکه آیا دستگاه از این ویژگی پشتیبانی می‌کند یا نه استفاده کنید.

val cameraInfo = cameraProvider.getCameraInfo(cameraSelector)

val highSpeedCapabilities = Recorder.getHighSpeedVideoCapabilities(cameraInfo)

if (highSpeedCapabilities == null) {
    // This camera device does not support high-speed video.
    return
}

۲. پیکربندی و اتصال مورد استفاده: از videoCapabilities برگردانده‌شده (که حاوی اطلاعات کیفیت ویدیو پشتیبانی‌شده است) برای ساختن HighSpeedVideoSessionConfig استفاده کنید. سپس باید ازطریق cameraInfo.getSupportedFrameRateRanges() محدوده نرخ فریم پشتیبانی‌شده را جستجو کنید و محدوده موردنظر را تنظیم کنید. برای ضبط ویدیوهای حرکت آهسته، setSlowMotionEnabled(true) را فراخوانی کنید، درغیراین‌صورت ویدیوهایی با نرخ فریم بالا ضبط خواهد شد. مرحله آخر این است که از Recorder.prepareRecording().start() معمولی برای شروع ضبط ویدیو استفاده کنید.

val preview = Preview.Builder().build()
val quality = highSpeedCapabilities
        .getSupportedQualities(DynamicRange.SDR).first()

val recorder = Recorder.Builder()
      .setQualitySelector(QualitySelector.from(quality)))
      .build()

val videoCapture = VideoCapture.withOutput(recorder)

val frameRateRange = cameraInfo.getSupportedFrameRateRanges(      
       HighSpeedVideoSessionConfig(videoCapture, preview)
).first()

val sessionConfig = HighSpeedVideoSessionConfig(
    videoCapture, 
    preview, 
    frameRateRange = frameRateRange, 
    // Set true for slow-motion playback, or false for high-frame-rate
    isSlowMotionEnabled = true
)

cameraProvider.bindToLifecycle(
     lifecycleOwner, cameraSelector, sessionConfig)

// Start recording slow motion videos. 
val recording = recorder.prepareRecording(context, outputOption)
      .start(executor, {})

سازگاری و محدودیت‌ها

ضبط با سرعت بالا به پشتیبانی خاص CameraConstrainedHighSpeedCaptureSession و CamcorderProfile نیاز دارد. همیشه بررسی قابلیت را انجام دهید و ضبط با سرعت بالا را فقط در دستگاه‌های پشتیبانی‌شده فعال کنید تا از تجربه کاربری بد جلوگیری شود. درحال‌حاضر، این ویژگی در دوربین پشت تقریباً همه دستگاه‌های Pixel و مدل‌های منتخب از سازندگان دیگر پشتیبانی می‌شود.

برای جزئیات بیشتر، پست وبلاگ را بررسی کنید.

ترکیب مطمئن ویژگی‌ها: Feature Group API

CameraX 1.5 Feature Group API را معرفی می‌کند که حدس زدن سازگاری ویژگی‌ها را حذف می‌کند. براساس پُرسمان ترکیب ویژگی میانای برنامه‌سازی کاربردی Android 15، اکنون می‌توانید با اطمینان چندین ویژگی را باهم فعال کنید و از پایداری جلسه دوربین مطمئن باشید. «گروه ویژگی» درحال‌حاضر از این موارد پشتیبانی می‌کند: HDR (HLG)،‏ ۶۰ فریم در ثانیه، لرزش‌گیر پیش‌نمایش، و Ultra HDR. برای مثال، می‌توانید HDR،‏ ۶۰ فریم در ثانیه، و «لرزش‌گیر پیش‌نمایش» را به‌طور هم‌زمان در Pixel 10 و سری Galaxy S25 فعال کنید. بهبودهای آینده شامل ضبط 4K و بزرگ‌نمایی فوق‌عریض خواهد بود. 

‫Feature group API دو مورد استفاده ضروری را ممکن می‌کند:

مورد استفاده ۱: اولویت‌بندی بهترین کیفیت

اگر می‌خواهید بااستفاده از بهترین ترکیب ممکن از ویژگی‌ها ضبط کنید، می‌توانید فهرستی اولویت‌بندی‌شده ارائه دهید. CameraX تلاش می‌کند آن‌ها را به‌ترتیب فعال کند و اولین ترکیبی را که دستگاه کاملاً پشتیبانی می‌کند انتخاب می‌کند.

val sessionConfig = SessionConfig(
    useCases = listOf(preview, videoCapture),
    preferredFeatureGroup = listOf(
        GroupableFeature.HDR_HLG10,
        GroupableFeature.FPS_60,
        GroupableFeature.PREVIEW_STABILIZATION
    )
).apply {
    // (Optional) Get a callback with the enabled features to update your UI.
    setFeatureSelectionListener { selectedFeatures ->
        updateUiIndicators(selectedFeatures)
    }
}
processCameraProvider.bindToLifecycle(activity, cameraSelector, sessionConfig)

در این مثال، CameraX سعی می‌کند ویژگی‌ها را به‌این‌ترتیب فعال کند:

  1. HDR +‏ ۶۰ فریم در ثانیه + لرزش‌گیر پیش‌نمایش
  2. HDR +‏ ۶۰ فریم در ثانیه
  3. HDR + لرزش‌گیر پیش‌نمایش
  4. HDR
  5. ‫۶۰ فریم در ثانیه + لرزش‌گیر پیش‌نمایش
  6. 60 FPS
  7. پیش‌نمایش لرزش‌گیر
  8. هیچ‌کدام

مورد استفاده ۲: ساختن میانای کاربر تنظیمات سَمت کاربر

اکنون می‌توانید به‌طور دقیق نشان دهید که کدام ترکیب‌های ویژگی در میانای کاربری تنظیمات برنامه‌تان پشتیبانی می‌شود و کلیدهای گزینه‌های پشتیبانی‌نشده را مانند تصویر زیر غیرفعال کنید. 

unsupported-features-disabled.gif

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

fun disableFeatureIfNotSuported(
   enabledFeatures: Set<GroupableFeature>,     
   featureToCheck:GroupableFeature
) {
 val sessionConfig = SessionConfig(
     useCases = useCases,
     requiredFeatureGroup = enabledFeatures + featureToCheck
 )
 val isSupported = cameraInfo.isFeatureGroupSupported(sessionConfig)

 if (!isSupported) {
     // disable the toggle for featureToCheck
 }
}

برای اطلاعات بیشتر، لطفاً به پست وبلاگ Feature Group مراجعه کنید. 

به‌سازی‌های بیشتر ویدیو

  • بهبودهای دوربین هم‌زمان: با CameraX 1.5.1، اکنون می‌توانید موارد استفاده Preview + ImageCapture + VideoCapture را به‌طور هم‌زمان برای هر SingleCameraConfig در حالت غیرترکیبی مقید کنید. علاوه‌براین، در حالت ترکیب‌بندی (موارد استفاده مشابه با CompositionSettings)، اکنون می‌توانید CameraEffect را که برای نتیجه ترکیب‌بندی نهایی اعمال می‌شود تنظیم کنید.
  • بی‌صدا کردن پویا: اکنون می‌توانید بااستفاده از PendingRecording.withAudioEnabled(boolean initialMuted) ضبط را در حالت بی‌صدا شروع کنید و به کاربر اجازه دهید بعداً بااستفاده از Recording.mute(boolean muted) صدا را فعال کند.
  • بهبود مدیریت فضای ذخیره‌سازی ناکافی: CameraX اکنون خطای VideoRecordEvent.Finalize.ERROR_INSUFFICIENT_STORAGE را به‌طور قابل‌اعتمادی ارسال می‌کند، که به برنامه شما اجازه می‌دهد شرایط کمبود فضای ذخیره‌سازی را به‌طور مناسب مدیریت کند و به کاربر اطلاع دهد.
  • بهبود نور کم: در دستگاه‌های پشتیبانی‌شده (مثل سری Pixel 10)، می‌توانید CameraControl.enableLowLightBoostAsync را فعال کنید تا پیش‌نمایش و جاری‌سازی‌های ویدیو در محیط‌های تاریک به‌طور خودکار روشن‌تر شود.

ضبط تصویر در سطح حرفه‌ای

CameraX 1.5 ارتقاهای عمده‌ای را برای ImageCapture برای توسعه‌دهندگانی که حداکثر کیفیت و انعطاف‌پذیری را می‌خواهند به‌همراه دارد.

با ضبط DNG (RAW) کنترل خلاقانه را به‌دست بگیرید

برای کنترل کامل بر پس‌پردازش، CameraX اکنون از ضبط DNG (RAW) پشتیبانی می‌کند. این ویژگی به شما امکان می‌دهد مستقیماً از حسگر دوربین به داده‌های تصویری پردازش‌نشده و فشرده‌نشده دسترسی داشته باشید و ویرایش و درجه‌بندی رنگ در سطح حرفه‌ای را ممکن می‌سازد. این میانای برنامه‌سازی کاربردی از ضبط فایل DNG به‌تنهایی یا ضبط هم‌زمان خروجی‌های JPEG و DNG پشتیبانی می‌کند. برای نحوه ضبط هم‌زمان فایل‌های JPEG و DNG، کد نمونه زیر را ببینید.

val capabilities = ImageCapture.getImageCaptureCapabilities(cameraInfo)
val imageCapture = ImageCapture.Builder().apply {
    if (capabilities.supportedOutputFormats
             .contains(OUTPUT_FORMAT_RAW_JPEG)) {
        // Capture both RAW and JPEG formats.
        setOutputFormat(OUTPUT_FORMAT_RAW_JPEG)
    }
}.build()
// ... bind imageCapture to lifecycle ...


// Provide separate output options for each format.
val outputOptionRaw = /* ... configure for image/x-adobe-dng ... */
val outputOptionJpeg = /* ... configure for image/jpeg ... */
imageCapture.takePicture(
    outputOptionRaw,
    outputOptionJpeg,
    executor,
    object : ImageCapture.OnImageSavedCallback {
        override fun onImageSaved(results: OutputFileResults) {
            // This callback is invoked twice: once for the RAW file
            // and once for the JPEG file.
        }

        override fun onError(exception: ImageCaptureException) {}
    }
)

Ultra HDR برای افزونه‌های دوربین

بهترین‌های هر دو دنیا را دریافت کنید: عکاسی رایانشی خیره‌کننده «افزونه‌های دوربین» (مانند «حالت شب») همراه با رنگ‌های درخشان و دامنه پویای Ultra HDR. این ویژگی اکنون در بسیاری از تلفن‌های Android ممتاز اخیر، مانند سری Pixel 9/10 و سری Samsung S24/S25، پشتیبانی می‌شود.

// Support UltraHDR when Extension is enabled. 

val extensionsEnabledCameraSelector = extensionsManager
     .getExtensionEnabledCameraSelector(
        CameraSelector.DEFAULT_BACK_CAMERA, ExtensionMode.NIGHT)

val imageCapabilities = ImageCapture.getImageCaptureCapabilities(
               cameraProvider.getCameraInfo(extensionsEnabledCameraSelector)

val imageCapture = ImageCapture.Builder()
     .apply {
       if (imageCapabilities.supportedOutputFormats
                .contains(OUTPUT_FORMAT_JPEG_ULTRA_HDR) {
           setOutputFormat(OUTPUT_FORMAT_JPEG_ULTRA_HDR)

       }

     }.build()

بهبودهای Core API و قابلیت استفاده

روش جدیدی برای پیکربندی: SessionConfig

همان‌طور که در مثال‌های بالا دیده می‌شود، SessionConfig مفهوم جدیدی در CameraX 1.5 است. این روش پیکربندی را متمرکز می‌کند و میانای برنامه‌سازی کاربردی را به دو روش کلیدی ساده می‌کند:

  1. دیگر نیازی به فراخوانی‌های دستی unbind()نیست: میاناهای برنامه‌سازی کاربردی CameraX از چرخه حیات آگاه هستند. وقتی فعالیت یا LifecycleOwner دیگری ازبین می‌رود، به‌طور ضمنی موارد استفاده شما را «لغو اتصال» می‌کند. اما برای به‌روزرسانی موارد استفاده یا عوض کردن دوربین‌ها، همچنان باید قبل‌از اتصال مجدد، unbind() یا unbindAll() را فراخوانی کنید. اکنون با CameraX 1.5، وقتی SessionConfig جدیدی را مقید می‌کنید، CameraX به‌طور یکپارچه جلسه را برای شما به‌روز می‌کند و نیاز به فراخوانی‌های لغو قید را ازبین می‌برد.
  2. کنترل نرخ فریم قطعی: SessionConfig API جدید روشی قطعی برای مدیریت نرخ فریم معرفی می‌کند. برخلاف setTargetFrameRate قبلی که فقط یک اشاره بود، این روش جدید تضمین می‌کند که محدوده نرخ فریم مشخص‌شده پس‌از پیکربندی موفق اعمال خواهد شد. برای اطمینان از دقت، باید نرخ‌های فریم پشتیبانی‌شده را بااستفاده از CameraInfo.getSupportedFrameRateRanges(SessionConfig) پُرسمان کنید. با ارسال کامل SessionConfig، CameraX می‌تواند به‌طور دقیق محدوده‌های پشتیبانی‌شده را براساس پیکربندی‌های جاری‌سازی تعیین کند.

Camera-Compose اکنون پایدار است

می‌دانیم که چقدر از Jetpack Compose لذت می‌برید و خوشحالیم که اعلام کنیم کتابخانه camera-compose اکنون در نسخه 1.5.1 پایدار است! این نسخه شامل رفع اشکال‌های مهم مربوط به استفاده از CameraXViewfinder با ویژگی‌های Compose مانند moveableContentOf و Pager است و همچنین مشکل کشیدگی پیش‌نمایش را برطرف می‌کند. در نسخه‌های آتی، همچنان ویژگی‌های بیشتری به camera-compose اضافه خواهیم کرد.

بهبودهای ImageAnalysis و CameraControl

  • تنظیم شدت نور چراغ‌قوه: با میاناهای برنامه‌سازی کاربردی جدید، کنترل دقیقی بر چراغ‌قوه دستگاه داشته باشید. می‌توانید حداکثر قدرت پشتیبانی‌شده را بااستفاده از CameraInfo.getMaxTorchStrengthLevel() پُرسمان کنید و سپس سطح موردنظر را با CameraControl.setTorchStrengthLevel() تنظیم کنید.
  • پشتیبانی NV21 در ImageAnalysis: اکنون می‌توانید قالب تصویر NV21 را مستقیماً از ImageAnalysis درخواست کنید، که ادغام با سایر کتابخانه‌ها و میاناهای برنامه‌سازی کاربردی را ساده‌تر می‌کند. این ویژگی با فراخوانی ImageAnalysis.Builder.setOutputImageFormat(OUTPUT_IMAGE_FORMAT_NV21) فعال می‌شود.

امروز شروع کنید

همین امروز وابستگی‌هایتان را به CameraX 1.5 به‌روز کنید و ویژگی‌های جدید و هیجان‌انگیز را کاوش کنید. بی‌صبرانه منتظریم ببینیم چه چیزی می‌سازید.

برای استفاده از CameraX 1.5، لطفاً وابستگی‌های زیر را به libs.versions.toml خود اضافه کنید. (توصیه می‌کنیم از نسخه ۱.۵.۱ استفاده کنید که حاوی بسیاری از رفع اشکال‌های مهم و بهبودهای دوربین هم‌زمان است.) 

[versions]

camerax = "1.5.1"


[libraries]

..

androidx-camera-core = { module = "androidx.camera:camera-core", version.ref = "camerax" }

androidx-camera-compose = { module = "androidx.camera:camera-compose", version.ref = "camerax" }

androidx-camera-view = { module = "androidx.camera:camera-view", version.ref = "camerax" }

androidx-camera-lifecycle = { group = "androidx.camera", name = "camera-lifecycle", version.ref = "camerax" }

androidx-camera-camera2 = { module = "androidx.camera:camera-camera2", version.ref = "camerax" }

androidx-camera-extensions = { module = "androidx.camera:camera-extensions", version.ref = "camerax" }

و سپس این موارد را به وابستگی‌های build.gradle.kts واحدتان اضافه کنید:

dependencies {

  ..

  implementation(libs.androidx.camera.core)
  implementation(libs.androidx.camera.lifecycle)

  implementation(libs.androidx.camera.camera2)

  implementation(libs.androidx.camera.view) // for PreviewView 
  implementation(libs.androidx.camera.compose) // for compose UI

  implementation(libs.androidx.camera.extensions) // For Extensions 

}

سؤالی دارید یا می‌خواهید با تیم CameraX ارتباط برقرار کنید؟ به گروه بحث توسعه‌دهنده CameraX بپیوندید یا گزارش اشکال ارسال کنید:

نویسنده:
ادامه خواندن