# Best practices These recommendations help you ship a polished video experience with the Video SDK for Linux. ## Camera access and selection On Linux, the SDK captures from cameras exposed through V4L2. On machines with more than one camera, don't assume the default is correct. - Confirm at least one camera is present with `getNumberOfCameras` before calling `startVideo`. - Let the user choose a camera, or select a known device by ID. For details, see [Camera controls](/docs/video-sdk/linux/video/camera-controls/). ## Manage subscriptions for rendering You render remote video by subscribing to each user's raw video pipe. On a busy session, subscriptions are the main driver of CPU and bandwidth cost. - Subscribe only to the users you are actually displaying. Unsubscribe from a user's pipe as soon as their tile leaves the screen. - Match the subscription resolution to the size you render at. Subscribing at a higher resolution than you display wastes decode time. - Add and remove subscriptions in response to `onUserJoin` and `onUserLeave`. For details, see [Receive raw data](/docs/video-sdk/linux/raw-data/receive-raw-data/). ## Show video status in your UI Render each user's video on/off state from their `ZoomVideoSDKVideoStatus`, and update it when [`onUserVideoStatusChanged`](/docs/video-sdk/linux/video/video-events/#user-video-status) fires, so participants can tell who has their camera on. ## Headless and server deployments Many Linux Video SDK apps run headless, for example a bot or recorder deployed to a cloud host. - A headless host usually has no physical camera. To send video without a camera, provide a custom video source rather than calling `startVideo` against hardware. For details, see [Send raw data](/docs/video-sdk/linux/raw-data/send-raw-data/). - To process or record remote video, subscribe to each user's raw video pipe and handle the YUV frames directly rather than rendering to a display. ## Manage quality under limited bandwidth When bandwidth is constrained, set a video quality preference so the SDK trades resolution against frame rate in the way that suits your content. For details, see [Manage video quality](/docs/video-sdk/linux/video/video-quality/).