Google 致力于为黑人社区推动种族平等。查看具体举措
หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

กล้อง

ไอคอน Android Camera HAL

เลเยอร์นามธรรมของฮาร์ดแวร์กล้อง (HAL) ของ Android จะเชื่อมต่อ API เฟรมเวิร์กกล้องระดับสูงกว่าใน Camera 2 กับไดรเวอร์กล้องและฮาร์ดแวร์พื้นฐานของคุณ ระบบย่อยของกล้องรวมถึงการใช้งานสำหรับส่วนประกอบท่อส่งกล้องในขณะที่ HAL ของกล้องมีอินเทอร์เฟซสำหรับใช้ในการใช้ส่วนประกอบเหล่านี้ในเวอร์ชันของคุณ

สถาปัตยกรรม

รูปและรายการต่อไปนี้อธิบายส่วนประกอบ HAL

สถาปัตยกรรมกล้อง Android

รูปที่ 1. สถาปัตยกรรมของกล้อง

กรอบงานแอป
ในระดับเฟรมเวิร์กของแอพคือโค้ดของแอพซึ่งใช้ Camera 2 API เพื่อโต้ตอบกับฮาร์ดแวร์ของกล้อง ภายในรหัสนี้เรียกอินเทอร์เฟซ Binder ที่ เกี่ยวข้องเพื่อเข้าถึงโค้ดเนทีฟที่โต้ตอบกับกล้อง
AIDL
อินเทอร์เฟซ binder ที่เกี่ยวข้องกับ CameraService สามารถพบได้ที่ frameworks / av / camera / aidl / android / hardware โค้ดที่สร้างขึ้นจะเรียกใช้โค้ดเนทีฟระดับล่างเพื่อเข้าถึงกล้องฟิสิคัลและส่งคืนข้อมูลที่ใช้ในการสร้าง CameraDevice และ CameraCaptureSession ในระดับเฟรมเวิร์ก
กรอบดั้งเดิม
เฟรมเวิร์กนี้อยู่ใน frameworks/av/ จัดเตรียมเนทีฟเทียบเท่ากับ CameraDevice และ CameraCaptureSession ดู ข้อมูลอ้างอิง NDK camera2 ด้วย
อินเทอร์เฟซ IPC binder
อินเทอร์เฟซตัวประสาน IPC ช่วยอำนวยความสะดวกในการสื่อสารข้ามขอบเขตของกระบวนการ มีคลาสตัวประสานกล้องหลายตัวที่อยู่ใน frameworks/av/camera/camera/aidl/android/hardware ที่เรียกใช้บริการกล้อง ICameraService คืออินเทอร์เฟซสำหรับบริการกล้องถ่ายรูป ICameraDeviceUser เป็นส่วนต่อประสานกับอุปกรณ์กล้องที่เปิดเฉพาะ และ ICameraServiceListener และ ICameraDeviceCallbacks คือการเรียกกลับ CameraService และ CameraDevice ไปยังกรอบงานแอปพลิเคชัน
บริการกล้อง
บริการกล้องซึ่งอยู่ใน frameworks/av/services/camera/libcameraservice/CameraService.cpp คือรหัสจริงที่โต้ตอบกับ HAL
ฮัล
ชั้นนามธรรมของฮาร์ดแวร์กำหนดอินเทอร์เฟซมาตรฐานที่บริการกล้องเรียกเข้าและคุณต้องใช้เพื่อให้ฮาร์ดแวร์ของกล้องทำงานได้อย่างถูกต้อง

การใช้ HAL

HAL อยู่ระหว่างไดรเวอร์กล้องและเฟรมเวิร์ก Android ระดับสูงกว่าและกำหนดอินเทอร์เฟซที่คุณต้องใช้เพื่อให้แอปสามารถใช้งานฮาร์ดแวร์ของกล้องได้อย่างถูกต้อง อินเตอร์เฟส HIDL สำหรับ Camera HAL ถูกกำหนดไว้ใน ฮาร์ดแวร์ / อินเทอร์เฟซ / กล้อง

HAL โดยทั่วไปจะต้องใช้อินเทอร์เฟซ HIDL ต่อไปนี้:

  • ICameraProvider : สำหรับแจกแจงอุปกรณ์แต่ละเครื่องและจัดการสถานะ
  • ICameraDevice : อินเทอร์เฟซอุปกรณ์กล้อง
  • ICameraDeviceSession : อินเทอร์เฟซเซสชันของอุปกรณ์กล้องที่ใช้งานอยู่

