پشتیبانی از چند دوربین

اندروید ۹ پشتیبانی از API برای دستگاه‌های چند دوربینه را از طریق یک دستگاه دوربین منطقی جدید متشکل از دو یا چند دستگاه دوربین فیزیکی که در یک جهت قرار دارند، معرفی کرد. دستگاه دوربین منطقی به عنوان یک CameraDevice/CaptureSession واحد در معرض یک برنامه قرار می‌گیرد که امکان تعامل با ویژگی‌های چند دوربینه یکپارچه با HAL را فراهم می‌کند. برنامه‌ها می‌توانند به صورت اختیاری به جریان‌های دوربین فیزیکی، فراداده‌ها و کنترل‌های اساسی دسترسی داشته باشند و آنها را کنترل کنند.

پشتیبانی از چند دوربین

شکل 1. پشتیبانی از چند دوربین

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

مثال‌ها و منابع

دستگاه‌های چند دوربینه باید با قابلیت منطقی چند دوربینه تبلیغ شوند.

کلاینت‌های دوربین می‌توانند با فراخوانی تابع getPhysicalCameraIds() شناسه دوربین دستگاه‌های فیزیکی که یک دوربین منطقی خاص از آنها ساخته شده است را جستجو کنند. سپس شناسه‌های برگردانده شده به عنوان بخشی از نتیجه، از طریق setPhysicalCameraId() برای کنترل جداگانه دستگاه‌های فیزیکی استفاده می‌شوند. نتایج چنین درخواست‌های جداگانه‌ای را می‌توان با فراخوانی تابع getPhysicalCameraResults() از کل نتیجه جستجو کرد.

درخواست‌های دوربین فیزیکی منفرد ممکن است فقط زیرمجموعه محدودی از پارامترها را پشتیبانی کنند. برای دریافت لیستی از پارامترهای پشتیبانی شده، توسعه‌دهندگان می‌توانند تابع getAvailablePhysicalCameraRequestKeys() را فراخوانی کنند.

جریان‌های دوربین فیزیکی فقط برای درخواست‌های غیر پردازش مجدد و فقط برای سنسورهای تک رنگ و بایر پشتیبانی می‌شوند.

پیاده‌سازی

چک لیست پشتیبانی

برای افزودن دستگاه‌های چند دوربینه منطقی در سمت HAL:

برای دستگاه‌هایی که اندروید ۹ را اجرا می‌کنند، دوربین‌ها باید از جایگزینی یک جریان منطقی YUV یا RAW با جریان‌های فیزیکی با همان اندازه (برای جریان‌های RAW صدق نمی‌کند) و همان فرمت از دو دوربین فیزیکی پشتیبانی کنند. این موضوع در مورد دستگاه‌هایی که اندروید ۱۰ را اجرا می‌کنند صدق نمی‌کند.

برای دستگاه‌هایی که اندروید ۱۰ را اجرا می‌کنند و نسخه دستگاه HAL دوربین آنها ۳.۵ یا بالاتر است، دستگاه دوربین باید isStreamCombinationSupported پشتیبانی کند تا برنامه‌ها بتوانند درخواست کنند که آیا یک ترکیب جریان خاص حاوی جریان‌های فیزیکی پشتیبانی می‌شود یا خیر.

نقشه پیکربندی جریان

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

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

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

ترکیب تضمین‌شده‌ی جریان

هم دوربین منطقی و هم دوربین‌های فیزیکی زیرین آن باید ترکیبات جریان اجباری مورد نیاز برای سطوح دستگاه خود را تضمین کنند.

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

در دستگاه‌هایی که اندروید ۹ را اجرا می‌کنند، برای هر ترکیب جریان تضمین‌شده، دوربین منطقی باید از موارد زیر پشتیبانی کند:

  • جایگزینی یک جریان منطقی YUV_420_888 یا جریان خام با دو جریان فیزیکی با اندازه و فرمت یکسان، که هر کدام از یک دوربین فیزیکی جداگانه هستند، با توجه به اینکه اندازه و فرمت توسط دوربین‌های فیزیکی پشتیبانی می‌شوند.

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

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

ملاحظات عملکرد و قدرت

  • عملکرد:

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

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

