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

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

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

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

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

هدف ۱ هدف ۲
نوع حداکثر اندازه نوع حداکثر اندازه موارد استفاده نمونه
یووی s1440p پردازش ویدیو یا تصویر درون برنامه‌ای
پرایو s1440p تجزیه و تحلیل منظره‌یاب درون برنامه‌ای
JPEG s1440p عدم امکان ثبت تصویر ثابت با منظره‌یاب
یووی / پرایو کیفیت 720p JPEG s1440p تصویربرداری ثابت استاندارد
یووی / پرایو کیفیت 720p یووی / پرایو 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 کوچکترین از دو وضوح زیر است:

  • حداکثر وضوح خروجی برای فرمت داده شده
  • ۶۴۰ در ۴۸۰

پیاده‌سازی

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

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

اعتبارسنجی

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

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

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

سناریوی مثال

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

مشکل

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

  • دوربین با شناسه 0 (Camera ID 0) یک دوربین منطقی است که توسط یک دوربین عریض و یک دوربین فوق عریض پشتیبانی می‌شود و هر کدام از آنها یک منبع ISP را اشغال می‌کنند.
  • دوربین با شناسه 1 ، دوربینی است که از یک منبع ISP استفاده می‌کند.

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

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

راه حل

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

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

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

  • برای حل مشکل عدم توانایی در مدیریت نسبت کامل محدوده زوم، اطمینان حاصل کنید که برنامه‌های دوربین، هنگام استفاده همزمان از دوربین‌ها، تضمین می‌کنند که از تنظیم کنترل ZOOM_RATIO بین فقط ۱x و 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 با شکست مواجه کنند.