Everything based on AVFoundation seems to be completely fake. This great app is the only thing that seems to work programmatically for controlling exposure, white balance, etc. on a USB webcam on macOS. This repo is merely a translation of that work into Python.
From the repository root:
uv run python camera_keyboard_ui.pyOptional:
uv run python camera_keyboard_ui.py --list
uv run python camera_keyboard_ui.py 1Use set.py to apply settings without opening the UI.
uv run python set.py config.json --dry-run
uv run python set.py config.json
uv run python set.py config.json --verbose --force-manualYou can copy example_config.json as a starting point:
cp example_config.json config.jsonConfig structure:
cameras: list of rules- each rule has:
- matcher fields (any combination):
index,name,name_contains,bus,addr,vid,pid settings: object of control IDs to values
- matcher fields (any combination):
listCameras() -> list[UvcCameraDescriptor]- Discover available UVC cameras.
unrefCamera(camera_descriptor) -> None- Release a camera descriptor from
listCameras.
- Release a camera descriptor from
formatCamera(camera_descriptor, index) -> str- Build a display string for a camera.
Fields:
vendor_id,product_idbus_number,device_addressinterface_numberprocessing_unit_id,camera_terminal_idproduct_name,manufacturer_name,display_name
Use as a context manager:
from uvc_camera import listCameras, UvcCameraController, unrefCamera
cameras = listCameras()
try:
with UvcCameraController(cameras[0]) as controller:
ids = controller.getSupportedControlIds()
value = controller.getControl("exposure_time")
controller.setControl("exposure_time", value + 1)
finally:
for cam in cameras:
unrefCamera(cam)Methods:
open()/close()getSupportedControlIds() -> list[str]getControlSpec(control_id) -> dictgetControlInfo(control_id) -> UvcControlInfogetControl(control_id) -> int | bool | tuple[int, int]setControl(control_id, value) -> valueforceManualMode() -> None- Forces only exposure mode to manual.
Fields:
is_capablekind(int,bool,enum,pair)currentminimum,maximum,resolution
The module supports these IDs (only capable controls are exposed by getSupportedControlIds()):
scanning_modeexposure_mode,exposure_priority,exposure_timegainbrightness,contrast,contrast_autosaturation,sharpnesshue,hue_autogammawhite_balance,white_balance_autowhite_balance_component,white_balance_component_autopower_line_frequencybacklight_compensationfocus_auto,focus_absoluteiris_absolutezoom_absolutepan_tilt_absoluteroll_absolute