การใช้งาน HIDL อ้างอิงพร้อมใช้งานสำหรับ CameraProvider.cpp , CameraDevice.cpp และ CameraDeviceSession.cpp การใช้งานครอบคลุม HAL แบบเก่าที่ยังคงใช้ API เดิม ตั้งแต่ Android 8.0 การติดตั้ง Camera HAL ต้องใช้ HIDL API ไม่รองรับการใช้อินเทอร์เฟซเดิม

ส่วนประกอบ HAL ดั้งเดิม

ส่วนนี้จะอธิบายถึงสถาปัตยกรรมของส่วนประกอบ HAL เดิมและวิธีการใช้งาน HAL การใช้งานกล้อง HAL บน Android 8.0 ขึ้นไปต้องใช้ HIDL API แทนตามที่อธิบายไว้ข้างต้น

สถาปัตยกรรม (มรดก)

รูปและรายการต่อไปนี้อธิบายส่วนประกอบ HAL ของกล้องรุ่นเก่า

สถาปัตยกรรมกล้อง Android

รูปที่ 2. สถาปัตยกรรมของกล้องรุ่นเก่า

กรอบงานแอป
ในระดับกรอบงานแอปคือรหัสของแอปซึ่งใช้ android.hardware.Camera API เพื่อโต้ตอบกับฮาร์ดแวร์ของกล้อง ภายในรหัสนี้เรียกคลาสกาว JNI ที่สอดคล้องกันเพื่อเข้าถึงโค้ดเนทีฟที่โต้ตอบกับกล้อง
JNI
รหัส JNI ที่เชื่อมโยงกับ android.hardware.Camera อยู่ใน frameworks/base/core/jni/android_hardware_Camera.cpp รหัสนี้เรียกรหัสเนทีฟระดับล่างเพื่อเข้าถึงกล้องจริงและส่งกลับข้อมูลที่ใช้ในการสร้างวัตถุ android.hardware.Camera ที่ระดับเฟรมเวิร์ก
กรอบดั้งเดิม
เฟรมเวิร์กดั้งเดิมที่กำหนดไว้ใน frameworks/av/camera/Camera.cpp มีเนทีฟเทียบเท่ากับคลาส android.hardware.Camera คลาสนี้เรียกใช้ IPC binder proxies เพื่อเข้าถึงบริการกล้องถ่ายรูป
ผู้รับมอบฉันทะ IPC ของสารยึดเกาะ
พร็อกซีตัวประสาน IPC ช่วยอำนวยความสะดวกในการสื่อสารข้ามขอบเขตของกระบวนการ มีคลาสตัวประสานกล้องสามคลาสที่อยู่ในไดเร็กทอรี frameworks/av/camera ที่เรียกเข้าสู่บริการกล้อง ICameraService เป็นอินเทอร์เฟซสำหรับบริการกล้องถ่ายรูป ICamera เป็นอินเทอร์เฟซสำหรับอุปกรณ์กล้องที่เปิดเฉพาะและ ICameraClient เป็นอินเทอร์เฟซของอุปกรณ์กลับไปที่กรอบงานแอป
บริการกล้อง
บริการกล้องซึ่งอยู่ใน frameworks/av/services/camera/libcameraservice/CameraService.cpp คือรหัสจริงที่โต้ตอบกับ HAL
ฮัล
ชั้นนามธรรมของฮาร์ดแวร์กำหนดอินเทอร์เฟซมาตรฐานที่บริการกล้องเรียกเข้าและคุณต้องใช้เพื่อให้ฮาร์ดแวร์ของกล้องทำงานได้อย่างถูกต้อง
ไดรเวอร์เคอร์เนล
ไดรเวอร์ของกล้องจะโต้ตอบกับฮาร์ดแวร์ของกล้องจริงและการใช้งาน HAL ของคุณ กล้องและไดรเวอร์ต้องรองรับรูปแบบภาพ YV12 และ NV21 เพื่อรองรับการดูภาพจากกล้องบนจอแสดงผลและการบันทึกวิดีโอ

การใช้ HAL (เดิม)

HAL อยู่ระหว่างไดรเวอร์กล้องและเฟรมเวิร์ก Android ระดับสูงกว่าและกำหนดอินเทอร์เฟซที่คุณต้องใช้เพื่อให้แอปสามารถใช้งานฮาร์ดแวร์ของกล้องได้อย่างถูกต้อง อินเทอร์เฟซ HAL ถูกกำหนดไว้ในไฟล์ส่วนหัว hardware/libhardware/include/hardware/camera.h และ hardware/libhardware/include/hardware/camera_common.h