سفارشی‌سازی

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

  • خروجی ترکیبی دستگاه دوربین منطقی کاملاً به پیاده‌سازی HAL بستگی دارد. تصمیم‌گیری در مورد چگونگی استخراج جریان‌های منطقی ترکیبی از دوربین‌های فیزیکی، برای برنامه و چارچوب دوربین اندروید شفاف است.
  • درخواست‌ها و نتایج فیزیکی منفرد می‌توانند به صورت اختیاری پشتیبانی شوند. مجموعه پارامترهای موجود در چنین درخواست‌هایی نیز کاملاً به پیاده‌سازی خاص HAL وابسته است.
  • از اندروید ۱۰، HAL می‌تواند با انتخاب عدم نمایش برخی یا همه PHYSICAL_IDها در getCameraIdList ، تعداد دوربین‌هایی را که می‌توانند مستقیماً توسط یک برنامه باز شوند، کاهش دهد. فراخوانی getPhysicalCameraCharacteristics باید ویژگی‌های دوربین فیزیکی را برگرداند.

اعتبارسنجی

دستگاه‌های چند دوربینه منطقی باید مانند هر دوربین معمولی دیگری، CTS دوربین را با موفقیت پشت سر بگذارند. موارد آزمایشی که این نوع دستگاه را هدف قرار می‌دهند، می‌توانند در ماژول LogicalCameraDeviceTest یافت شوند.

این سه آزمایش ITS، سیستم‌های چند دوربینه را هدف قرار می‌دهند تا ادغام مناسب تصاویر را تسهیل کنند:

تست‌های صحنه ۱ و صحنه ۴ با دستگاه تست ITS-in-a-box اجرا می‌شوند. تست test_multi_camera_match تأیید می‌کند که روشنایی مرکز تصاویر زمانی که هر دو دوربین فعال هستند، مطابقت دارد. تست test_multi_camera_alignment تأیید می‌کند که فواصل دوربین، جهت‌گیری‌ها و پارامترهای اعوجاج به درستی بارگذاری شده‌اند. اگر سیستم چند دوربینه شامل یک دوربین Wide FoV (>90o) باشد، نسخه rev2 از جعبه ITS مورد نیاز است.

Sensor_fusion دومین ابزار آزمایشی است که حرکت مکرر و از پیش تعیین‌شده‌ی گوشی را امکان‌پذیر می‌کند و تأیید می‌کند که نشانگرهای زمانی ژیروسکوپ و حسگر تصویر با هم مطابقت دارند و فریم‌های چند دوربین با هم همگام هستند.

همه جعبه‌ها از طریق AcuSpec, Inc. ( www.acuspecinc.com ، fred@acusspecinc.com) و MYWAY Manufacturing ( www.myway.tw ، sales@myway.tw) در دسترس هستند. علاوه بر این، جعبه ITS نسخه rev1 را می‌توان از طریق West-Mark ( www.west-mark.com ، dgoodman@west-mark.com) خریداری کرد.

بهترین شیوه‌ها

