فعال کردن دوربین‌های چند کلاینتی

شما می‌توانید چندین کلاینت را قادر سازید تا به طور همزمان به یک دوربین دسترسی داشته باشند. برای انجام این کار، از APIهای سیستم جاوا و اندروید NDK که در این صفحه توضیح داده شده‌اند، برای اشتراک‌گذاری دسترسی به کلاینت‌های دوربین سیستم استفاده کنید.

  • کلاینت اصلی: کلاینتی با بالاترین اولویت در بین کلاینت‌های مشترک. یک کلاینت اصلی می‌تواند درخواست‌های ضبط ایجاد کرده و پارامترهای ضبط را تغییر دهد.

  • کلاینت ثانویه: سایر کلاینت‌های اشتراکی، کلاینت‌های ثانویه هستند. کلاینت‌های ثانویه نمی‌توانند درخواست‌های ضبط ایجاد کنند و همچنین نمی‌توانند پارامترهای ضبط را تغییر دهند. کلاینت‌های ثانویه فقط می‌توانند درخواست‌هایی برای شروع یا توقف پخش ارسال کنند.

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

پیکربندی یک جلسه مشترک

برای اشتراک‌گذاری یک دستگاه دوربین، پیکربندی جلسه مشترک را در فایلی با نام shared_session_config.xml واقع در /system_ext/etc/ ارائه دهید. در این نمونه کد، دوربین با شناسه 0 از اشتراک‌گذاری دوربین با پیکربندی‌ای که شامل دو جریان ImageReader و SurfaceView است، پشتیبانی می‌کند.

<SharedCameraSessionConfigurations colorSpace="-1">
    <!-- colorSpace: ANDROID_REQUEST_AVAILABLE_COLOR_SPACE_PROFILES_MAP_UNSPECIFIED -->
    <SharedCameraSessionConfiguration cameraId="0">
        <!-- First OutputConfiguration: All optional fields are provided -->
        <OutputConfiguration>
            <!-- surfaceType: SURFACE_TYPE_IMAGE_READER -->
            <surfaceType>4</surfaceType>
            <width>1920</width>
            <height>1080</height>
            <!-- physicalCameraId is omitted; defaults to "" -->
            <!-- streamUseCase: ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT -->
            <streamUseCase>0</streamUseCase>
            <!-- timestampBase: TIMESTAMP_BASE_DEFAULT -->
            <timestampBase>0</timestampBase>
            <!-- mirrorMode: MIRROR_MODE_AUTO -->
            <mirrorMode>0</mirrorMode>
            <useReadoutTimestamp>0</useReadoutTimestamp>
            <!-- format: HAL_PIXEL_FORMAT_RGBA_8888 -->
            <format>1</format>
            <!-- usage: AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN -->
            <usage>3</usage>
            <!-- dataSpace: HAL_DATASPACE_UNKNOWN -->
            <dataSpace>0</dataSpace>
        </OutputConfiguration>
        <!-- Second OutputConfiguration: All optional fields are provided -->
        <OutputConfiguration>
            <!-- surfaceType: SURFACE_TYPE_SURFACE_VIEW -->
            <surfaceType>0</surfaceType>
            <width>1920</width>
            <height>1080</height>
            <!-- physicalCameraId is omitted; defaults to "" -->
            <!-- streamUseCase: ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT -->
            <streamUseCase>0</streamUseCase>
            <!-- timestampBase: TIMESTAMP_BASE_DEFAULT -->
            <timestampBase>0</timestampBase>
            <!-- mirrorMode: MIRROR_MODE_AUTO -->
            <mirrorMode>0</mirrorMode>
            <useReadoutTimestamp>0</useReadoutTimestamp>
            <!-- format: HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED -->
            <format>34</format>
            <!-- usage: AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE|AHARDWAREBUFFER_USAGE_COMPOSER_OVERLAY -->
            <usage>256|2048</usage>
            <!-- dataSpace: HAL_DATASPACE_UNKNOWN -->

            <dataSpace>0</dataSpace>
        </OutputConfiguration>
      </SharedCameraSessionConfiguration>
