Luồng đầu ra
Hệ thống con máy ảnh chỉ hoạt động trên quy trình dựa trên ANativeWindow cho tất 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 mục tiêu như GPU, bộ mã hoá video, RenderScript hoặc vùng đệm hiển thị ứng dụng (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 trước các luồng đầu ra này và chỉ có thể có một số lượng hạn chế cùng một lúc. Điều này cho phép phân bổ trước vùng đệm bộ nhớ và cấu hình của phần cứng máy ảnh. Nhờ đó, khi yêu cầu được gửi kèm theo nhiều quy trình đầu ra hoặc có nhiều quy trình đầu ra được liệt kê, sẽ không bị chậm trễ hoặc có độ trễ khi 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 phụ 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à mong muốn có FOV nhỏ hơn) được thông báo 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. Đây là yếu tố quan trọng để triển khai tính năng thu phóng kỹ thuật số mượt mà.
Vùng đượ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 này được xác định trên hệ toạ độ của mảng pixel hoạt động của cảm biến, với (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 được 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ụ: vùng cắt cần bắt đầu ở các toạ độ chẵn và chiều rộng/chiều cao của vùng cắt cần phải là số chẵn), thì HAL phải làm tròn số cần thiết và ghi vùng cắt cuối cùng được sử dụng trong siêu dữ liệu kết quả đầu ra. Tương tự, nếu triển khai tính năng ổn định video, 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, ứng dụng sử dụng máy ảnh 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 dùng cho mỗi luồng có thể nhỏ hơn vùng cắt. Cụ thể, mỗi luồng phải duy trì pixel hình vuông và tỷ lệ khung hình bằng cách cắt bớt vùng cắt đã xác định ở mức tối thiểu. Nếu tỷ lệ khung hình của luồng rộng hơn vùng bị cắt, bạn nên cắt thêm luồng theo chiều dọc và nếu tỷ lệ khung hình của luồng hẹp hơn vùng bị cắt, thì bạn nên cắt thêm luồng theo chiều ngang.
Trong mọi trường hợp, phần cắt trong luồng phải được căn giữa trong vùng cắt toàn bộ và mỗi trình phát trực tiếp chỉ được cắt theo chiều ngang hoặc chiều dọc so với vùng cắt toàn bộ, chứ không được cắt cả hai.
Ví dụ: nếu hai luồng được xác định, một luồng 640x480 (khung hình 4:3) và một luồng 1280x720 (khung hình 16:9), thì dưới đây là các vùng đầu ra dự kiến cho mỗi luồng của một vài vùng cắt mẫu, trên cảm biến giả định 3 MP (2000 x 1500 pixel).
Vùng cắt: (500, 375, 1000, 750) (tỷ lệ khung hình 4:3)
Cắt luồng 640x480: (500, 375, 1000, 750) (bằng với vùng cắt)
Cắt luồng 1280x720: (500, 469, 1000, 562)
Vùng cắt: (500, 375, 1333, 750) (tỷ lệ khung hình 16:9)
Cắt luồng 640x480: (666, 375, 1000, 750)
Cắt luồng 1280x720: (500, 375, 1333, 750) (bằng với vùng cắt)
Vùng cắt: (500, 375, 750, 750) (tỷ lệ khung hình 1:1)
Cắt luồng 640x480: (500, 469, 750, 562)
Cắt luồng 1280x720: (500, 543, 750, 414)
Và ví dụ cuối cùng, luồng phát có tỷ lệ khung hình vuông 1024x1024 thay vì luồng phát 480p:
Vùng cắt: (500, 375, 1000, 750) (tỷ lệ khung hình 4:3)
Luồng phát cắt 1024x1024: (625, 375, 750, 750)
Luồng phát cắt 1280x720: (500, 469, 1000, 562)
Xử lý lại
Hỗ trợ bổ sung cho các tệp hình ảnh thô được cung cấp bằng cách hỗ trợ xử lý lại dữ liệu Bayer thô. Sự hỗ trợ này cho phép quy trình máy ảnh xử lý siêu dữ liệu và vùng đệm RAW đã chụp trước đó (toàn bộ khung hình được ghi lại trước đó) để tạo ra đầu ra YUV hoặc JPEG mới được kết xuất.
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 của máy ảnh (kỹ thuật số và quang học) thông qua chế độ cài đặt ANDROID_CONTROL_ZOOM_RATIO
.
Tỷ lệ thu phóng được xác định là 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 cũng như sử 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 gốc của máy ảnh.
Hệ thống nhiều máy ảnh có thể chứa nhiều ống kính với 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 sau:
- Phóng to từ ống kính rộng đến ống kính tiêu cự dài: Tỷ lệ dấu phẩy động cung cấp độ chính xác cao hơn so với các giá trị số nguyên của
ANDROID_SCALER_CROP_REGION
. - Thu nhỏ từ ống kính rộng đến ống kính siêu rộng:
ANDROID_CONTROL_ZOOM_RATIO
hỗ trợ thu nhỏ (<1,0f) trong khiANDROID_SCALER_CROP_REGION
thì không.
Tỷ lệ thu phóng: 2,0; 1/4 trường nhìn gốc
Vùng cắt: (0, 0, 2000, 1500) (tỷ lệ khung hình 4:3)
Cắt luồng 640x480: (0, 0, 2000, 1500) (bằng với vùng cắt)
Cắt luồng 1280x720: (0, 187, 2000, 1125)
Tỷ lệ thu phóng: 2,0; 1/4 trường nhìn gốc
Vùng cắt: (0, 187, 2000, 1125) (tỷ lệ khung hình 16:9)
Ảnh cắt 640x480 trong luồng: (250, 187, 1500, 1125) (vùng cột cắt bằng 2, 0,2 ảnh, 0,0
Tỷ lệ thu phóng: 0,5; 4 lần trường nhìn ban đầu (chuyển từ ống kính rộng sang ống kính siêu rộng)
Khu vực cắt: (250, 0, 1500, 1500) (tỷ lệ khung hình 1:1)
Cắt luồng 640x480: (250, 187, 1500, 1125) (hình hòm thư)
Cắt luồng 1280x720: (250, 328, 1500, 844) (hình hòm thư)
Như đã 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ó cá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 tính năng chụp RAW và siêu dữ liệu liên quan, chẳng hạn như intrinsicCalibration
và lensShadingMap
.
Sử dụng cùng một ví dụ giả định ở trên và giả sử luồng đầu ra #1 (640x480) là luồng kính ngắm, bạn có thể 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 góc trên cùng bên trái của trường nhìn của kính ngắm, hãy đặt android.control.aeRegions
thành (0, 0, 1000, 750)
và đặt android.control.zoomRatio
thành 2.0
. Ngoài ra, ứng dụng có thể đặt android.control.aeRegions
thành vùng tương đương của (500, 375, 1000, 750)
cho android.control.zoomRatio
của 1.0
.