برای بهره‌مندی کامل از ویژگی‌های فعال‌شده توسط چند دوربین و در عین حال حفظ سازگاری برنامه، هنگام پیاده‌سازی یک دستگاه چند دوربینه منطقی، این بهترین شیوه‌ها را دنبال کنید:

  • (اندروید ۱۰ یا بالاتر) زیردوربین‌های فیزیکی را از getCameraIdList پنهان کنید. این کار تعداد دوربین‌هایی را که می‌توانند مستقیماً توسط برنامه‌ها باز شوند، کاهش می‌دهد و نیاز برنامه‌ها به منطق پیچیده انتخاب دوربین را از بین می‌برد.
  • (اندروید ۱۱ یا بالاتر) برای یک دستگاه چند دوربینه منطقی که از بزرگنمایی نوری پشتیبانی می‌کند، API ANDROID_CONTROL_ZOOM_RATIO را پیاده‌سازی کنید و ANDROID_SCALER_CROP_REGION فقط برای برش نسبت ابعاد استفاده کنید. ANDROID_CONTROL_ZOOM_RATIO دستگاه را قادر می‌سازد تا بزرگنمایی کند و دقت بهتری را حفظ کند. در این حالت، HAL باید سیستم مختصات ANDROID_SCALER_CROP_REGION ، ANDROID_CONTROL_AE_REGIONS ، ANDROID_CONTROL_AWB_REGIONS ، ANDROID_CONTROL_AF_REGIONS ، ANDROID_STATISTICS_FACE_RECTANGLES و ANDROID_STATISTICS_FACE_LANDMARKS را تنظیم کند تا میدان دید پس از بزرگنمایی را به عنوان آرایه فعال حسگر در نظر بگیرد. برای اطلاعات بیشتر در مورد نحوه‌ی عملکرد ANDROID_SCALER_CROP_REGION به همراه ANDROID_CONTROL_ZOOM_RATIO ، به camera3_crop_reprocess#cropping مراجعه کنید.
  • برای دستگاه‌های چند دوربینه با دوربین‌های فیزیکی که قابلیت‌های متفاوتی دارند، مطمئن شوید که دستگاه فقط در صورتی از یک مقدار یا محدوده خاص برای یک کنترل پشتیبانی می‌کند که کل محدوده زوم از آن مقدار یا محدوده پشتیبانی کند. به عنوان مثال، اگر دوربین منطقی از یک دوربین فوق عریض، یک دوربین عریض و یک دوربین تله‌فوتو تشکیل شده باشد، موارد زیر را انجام دهید:
    • اگر اندازه آرایه فعال دوربین‌های فیزیکی متفاوت باشد، دوربین HAL باید نگاشت از آرایه‌های فعال دوربین‌های فیزیکی به آرایه فعال دوربین منطقی را برای ANDROID_SCALER_CROP_REGION ، ANDROID_CONTROL_AE_REGIONS ، ANDROID_CONTROL_AWB_REGIONS ، ANDROID_CONTROL_AF_REGIONS ، ANDROID_STATISTICS_FACE_RECTANGLES و ANDROID_STATISTICS_FACE_LANDMARKS انجام دهد تا از دیدگاه برنامه، سیستم مختصات، اندازه آرایه فعال دوربین منطقی باشد.
    • اگر دوربین‌های واید و تله‌فوتو از فوکوس خودکار پشتیبانی می‌کنند، اما دوربین اولترا واید فوکوس ثابت دارد، مطمئن شوید که دوربین منطقی پشتیبانی از فوکوس خودکار را تبلیغ می‌کند. HAL باید یک ماشین حالت فوکوس خودکار را برای دوربین اولترا واید شبیه‌سازی کند تا وقتی برنامه به لنز اولترا واید زوم می‌کند، این واقعیت که دوربین فیزیکی زیرین فوکوس ثابت دارد برای برنامه شفاف باشد و ماشین‌های حالت فوکوس خودکار برای حالت‌های AF پشتیبانی شده مطابق انتظار کار کنند.
    • اگر دوربین‌های واید و تله‌فوتو از 4K با سرعت 60 فریم بر ثانیه پشتیبانی می‌کنند و دوربین فوق‌عریض فقط از 4K با سرعت 30 فریم بر ثانیه یا 1080p با سرعت 60 فریم بر ثانیه پشتیبانی می‌کند، اما 4K با سرعت 60 فریم بر ثانیه را پشتیبانی نمی‌کند، مطمئن شوید که دوربین منطقی در تنظیمات جریان پشتیبانی‌شده خود، 4k با سرعت 60 فریم بر ثانیه را تبلیغ نمی‌کند. این کار یکپارچگی قابلیت‌های دوربین منطقی را تضمین می‌کند و تضمین می‌کند که برنامه با مشکل عدم دستیابی به 4k با سرعت 60 فریم بر ثانیه در مقدار ANDROID_CONTROL_ZOOM_RATIO کمتر از 1 مواجه نشود.
  • در اندروید ۱۰ و بالاتر، برای پشتیبانی از ترکیب‌های جریانی که شامل جریان‌های فیزیکی هستند، نیازی به دوربین چندگانه منطقی نیست. اگر HAL از ترکیبی با جریان‌های فیزیکی پشتیبانی می‌کند:
    • (اندروید ۱۱ یا بالاتر) برای مدیریت بهتر مواردی مانند عمق از استریو و ردیابی حرکت، میدان دید خروجی‌های جریان فیزیکی را تا حد امکان توسط سخت‌افزار افزایش دهید. با این حال، اگر یک جریان فیزیکی و یک جریان منطقی از یک دوربین فیزیکی سرچشمه بگیرند، محدودیت‌های سخت‌افزاری ممکن است میدان دید جریان فیزیکی را مجبور کند که با جریان منطقی یکسان باشد.
    • برای مقابله با فشار حافظه ناشی از چندین جریان فیزیکی، مطمئن شوید که برنامه‌ها از discardFreeBuffers برای آزادسازی بافرهای آزاد (بافرهایی که توسط مصرف‌کننده آزاد می‌شوند، اما هنوز توسط تولیدکننده از صف خارج نشده‌اند) استفاده می‌کنند، اگر انتظار می‌رود یک جریان فیزیکی برای مدتی بیکار باشد.
    • اگر جریان‌های فیزیکی از دوربین‌های فیزیکی مختلف معمولاً به یک درخواست یکسان متصل نمی‌شوند، مطمئن شوید که برنامه‌ها surface group استفاده می‌کنند تا یک صف بافر برای پشتیبانی از دو سطح روبروی برنامه استفاده شود و مصرف حافظه کاهش یابد.