</SharedCameraSessionConfigurations>

برای پرس‌وجو از پیکربندی یک نشست مشترک، کلاینت‌ها از CameraCharacteristics برای SHARED_SESSION_CONFIGURATION استفاده می‌کنند. کلاینت‌هایی که در حالت اشتراکی به دوربین دسترسی دارند باید از پیکربندی نشست مشترک استفاده کنند. وقتی پیکربندی نشست ارسالی توسط یک کلاینت با پیکربندی نشست مشترک مطابقت نداشته باشد، فراخوانی createCaptureSession با شکست مواجه می‌شود.

رابط‌های برنامه‌نویسی کاربردی جاوا

CameraManager و CameraDevice رابط‌های برنامه‌نویسی کاربردی (API) برای باز کردن دوربین‌ها در حالت اشتراکی ارائه می‌دهند.

رابط‌های برنامه‌نویسی کاربردی (API) مدیر دوربین

CameraManager این APIها را ارائه می‌دهد:

  • isCameraDeviceSharingSupported : کلاینت‌ها از این API برای تعیین اینکه آیا یک دوربین از حالت اشتراکی پشتیبانی می‌کند یا خیر، استفاده می‌کنند.

  • openSharedCamera : اگر دوربینی از حالت اشتراکی پشتیبانی کند، کلاینت‌ها از این API برای باز کردن دوربین در حالت اشتراکی استفاده می‌کنند.

APIهای CameraDevice.StateCallback

CameraDevice.StateCallback این APIها را ارائه می‌دهد:

  • onOpenedInSharedMode : کلاینت‌ها این فراخوانی را زمانی دریافت می‌کنند که دوربین در حالت اشتراکی باز شود. این فراخوانی نشان می‌دهد که کلاینت، کلاینت اصلی است یا فرعی.

  • onClientSharedAccessPriorityChanged : وقتی یک جلسه مشترک باز می‌شود، این فراخوانی زمانی فعال می‌شود که اولویت یک کلاینت تغییر کند، زیرا یک کلاینت با اولویت بالاتر همان دوربین را باز یا بسته کرده است.

جلسه ضبط مشترک دوربین

کلاس CameraSharedCaptureSession یک جلسه ضبط مشترک را نشان می‌دهد. در حالت دوربین مشترک، کلاینتی که یک جلسه ایجاد می‌کند باید از نوع جلسه SESSION_SHARED استفاده کند.

وقتی سیستم یک جلسه ایجاد می‌کند، CameraCaptureSession به CameraSharedCaptureSession تبدیل (cast) کنید.

کلاینت‌های ثانویه نمی‌توانند از createCaptureRequest استفاده کنند. در عوض، کلاینت‌های ثانویه از startStreaming API برای شروع استریمینگ روی سطوح مشخص شده و از stopStreaming API برای توقف استریمینگ استفاده می‌کنند.

رابط‌های برنامه‌نویسی کاربردی اندروید (NDK)

برنامه‌های داخلی از این APIهای NDK اندروید برای باز کردن دوربین در حالت اشتراکی استفاده می‌کنند:

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

این تست‌های مخصوص دوربین‌های چند کلاینتی را ببینید:

محدودیت‌ها

حالت دوربین مشترک از این گزینه‌ها پشتیبانی نمی‌کند :

  • درخواست‌های ضبط پشت سر هم
  • جلسات تمدید
  • جلسات پرسرعت
  • جلسات آفلاین
  • OutputConfiguration با اشتراک‌گذاری سطح
  • جلسات ضبط قابل پردازش مجدد
  • برنامه‌های شخص ثالث

وقتی یک کلاینت با اولویت بالاتر، دوربینی را در حالت عادی باز می‌کند، سیستم تمام کلاینت‌های دوربین مشترک را حذف می‌کند.