自 2025 年 3 月 27 日起,我們建議您使用 android-latest-release
而非 aosp-main
建構及貢獻 AOSP。詳情請參閱「Android 開放原始碼計畫變更」。
程式攝影機控制參數
透過集合功能整理內容
你可以依據偏好儲存及分類內容。
在先前的 Extended View System (EVS) 1.0 版本中,攝影機裝置被視為唯讀裝置,因此沒有任何方法可讓應用程式變更攝影機控制參數,例如變焦或亮度。
這可能會限制 EVS 應用程式的功能,因此新版 EVS 1.1 推出了新方法,讓應用程式能夠編寫多個相機控制參數,這些參數皆在 enum CameraParam
中定義:
/**
* EVS Camera Parameter
*/
enum CameraParam : uint32_t {
/**
* The brightness of image frames
*/
BRIGHTNESS,
/**
* The contrast of image frames
*/
CONTRAST,
/**
* Automatic gain/exposure control
*/
AUTOGAIN,
/**
* Gain control
*/
GAIN,
/**
* Automatic Whitebalance
*/
AUTO_WHITE_BALANCE,
/**
* Manual white balance setting as a color temperature in Kelvin.
*/
WHITE_BALANCE_TEMPERATURE,
/**
* Image sharpness adjustment
*/
SHARPNESS,
/**
* Auto Exposure Control modes; auto, manual, shutter priority, or
* aperture priority.
*/
AUTO_EXPOSURE,
/**
* Manual exposure time of the camera
*/
ABSOLUTE_EXPOSURE,
/**
* Set the focal point of the camera to the specified position. This
* parameter may not be effective when auto focus is enabled.
*/
ABSOLUTE_FOCUS,
/**
* Enables continuous automatic focus adjustments.
*/
AUTO_FOCUS,
/**
* Specify the objective lens focal length as an absolute value.
*/
ABSOLUTE_ZOOM,
};
方法的定義如下:
/**
* Requests to be a master client.
*
* When multiple clients subscribe to a single camera hardware and one of
* them adjusts a camera parameter such as the contrast, it may disturb
* other clients' operations. Therefore, the client must call this method
* to be a master client. When it becomes a master, it can
* change camera parameters until either it dies or explicitly gives up the
* role.
*
* @return result EvsResult::OK if a master role is granted.
* EvsResult::OWNERSHIP_LOST if there is already a
* master client.
*/
setMaster() generates (EvsResult result);
/**
* Sets to be a master client forcibly.
*
* The client, which owns the display, has a high priority and can take over
* a master role from other clients without the display.
*
* @param display IEvsDisplay handle. If this is valid, the calling client
* is considered as the high priority client and therefore
* it would take over a master role.
*
* @return result EvsResult::OK if a master role is granted.
* EvsResult::OWNERSHIP_LOST if there is already a
* master client with the display.
*/
forceMaster(IEvsDisplay display) generates (EvsResult result);
/**
* Retires from a master client role.
*
* @return result EvsResult::OK if this call is successful.
* EvsResult::INVALID_ARG if the caller client is not a
* master client.
*/
unsetMaster() generates (EvsResult result);
/**
* Retrieves a list of parameters this camera supports.
*
* @return params A list of CameraParam that this camera supports.
*/
getParameterList() generates (vec<CameraParam> params);
/**
* Requests a valid value range of a camera parameter
*
* @param id The identifier of camera parameter, CameraParam enum.
*
* @return min The lower bound of the valid parameter value range.
* @return max The upper bound of the valid parameter value range.
* @return step The resolution of values in valid range.
*/
getIntParameterRange(CameraParam id)
generates (int32_t min, int32_t max, int32_t step);
/**
* Requests to set a camera parameter.
*
* @param id The identifier of camera parameter,
* CameraParam enum.
* value A desired parameter value.
* @return result EvsResult::OK if it succeeds to set a parameter.
* EvsResult::INVALID_ARG if either a requested
* parameter is not supported or a given value is out
* of bounds.
* effectiveValue A programmed parameter value. This may differ
* from what the client gives if, for example, the
* driver does not support a target parameter.
*/
setIntParameter(CameraParam id, int32_t value)
generates (EvsResult result, int32_t effectiveValue);
/**
* Retrieves a value of given camera parameter.
*
* @param id The identifier of camera parameter, CameraParam enum.
* @return result EvsResult::OK if it succeeds to read a parameter.
* EvsResult::INVALID_ARG if either a requested parameter is
* not supported.
* value A value of requested camera parameter.
*/
getIntParameter(CameraParam id) generates(EvsResult result, int32_t value);
getParameterList()
會傳回可供用戶端讀取及寫入的參數清單 (CameraParam
列舉) (如果用戶端是主機),而 getIntParameterRange()
會轉送有效值範圍和解析度。當主用戶端變更攝影機參數時,同一部攝影機硬體上的所有其他用戶端都會收到通知,並取得含有參數 ID 和新值的 PARAMETER_CHANGED
事件。
注意: 感應器驅動程式可能會以不同方式處理無效的參數值。它可能只會傳回錯誤代碼,或將值截斷在有效範圍內並套用。因此,setIntParameter()
方法會傳回有效值,用戶端可以使用這個值確認要求的處理方式。
要求在多個攝影機用戶端之間進行仲裁
由於先前的 EVS 設計允許多個應用程式同時訂閱單一相機硬體,因此一個應用程式可能會透過變更相機參數,干擾其他應用程式的運作。此外,多個用戶端可能會以不同方式調整相同的參數,進而導致執行中攝影機服務出現非預期的行為。
為避免發生這類問題,EVS 管理員只允許主控用戶端編寫攝影機參數。在嘗試調整任何攝影機參數之前,用戶端必須透過呼叫 setMaster()
方法成為主用戶端。如果失敗,表示該攝影機硬體上已存在有效的主控端。在目前的主用戶端停止運作,或明確透過 unsetMaster()
放棄主用戶端角色之前,其他用戶端都無法變更攝影機參數。主用戶端傳回其權限時,所有其他應用程式都會收到 MASTER_RELEASED
事件的通知。
優先順序較高的用戶端
EVS 管理員會處理擁有高優先順序的顯示器的用戶端,並允許該用戶端從目前的主控台竊取主控台角色。由於 EVS 顯示擁有權是根據最近一次使用決定,因此新客戶甚至可以透過顯示器接管現有客戶。
高優先順序的用戶端必須呼叫 IEvsCamera::forceMaster(sp<IEvsDisplay>& display)
才能取得主控角色。EVS 管理員會檢查指定顯示器句柄的狀態,如果 (且僅當) 其狀態有效,且 DisplayState::NOT_OPEN
和 DisplayState::DEAD
都未取代主控台。剛失去主控角色的用戶端會收到 MASTER_RELEASED
事件通知,且必須妥善處理這項事件。
這個頁面中的內容和程式碼範例均受《內容授權》中的授權所規範。Java 與 OpenJDK 是 Oracle 和/或其關係企業的商標或註冊商標。
上次更新時間:2025-07-27 (世界標準時間)。
[[["容易理解","easyToUnderstand","thumb-up"],["確實解決了我的問題","solvedMyProblem","thumb-up"],["其他","otherUp","thumb-up"]],[["缺少我需要的資訊","missingTheInformationINeed","thumb-down"],["過於複雜/步驟過多","tooComplicatedTooManySteps","thumb-down"],["過時","outOfDate","thumb-down"],["翻譯問題","translationIssue","thumb-down"],["示例/程式碼問題","samplesCodeIssue","thumb-down"],["其他","otherDown","thumb-down"]],["上次更新時間:2025-07-27 (世界標準時間)。"],[],[],null,["# Program camera control parameters\n\nIn the previous Extended View System (EVS) 1.0 release, camera devices were\nconsidered read-only devices and, therefore, no method existed that would enable\nthe app to change camera control parameters such as zoom or brightness.\n\nAs this could constrain the capability of EVS apps, the new EVS 1.1\nintroduces new methods and enables the app to program several camera\ncontrol parameters, all of which are defined in `enum CameraParam`: \n\n```gdscript\n/**\n * EVS Camera Parameter\n */\nenum CameraParam : uint32_t {\n /**\n * The brightness of image frames\n */\n BRIGHTNESS,\n /**\n * The contrast of image frames\n */\n CONTRAST,\n /**\n * Automatic gain/exposure control\n */\n AUTOGAIN,\n /**\n * Gain control\n */\n GAIN,\n /**\n * Automatic Whitebalance\n */\n AUTO_WHITE_BALANCE,\n /**\n * Manual white balance setting as a color temperature in Kelvin.\n */\n WHITE_BALANCE_TEMPERATURE,\n /**\n * Image sharpness adjustment\n */\n SHARPNESS,\n /**\n * Auto Exposure Control modes; auto, manual, shutter priority, or\n * aperture priority.\n */\n AUTO_EXPOSURE,\n /**\n * Manual exposure time of the camera\n */\n ABSOLUTE_EXPOSURE,\n /**\n * Set the focal point of the camera to the specified position. This\n * parameter may not be effective when auto focus is enabled.\n */\n ABSOLUTE_FOCUS,\n /**\n * Enables continuous automatic focus adjustments.\n */\n AUTO_FOCUS,\n /**\n * Specify the objective lens focal length as an absolute value.\n */\n ABSOLUTE_ZOOM,\n};\n```\n\nMethods are defined as: \n\n```gdscript\n/**\n * Requests to be a master client.\n *\n * When multiple clients subscribe to a single camera hardware and one of\n * them adjusts a camera parameter such as the contrast, it may disturb\n * other clients' operations. Therefore, the client must call this method\n * to be a master client. When it becomes a master, it can\n * change camera parameters until either it dies or explicitly gives up the\n * role.\n *\n * @return result EvsResult::OK if a master role is granted.\n * EvsResult::OWNERSHIP_LOST if there is already a\n * master client.\n */\nsetMaster() generates (EvsResult result);\n\n/**\n * Sets to be a master client forcibly.\n *\n * The client, which owns the display, has a high priority and can take over\n * a master role from other clients without the display.\n *\n * @param display IEvsDisplay handle. If this is valid, the calling client\n * is considered as the high priority client and therefore\n * it would take over a master role.\n *\n * @return result EvsResult::OK if a master role is granted.\n * EvsResult::OWNERSHIP_LOST if there is already a\n * master client with the display.\n */\nforceMaster(IEvsDisplay display) generates (EvsResult result);\n\n/**\n * Retires from a master client role.\n *\n * @return result EvsResult::OK if this call is successful.\n * EvsResult::INVALID_ARG if the caller client is not a\n * master client.\n */\nunsetMaster() generates (EvsResult result);\n\n/**\n * Retrieves a list of parameters this camera supports.\n *\n * @return params A list of CameraParam that this camera supports.\n */\ngetParameterList() generates (vec\u003cCameraParam\u003e params);\n\n/**\n * Requests a valid value range of a camera parameter\n *\n * @param id The identifier of camera parameter, CameraParam enum.\n *\n * @return min The lower bound of the valid parameter value range.\n * @return max The upper bound of the valid parameter value range.\n * @return step The resolution of values in valid range.\n */\ngetIntParameterRange(CameraParam id)\n generates (int32_t min, int32_t max, int32_t step);\n\n/**\n * Requests to set a camera parameter.\n *\n * @param id The identifier of camera parameter,\n * CameraParam enum.\n * value A desired parameter value.\n * @return result EvsResult::OK if it succeeds to set a parameter.\n * EvsResult::INVALID_ARG if either a requested\n * parameter is not supported or a given value is out\n * of bounds.\n * effectiveValue A programmed parameter value. This may differ\n * from what the client gives if, for example, the\n * driver does not support a target parameter.\n */\nsetIntParameter(CameraParam id, int32_t value)\n generates (EvsResult result, int32_t effectiveValue);\n\n/**\n * Retrieves a value of given camera parameter.\n *\n * @param id The identifier of camera parameter, CameraParam enum.\n * @return result EvsResult::OK if it succeeds to read a parameter.\n * EvsResult::INVALID_ARG if either a requested parameter is\n * not supported.\n * value A value of requested camera parameter.\n */\ngetIntParameter(CameraParam id) generates(EvsResult result, int32_t value);\n```\n\n`getParameterList()` returns a list of parameters\n(`CameraParam` enum) a client can read and write (if the client is a master),\nand `getIntParameterRange()` relays the valid value range and resolution.\nWhen a master client changes a camera parameter, all other clients on the same camera\nhardware are notified by getting a `PARAMETER_CHANGED` event with a\nparameter ID and new value.\n\n**Note:** The sensor driver may handle invalid parameter\nvalues differently. It may simply return an error code or clip the value in the\nvalid range and apply. Therefore, the `setIntParameter()` method returns\nan effective value and the client can use this value to confirm how the request was\nhandled.\n\nRequest arbitration between multiple camera clients\n---------------------------------------------------\n\nBecause the previous EVS design allowed multiple apps to simultaneously\nsubscribe to a single camera hardware, it is possible that one app can\ndisturb the operations of other apps by changing a camera parameter. Also,\nmultiple clients may want to adjust the same parameter differently and thereby\ncause unexpected behaviors in running camera services.\n\nTo avoid such problems, the EVS manager allows that only *master* client\nto program a camera parameter. Before trying to adjust any camera parameter, the client\n**MUST** become a master client by calling the `setMaster()`\nmethod. If this fails, then it means there is already an active master client\non that camera hardware. Until the current master client dies, or explicitly\ngives up a master role through `unsetMaster()`, no other client is\npermitted to change a camera parameter. When a master client returns its privilege,\nall other apps are notified by a `MASTER_RELEASED` event.\n\n### Clients with high priority\n\nThe EVS manager handles the client that owns the display with the high\npriority and allows it to steal a master role from a current master. Because EVS\ndisplay ownership is based on recency, the new client can even take over from the\ncurrent client with the display.\n\nHigh priority clients must call `IEvsCamera::forceMaster(sp\u003cIEvsDisplay\u003e& display)`\nto attain a master role. The EVS manager examines the state of a given display\nhandle and, if (*and only if* ) its state is valid and neither\n`DisplayState::NOT_OPEN` nor `DisplayState::DEAD`\nreplaces a master. The client, which just loses the master role, is\nnotified by a `MASTER_RELEASED` event and **MUST** handle\nthis properly."]]