Luồng đầu ra
Hệ thống con camera chỉ hoạt động trên quy trình dựa trên ANativeWindow cho tất cả các độ phân giải và định dạng đầu ra. Bạn có thể định cấu hình nhiều luồng cùng một lúc để gửi một khung hình đến nhiều đích đến, chẳng hạn như GPU, bộ mã hoá video, RenderScript hoặc các vùng đệm mà ứng dụng có thể nhìn thấy (RAW Bayer, vùng đệm YUV đã xử lý hoặc vùng đệm được mã hoá JPEG).
Để tối ưu hoá, bạn phải định cấu hình các luồng đầu ra này trước và chỉ có thể có một số lượng giới hạn cùng một lúc. Điều này cho phép phân bổ trước các vùng đệm bộ nhớ và cấu hình phần cứng camera, để khi các yêu cầu được gửi kèm theo nhiều hoặc các quy trình đầu ra khác nhau, sẽ không có độ trễ trong việc thực hiện yêu cầu.
Để biết thêm thông tin về các tổ hợp đầu ra luồng được đảm bảo tuỳ thuộc vào cấp độ phần cứng được hỗ trợ, hãy xem createCaptureSession()
.
Cắt xen
Việc cắt mảng pixel đầy đủ (để thu phóng kỹ thuật số và các trường hợp sử dụng khác mà bạn muốn có FOV nhỏ hơn) được truyền đạt thông qua chế độ cài đặt ANDROID_SCALER_CROP_REGION. Đây là chế độ cài đặt cho mỗi yêu cầu và có thể thay đổi theo từng yêu cầu. Điều này rất quan trọng để triển khai tính năng thu phóng kỹ thuật số mượt mà.
Vùng này được xác định là một hình chữ nhật (x, y, chiều rộng, chiều cao), trong đó (x, y) mô tả góc trên cùng bên trái của hình chữ nhật. Hình chữ nhật được xác định trên hệ toạ độ của mảng pixel hoạt động của cảm biến, trong đó (0,0) là pixel trên cùng bên trái của mảng pixel hoạt động. Do đó, chiều rộng và chiều cao không được lớn hơn kích thước được báo cáo trong trường thông tin tĩnh ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY. Chiều rộng và chiều cao tối thiểu được phép do HAL báo cáo thông qua trường thông tin tĩnh ANDROID_SCALER_MAX_DIGITAL_ZOOM, mô tả hệ số thu phóng tối đa được hỗ trợ. Do đó, chiều rộng và chiều cao tối thiểu của vùng cắt là:
{width, height} = { floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[0] / ANDROID_SCALER_MAX_DIGITAL_ZOOM), floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[1] / ANDROID_SCALER_MAX_DIGITAL_ZOOM) }
Nếu vùng cắt cần đáp ứng các yêu cầu cụ thể (ví dụ: cần bắt đầu bằng các toạ độ chẵn và chiều rộng/chiều cao cần phải chẵn), thì HAL phải thực hiện việc làm tròn cần thiết và ghi ra vùng cắt cuối cùng được dùng trong siêu dữ liệu kết quả đầu ra. Tương tự, nếu HAL triển khai tính năng ổn định video, thì HAL phải điều chỉnh vùng cắt kết quả để mô tả vùng thực sự có trong đầu ra sau khi áp dụng tính năng ổn định video. Nhìn chung, một ứng dụng sử dụng camera phải có khả năng xác định trường nhìn mà ứng dụng đang nhận được dựa trên vùng cắt, kích thước của cảm biến hình ảnh và tiêu cự của ống kính.
Vì vùng cắt áp dụng cho tất cả các luồng (có thể có tỷ lệ khung hình khác với vùng cắt), nên vùng cảm biến chính xác được dùng cho mỗi luồng có thể nhỏ hơn vùng cắt. Cụ thể, mỗi luồng phát phải duy trì pixel vuông và tỷ lệ khung hình bằng cách cắt thêm tối thiểu vùng cắt đã xác định. Nếu tỷ lệ khung hình của luồng phát rộng hơn vùng cắt, thì luồng phát cần được cắt thêm theo chiều dọc. Nếu tỷ lệ khung hình của luồng phát hẹp hơn vùng cắt, thì luồng phát cần được cắt thêm theo chiều ngang.
Trong mọi trường hợp, vùng cắt của luồng phát phải nằm ở giữa vùng cắt đầy đủ và mỗi luồng phát chỉ được cắt theo chiều ngang hoặc chiều dọc so với vùng cắt đầy đủ, chứ không được cắt theo cả hai chiều.
Ví dụ: nếu bạn xác định 2 luồng, một luồng 640x480 (tỷ lệ khung hình 4:3) và một luồng 1280x720 (tỷ lệ khung hình 16:9), thì bên dưới đây minh hoạ các vùng đầu ra dự kiến cho mỗi luồng đối với một số vùng cắt mẫu, trên cảm biến 3 MP (mảng 2000 x 1500 pixel) giả định.
Vùng cắt: (500, 375, 1000, 750) (tỷ lệ khung hình 4:3)
Vùng cắt luồng phát 640x480: (500, 375, 1000, 750) (bằng với vùng cắt)
Vùng cắt luồng phát 1280x720: (500, 469, 1000, 562)

Hình 1. Tỷ lệ cỡ ảnh 4:3
Vùng cắt: (500, 375, 1333, 750) (tỷ lệ khung hình 16:9)
Vùng cắt luồng phát 640x480: (666, 375, 1000, 750)
Vùng cắt luồng phát 1280x720: (500, 375, 1333, 750) (bằng với vùng cắt)

Hình 2. Tỷ lệ khung hình 16:9
Vùng cắt: (500, 375, 750, 750) (tỷ lệ khung hình 1:1)
Vùng cắt luồng 640x480: (500, 469, 750, 562)
Vùng cắt luồng 1280x720: (500, 543, 750, 414)

