جریان همزمان دوربین

اندروید به دستگاه ها اجازه می دهد از پخش همزمان دستگاه های دوربین پشتیبانی کنند. به عنوان مثال، این امکان را به دستگاه می دهد که هر دو دوربین جلو و پشت را به طور همزمان داشته باشند. از Android 11، Camera2 API شامل روش‌های زیر است که برنامه‌ها می‌توانند برای تعیین اینکه آیا دوربین‌ها از جریان همزمان پشتیبانی می‌کنند و پیکربندی‌های جریانی که پشتیبانی می‌شوند، فراخوانی کنند.

  • getConcurrentCameraIds : مجموعه ای از ترکیبی از شناسه های دستگاه دوربین متصل فعلی را دریافت می کند که از پیکربندی جلسات دستگاه دوربین به طور همزمان پشتیبانی می کند.
  • isConcurrentSessionConfigurationSupported : بررسی می کند که آیا مجموعه ارائه شده از دستگاه های دوربین و تنظیمات جلسه مربوطه آنها را می توان همزمان پیکربندی کرد یا خیر.

مجموعه‌ای از ترکیب‌های جریان اجباری که باید در جریان پخش همزمان پشتیبانی شوند، از طریق ویژگی‌های دوربین یک دستگاه دوربین در ویژگی SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS گنجانده شده‌اند.

هر دستگاه دوربینی که از طریق getConcurrentStreamingCameraIds() تبلیغ می شود باید از تنظیمات تضمین شده زیر برای جریان های همزمان پشتیبانی کند.

هدف 1 هدف 2
تایپ کنید حداکثر اندازه تایپ کنید حداکثر اندازه نمونه موارد استفاده
YUV s1440p پردازش ویدیو یا تصویر درون برنامه ای
PRIV s1440p تجزیه و تحلیل منظره یاب درون برنامه ای
JPEG s1440p ضبط تصویر ثابت با منظره یاب وجود ندارد
YUV / PRIV s720p JPEG s1440p تصویربرداری ثابت استاندارد
YUV / PRIV s720p YUV / PRIV s1440p ویدیوی درون برنامه ای یا پردازش با پیش نمایش

دستگاه‌های دارای قابلیت MONOCHROME ( CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES شامل CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME ) که از Y8 پشتیبانی می‌کنند، باید از جایگزین کردن جریان‌های YUV با Y8 در همه جریان‌های تضمینی پشتیبانی کنند.

s720p به 720p (1280 x 720) یا حداکثر وضوح پشتیبانی شده برای فرمت خاص بازگردانده شده توسط StreamConfigurationMap.getOutputSizes() اشاره دارد. s1440p به 1440p (1920 x 1440) یا حداکثر وضوح پشتیبانی شده برای فرمت خاص برگردانده شده توسط StreamConfigurationMap.getOutputSizes() اشاره دارد. دستگاه‌هایی که قابلیت‌های آن‌ها ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE را شامل نمی‌شود، باید حداقل یک جریان Y16، Dataspace::DEPTH با وضوح sVGA را در طول عملیات همزمان، که در آن sVGA کوچک‌تر از دو وضوح زیر است، پشتیبانی کنند:

  • حداکثر وضوح خروجی برای فرمت داده شده
  • 640 x 480

پیاده سازی

برای اینکه به برنامه‌ها اجازه دهید از یک دستگاه پرس و جو کنند تا تشخیص دهند که آیا دوربین‌های آن از جریان همزمان پشتیبانی می‌کنند یا خیر، رابط ICameraProvider@2.6 HAL را پیاده‌سازی کنید که شامل روش‌های زیر است:

برای اجرای مرجع رابط ICameraProvider@2.6 HAL، به کتابخانه HAL دوربین شبیه‌سازی شده در EmulatedCameraProviderHWLImpl.cpp مراجعه کنید.

اعتبار سنجی

برای آزمایش اینکه اجرای این ویژگی طبق برنامه شما کار می کند، از تست ConcurrentCameraTest.java CTS استفاده کنید. همچنین، با استفاده از برنامه‌ای آزمایش کنید که چندین دوربین را باز می‌کند و همزمان آنها را کار می‌کند.

مشکلات تخصیص منابع

