اخبار محصول

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

۷ دقیقه مطالعه
Scott Nien
مهندس نرم‌افزار

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

برای ضبط ویدیو ، کاربران اکنون می‌توانند به راحتی ویدیوهای اسلوموشن یا با نرخ فریم بالا ضبط کنند. مهم‌تر از همه، API جدید Feature Group به شما امکان می‌دهد با اطمینان ترکیب‌های پیچیده‌ای مانند HDR 10 بیتی و 60 FPS را فعال کنید و نتایج ثابتی را در دستگاه‌های پشتیبانی شده تضمین کنید.

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

زیربنای این ویژگی‌ها، رابط برنامه‌نویسی کاربردی جدید SessionConfig است که تنظیم و پیکربندی مجدد دوربین را ساده می‌کند. حال، بیایید به جزئیات این ویژگی‌های جدید و هیجان‌انگیز بپردازیم.

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

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

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

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

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

۱. بررسی پشتیبانی از سرعت بالا: از متد جدید 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 دارد. همیشه بررسی قابلیت‌ها را انجام دهید و ضبط با سرعت بالا را فقط در دستگاه‌های پشتیبانی‌شده فعال کنید تا از تجربه کاربری بد جلوگیری شود. در حال حاضر، این ویژگی در دوربین‌های عقب تقریباً همه دستگاه‌های پیکسل و مدل‌های منتخب از سایر تولیدکنندگان پشتیبانی می‌شود.

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

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

CameraX 1.5 API گروه ویژگی‌ها (Feature Group API) را معرفی می‌کند که حدس و گمان در مورد سازگاری ویژگی‌ها را از بین می‌برد. بر اساس API جستجوی ترکیب ویژگی‌ها در اندروید ۱۵، اکنون می‌توانید با اطمینان چندین ویژگی را با هم فعال کنید و یک جلسه دوربین پایدار را تضمین کنید. گروه ویژگی‌ها در حال حاضر از موارد زیر پشتیبانی می‌کند: HDR (HLG)، ۶۰ فریم در ثانیه، تثبیت پیش‌نمایش و Ultra HDR . به عنوان مثال، می‌توانید HDR، ۶۰ فریم در ثانیه و تثبیت پیش‌نمایش را به طور همزمان در سری Pixel 10 و Galaxy S25 فعال کنید. قرار است پیشرفت‌های آینده شامل ضبط ۴K و بزرگنمایی فوق عریض باشد.

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 + 60 فریم بر ثانیه + تثبیت‌کننده پیش‌نمایش
  2. HDR + 60 فریم بر ثانیه
  3. HDR + تثبیت‌کننده پیش‌نمایش
  4. اچ‌دی‌آر
  5. ۶۰ فریم بر ثانیه + تثبیت‌کننده پیش‌نمایش
  6. ۶۰ فریم بر ثانیه
  7. پیش‌نمایش تثبیت‌کننده
  8. هیچکدام

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

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

ویژگی‌های پشتیبانی نشده-غیرفعال.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
 }
}

برای اطلاعات بیشتر به پست وبلاگ گروه ویژه مراجعه کنید.

بهبودهای بیشتر در ویدیو

  • بهبودهای همزمان دوربین: با 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) پشتیبانی می‌کند. این به شما امکان دسترسی به داده‌های تصویر پردازش نشده و فشرده نشده را مستقیماً از حسگر دوربین می‌دهد و امکان ویرایش حرفه‌ای و درجه‌بندی رنگ را فراهم می‌کند. این API از ضبط فایل 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) {}
    }
)

HDR فوق العاده برای افزونه‌های دوربین

از هر دو دنیا بهترین‌ها را دریافت کنید: عکاسی محاسباتی خیره‌کننده با افزونه‌های دوربین (مانند حالت شب) همراه با رنگ‌های درخشان و محدوده دینامیکی Ultra HDR. این ویژگی اکنون در بسیاری از گوشی‌های اندرویدی پریمیوم اخیر، مانند سری 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()

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

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

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

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

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

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

بهبودهای تحلیل تصویر و کنترل دوربین

  • تنظیم قدرت مشعل: با API های جدید، کنترل دقیقی بر مشعل دستگاه به دست آورید. می‌توانید حداکثر قدرت پشتیبانی شده را با استفاده از CameraInfo.getMaxTorchStrengthLevel() جستجو کنید و سپس سطح مورد نظر را با CameraControl.setTorchStrengthLevel() تنظیم کنید.
  • پشتیبانی از NV21 در ImageAnalysis : اکنون می‌توانید فرمت تصویر NV21 را مستقیماً از ImageAnalysis درخواست کنید و ادغام با سایر کتابخانه‌ها و APIها را ساده کنید. این قابلیت با فراخوانی 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 بپیوندید یا گزارش اشکال ثبت کنید:

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

    ادامه مطلب