Hình 3. Tỷ lệ khung hình 1:1
Ví dụ cuối cùng, một luồng có tỷ lệ khung hình vuông 1024x1024 thay vì luồng 480p:
Vùng cắt: (500, 375, 1000, 750) (tỷ lệ khung hình 4:3)
Vùng cắt luồng 1024x1024: (625, 375, 750, 750)
Vùng cắt luồng 1280x720: (500, 469, 1000, 562)

Hình 4. Tỷ lệ khung hình 4:3, hình vuông
Xử lý lại
Chúng tôi cung cấp thêm tính năng hỗ trợ cho các tệp hình ảnh thô bằng cách hỗ trợ xử lý lại dữ liệu RAW Bayer. Sự hỗ trợ này cho phép quy trình camera xử lý vùng đệm và siêu dữ liệu RAW đã chụp trước đó (toàn bộ khung hình đã được ghi trước đó) để tạo ra đầu ra YUV hoặc JPEG được kết xuất mới.
Zoom (thu phóng)
Đối với các thiết bị chạy Android 11 trở lên, ứng dụng có thể sử dụng tính năng thu phóng (kỹ thuật số và quang học) của camera thông qua chế độ cài đặt ANDROID_CONTROL_ZOOM_RATIO
.
Tỷ lệ thu phóng được xác định là một hệ số dấu phẩy động. Thay vì dùng ANDROID_SCALER_CROP_REGION
để cắt và thu phóng, ứng dụng có thể dùng ANDROID_CONTROL_ZOOM_RATIO
để kiểm soát mức thu phóng và dùng ANDROID_SCALER_CROP_REGION
để cắt theo chiều ngang và chiều dọc nhằm đạt được tỷ lệ khung hình khác với cảm biến camera gốc.
Hệ thống nhiều camera có thể chứa nhiều ống kính với các tiêu cự khác nhau và người dùng có thể sử dụng tính năng thu phóng quang học bằng cách chuyển đổi giữa các ống kính.
Việc sử dụng ANDROID_CONTROL_ZOOM_RATIO
mang lại lợi ích trong các trường hợp dưới đây:
- Thu phóng từ ống kính góc rộng sang ống kính tiêu cự dài: Tỷ lệ dấu phẩy động mang lại độ chính xác cao hơn so với các giá trị nguyên của
ANDROID_SCALER_CROP_REGION
. - Thu phóng từ ống kính góc rộng sang ống kính siêu rộng:
ANDROID_CONTROL_ZOOM_RATIO
hỗ trợ thu phóng (<1,0f) trong khiANDROID_SCALER_CROP_REGION
thì không.
Tỷ lệ thu phóng: 2.0; 1/4 trường nhìn ban đầu
Vùng cắt: (0, 0, 2000, 1500) (tỷ lệ khung hình 4:3)
Vùng cắt luồng 640x480: (0, 0, 2000, 1500) (bằng với vùng cắt)
Vùng cắt luồng 1280x720: (0, 187, 2000, 1125)

Hình 5. Thu phóng 2 lần, tỷ lệ khung hình 4:3
Tỷ lệ thu phóng: 2.0; 1/4 trường nhìn ban đầu
Vùng cắt: (0, 187, 2000, 1125) (tỷ lệ khung hình 16:9)
Vùng cắt luồng phát 640x480: (250, 187, 1500, 1125) (hiệu ứng hòm thư)
Vùng cắt luồng phát 1280x720: (0, 187, 2000, 1125) (bằng với vùng cắt)

Hình 6. Thu phóng 2.0, tỷ lệ khung hình 16:9
Tỷ lệ thu phóng: 0,5; gấp 4 lần góc nhìn ban đầu (chuyển từ ống kính góc rộng sang ống kính siêu rộng)
Vùng cắt: (250, 0, 1500, 1500) (tỷ lệ khung hình 1:1)
Vùng cắt luồng 640x480: (250, 187, 1500, 1125) (có hai thanh ngang trên dưới)
Vùng cắt luồng 1280x720: (250, 328, 1500, 844) (có hai thanh ngang trên dưới)

Hình 7. Thu phóng 0,5 lần, tỷ lệ khung hình 1:1
Như bạn thấy trong các biểu đồ ở trên, hệ toạ độ của vùng cắt sẽ thay đổi thành trường nhìn hiệu quả sau khi thu phóng và được biểu thị bằng hình chữ nhật có kích thước sau: (0
, 0
, activeArrayWith
, activeArrayHeight
). Điều này cũng áp dụng cho các vùng và khuôn mặt AE/AWB/AF. Thay đổi hệ toạ độ này không áp dụng cho ảnh chụp RAW và siêu dữ liệu liên quan, chẳng hạn như intrinsicCalibration
và lensShadingMap
.
Sử dụng ví dụ giả định tương tự ở trên và giả sử luồng đầu ra số 1 (640x480) là luồng khung ngắm, bạn có thể đạt được mức thu phóng 2, 0x theo một trong hai cách sau:
zoomRatio = 2.0
,scaler.cropRegion = (0, 0, 2000, 1500)
zoomRatio = 1.0
(mặc định),scaler.cropRegion = (500, 375, 1000, 750)
Để ứng dụng đặt android.control.aeRegions
thành 1/4 trên cùng bên trái của trường xem kính ngắm, hãy đặt android.control.aeRegions
thành (0, 0, 1000, 750)
với android.control.zoomRatio
được đặt thành 2.0
. Ngoài ra, ứng dụng có thể đặt android.control.aeRegions
thành khu vực tương đương của (500, 375, 1000, 750)
cho android.control.zoomRatio
của 1.0
.