camera_common.h กำหนด camera_module ซึ่งเป็นโครงสร้างมาตรฐานเพื่อรับข้อมูลทั่วไปเกี่ยวกับกล้องเช่น ID กล้องและคุณสมบัติทั่วไปของกล้องทั้งหมด (กล่าวคือไม่ว่าจะเป็นกล้องหน้าหรือกล้องหลัง)

camera.h มีรหัสที่สอดคล้องกับ android.hardware.Camera ไฟล์ส่วนหัวนี้ประกาศโครงสร้าง camera_device ซึ่งจะมีโครงสร้าง camera_device_ops พร้อมตัวชี้ไปยังฟังก์ชันที่ใช้อินเทอร์เฟซ HAL สำหรับเอกสารประกอบเกี่ยวกับพารามิเตอร์ของกล้องที่นักพัฒนาสามารถกำหนดได้โปรดดู frameworks/av/include/camera/CameraParameters.h พารามิเตอร์เหล่านี้ถูกตั้งค่าด้วยฟังก์ชันที่ชี้โดย int (*set_parameters)(struct camera_device *, const char *parms) ใน HAL

สำหรับตัวอย่างของการใช้งาน HAL โปรดดูการใช้งาน Galaxy Nexus HAL ใน hardware/ti/omap4xxx/camera

การกำหนดค่าไลบรารีที่แบ่งใช้

ตั้งค่าระบบบิวด์ Android เพื่อจัดแพคเกจการใช้งาน HAL ลงในไลบรารีที่ใช้ร่วมกันอย่างถูกต้องและคัดลอกไปยังตำแหน่งที่เหมาะสมโดยสร้างไฟล์ Android.mk :

  1. สร้างไดเร็กทอรี device/<company_name>/<device_name>/camera เพื่อบรรจุไฟล์ต้นฉบับของไลบรารีของคุณ
  2. สร้างไฟล์ Android.mk เพื่อสร้างไลบรารีที่ใช้ร่วมกัน ตรวจสอบให้แน่ใจว่า makefile มีบรรทัดต่อไปนี้:
    LOCAL_MODULE := camera.<device_name>
    LOCAL_MODULE_RELATIVE_PATH := hw
    

    ไลบรารีของคุณต้องตั้งชื่อว่า camera.<device_name> ( .so ถูกต่อท้ายโดยอัตโนมัติ) เพื่อให้ Android สามารถโหลดไลบรารีได้อย่างถูกต้อง ตัวอย่างเช่นดู makefile สำหรับกล้อง Galaxy Nexus ที่อยู่ใน hardware/ti/omap4xxx/Android.mk

  3. ระบุอุปกรณ์ของคุณมีคุณสมบัติของกล้องโดยการคัดลอกไฟล์ XML คุณลักษณะที่จำเป็นในไดเร็กทอรี frameworks/native/data/etc ด้วย makefile ของอุปกรณ์ของคุณ ตัวอย่างเช่นหากต้องการระบุว่าอุปกรณ์ของคุณมีแฟลชกล้องและสามารถโฟกัสอัตโนมัติได้ให้เพิ่มบรรทัดต่อไปนี้ใน <device>/<company_name>/<device_name>/device.mk makefile ของอุปกรณ์

    สำหรับตัวอย่างของ makefile device/samsung/tuna/device.mk โปรดดูที่ device/samsung/tuna/device.mk

  4. ประกาศความสามารถของตัวแปลงสัญญาณสื่อรูปแบบและความละเอียดของกล้องในไฟล์ XML ของ device/<company_name>/<device_name>/media_profiles.xml และ device/<company_name>/<device_name>/media_codecs.xml สำหรับรายละเอียดโปรดดู การเปิดเผยตัวแปลงสัญญาณไปยังกรอบงาน
  5. เพิ่มบรรทัดต่อไปนี้ในอุปกรณ์ของคุณ device/<company_name>/<device_name>/device.mk Makefile เพื่อคัดลอก media_profiles.xml และ media_codecs.xml ไฟล์ไปยังสถานที่ที่เหมาะสม:
    # media config xml file
    PRODUCT_COPY_FILES += \
        <device>/<company>/<device>/media_profiles.xml:system/etc/media_profiles.xml
    
    # media codec config xml file
    PRODUCT_COPY_FILES += \
        <device>/<company>/<device>/media_codecs.xml:system/etc/media_codecs.xml
    
  6. หากต้องการรวมแอปกล้องถ่ายรูปในอิมเมจระบบของอุปกรณ์ให้ระบุในตัวแปร PRODUCT_PACKAGES ในอุปกรณ์ของคุณ device/<company>/<device>/device.mk makefile:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...