اگر HAL های دوربین پشتیبانی از عملکرد همزمان دستگاه های دوربین را تبلیغ کنند، ممکن است با مشکلات تخصیص منابع مواجه شوند، به خصوص در مواردی که منابع پردازشگر سیگنال تصویر (ISP) کافی در تلفن وجود داشته باشد تا دوربین های جلو و عقب (یا سایر دوربین ها) را به طور همزمان پخش کند. ، اما نه به ظرفیت کامل آنها. در این حالت دوربین HAL باید منابع سخت افزاری محدودی را به هر دستگاه دوربین اختصاص دهد.

سناریوی نمونه

سناریوی زیر این مشکل را نشان می دهد.

مسئله

دستگاه دارای پیکربندی زیر است:

  • Camera ID 0 یک دوربین منطقی است که توسط یک دوربین عریض و فوق عریض پشتیبانی می شود که هر کدام یک منبع ISP دارند.
  • Camera ID 1 دوربینی است که از یک منبع ISP استفاده می کند.

دستگاه (تلفن) دارای دو ISP است. اگر شناسه دوربین 0 باز شود و یک جلسه پیکربندی شود، ممکن است دوربین HAL دو ISP ذخیره کند که استفاده از دوربین فوق عریض و گسترده را پیش بینی می کنند.

اگر اینطور است، دوربین جلو (ID 1 ) نمی تواند هیچ جریانی را پیکربندی کند زیرا هر دو ISP در حال استفاده هستند.

راه حل

برای رفع این مشکل، چارچوب می‌تواند هر دو شناسه دوربین 0 و 1 را قبل از پیکربندی جلسات باز کند تا راهنمایی به HAL دوربین در مورد نحوه تخصیص منابع ارائه کند (زیرا اکنون انتظار عملکرد همزمان دوربین‌ها را دارد). با این حال، این می‌تواند منجر به قابلیت‌های محدود شود، برای مثال، زوم ممکن است نتواند نسبت بزرگنمایی کامل را مدیریت کند (زیرا تعویض شناسه‌های فیزیکی دوربین ممکن است مشکل ساز باشد).

برای پیاده سازی این راه حل، به روز رسانی های زیر را به provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds انجام دهید.

  • برای عملکرد همزمان دوربین‌ها، چارچوب دوربین باید دستگاه‌های دوربین ( @3.2::ICameraDevice::open ) را قبل از پیکربندی هر جلسه روی دستگاه‌های دوربین، باز کند. این به ارائه دهندگان دوربین اجازه می دهد تا منابع را بر اساس آن تخصیص دهند.

  • برای رفع مشکل عدم توانایی کنترل نسبت بزرگنمایی کامل، اطمینان حاصل کنید که برنامه‌های دوربین، هنگام استفاده همزمان از دوربین، تضمین می‌کنند که از تنظیم کنترل ZOOM_RATIO بین 1 برابر و MAX_DIGITAL_ZOOM به جای ZOOM_RATIO_RANGE کامل استفاده می‌کنند (این کار از تعویض دوربین جلوگیری می‌کند. دوربین های فیزیکی داخلی، که به طور بالقوه به ISP های بیشتری نیاز دارد).

مشکل با testDualCameraPreview

هنگامی که به‌روزرسانی‌های بالا را انجام می‌دهید، می‌تواند با رفتاری که توسط آزمایش MultiViewTest.java#testDualCameraPreview مجاز است، مشکل ایجاد کند.

تست تست testDualCameraPreview جلسات را تنها پس از باز کردن همه دوربین‌ها پیکربندی نمی‌کند. این دنباله را دنبال می کند:

for each camera  in cameraDevices :
  device = openCamera(camera)
     createCaptureSession(device);

با این حال، خرابی های باز دوربین را با ERROR_MAX_CAMERAS_IN_USE [1] تحمل می کند. برنامه های شخص ثالث ممکن است به این رفتار بستگی داشته باشند.

از آنجایی که دوربین HAL مجموعه کاملی از شناسه‌های دوربین را که برای عملکرد همزمان باز می‌شوند، قبل از پیکربندی جلسات نمی‌داند، تخصیص منابع سخت‌افزاری برایش سخت است (با فرض اینکه رقابتی برای آنها وجود دارد).

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