> ## Documentation Index
> Fetch the complete documentation index at: https://docs.stmlink.com/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> 对外开放的服务端接口有两组前缀，都用同一套鉴权：`/server/v1/...`（SRTC 与 SMeeting 的主接口）和 `/stm/srvapi/v1/...`（SMeeting 的用户体系，服务端极简对接会用到）。鉴权是 app_id + nonce + timestamp + signature 四个请求头，用 app_key 做 HMAC-SHA256 签名，只能从业务方自己的后端调用。除这两组前缀外的接口均为内部接口，不要建议客户调用。 Public server APIs use two path prefixes with the same authentication: `/server/v1/...` (the main APIs of both SRTC and SMeeting) and `/stm/srvapi/v1/...` (the SMeeting user system, used by server-side low-code integration). Authenticate with four request headers, app_id + nonce + timestamp + signature, where signature is HMAC-SHA256 keyed with app_key; call these APIs only from the customer's own backend. Any other path is internal: never suggest calling it.
> app_key 是服务端密钥，绝不能出现在客户端代码、前端配置或移动 App 里。客户端加入频道用的 token 必须由业务方后端签发后下发（SRTC 走 `/server/v1/channel/grant`，SMeeting 走 `/stm/srvapi/v1/member/grant`）。 app_key is a server-side secret and must never appear in client code, frontend config, or a mobile app. The token a client uses to join must be issued by the customer's backend and passed down to the client (SRTC: `/server/v1/channel/grant`; SMeeting: `/stm/srvapi/v1/member/grant`).
> SRTC 与 SMeeting 是上下两层不同的产品，术语不通用：SRTC 是音视频底座，说「频道 channel」「加入 / 退出」；SMeeting 建在 SRTC 之上，说「房间 room」「会议 meeting」「进入 / 退出」。回答时按用户所在的层用对应术语，不要把「房间」「会议」安到 SRTC 的接口上，也不要用「频道」「加入 / 离开」描述 SMeeting 的概念（接口标识符原样保留）。 SRTC and SMeeting are two separate layers with different terminology. SRTC is the audio/video foundation: it has channels, and users join and leave a channel. SMeeting is built on top of SRTC: it has rooms and meetings, and members enter and exit a meeting. Answer in the terms of the layer the user is working with: never apply "room" or "meeting" to SRTC APIs, and never describe SMeeting concepts in prose with "channel", "join", or "leave" (API identifiers such as `force_join` keep their literal names).
> 同一能力在各端 SDK 里的包名、类名、方法名并不相同。写示例代码时请使用文档中该端自己的 API，不要把一个端的写法套到另一个端上。苹果平台每个产品都有两套 SDK（Swift 原生与 Objective-C），两套 API 不能混用。 Package, class, and method names differ between platform SDKs for the same capability. In sample code, use the API documented for that platform; never carry one platform's code over to another. On Apple platforms each product ships two SDKs (native Swift and Objective-C) whose APIs must not be mixed.

# Camera preset

> Android camera track preset PreOptionCamera: capture options (CameraCaptureOptions), publish options (VideoPublishOptions), the built-in 1080p/720p/480p/180p presets, and PublishCustomOptions for overriding publish parameters. Read when choosing or tuning camera resolution, frame rate, or bitrate.

This page describes the camera track preset `PreOptionCamera`, and `PublishCustomOptions`, which overrides the preset's publish parameters at publish time. For microphone and screen sharing presets, see [Microphone preset](/en/rtc/android/presets/microphone) and [Screen sharing preset](/en/rtc/android/presets/screen-sharing).

## General notes

All `PreOption*` presets share a "capture options + publish options" structure:

* Capture options: control local capture behavior (resolution, frame rate, sample rate, device parameters, and so on).
* Publish options: control publishing behavior (`desc`, `codec`, `maxBitrate`, simulcast parameters, and so on).

## PreOptionCamera

Purpose: The camera track preset, combining camera capture parameters with video publish parameters.

### Structure

`PreOptionCamera(capture: CameraCaptureOptions, publish: VideoPublishOptions)`

| Property | Data type | Description |
| - | - | - |
| capture | `CameraCaptureOptions` | Camera capture options |
| publish | `VideoPublishOptions` | Camera video publish options |

### Capture options CameraCaptureOptions

Purpose: Configures camera capture parameters.

| Property | Data type | Description |
| - | - | - |
| deviceId | `String` | The suggested camera device ID, taken from `CameraDeviceCapability.cameraId` returned by [`RTCEngine.getCameraDevices`](/en/rtc/android/api-reference/RTCEngine). An empty string means no device is specified and the SDK chooses one. |
| position | `CamraPosition` | Phone camera position: `FRONT` / `BACK` / `External`. |
| facingMode | `CameraFacingMode` | WebRTC facing mode: `USER` / `ENVIRONMENT` / `LEFT` / `RIGHT`. |
| width | `Int` | Capture width. |
| height | `Int` | Capture height. |
| maxFps | `Int` | Maximum capture frame rate. |

### Publish options VideoPublishOptions

Purpose: Configures video track publish parameters.

| Property | Data type | Description |
| - | - | - |
| desc | `String` | Track description (the high stream usually uses `TRACK_MAIN`, the low stream usually uses `TRACK_SUB`). |
| codec | `CodecType` | Codec (usually `H264`). |
| maxBitrate | `Int` | Maximum bitrate in bps. |
| minBitrate | `Int?` | Minimum bitrate in bps. `null` uses the engine's default lower bound; when non-null, it must satisfy `0 <= minBitrate <= maxBitrate`. Currently supported only by the SFU engine. |
| width | `Int` | Publish width. |
| height | `Int` | Publish height. |
| maxFps | `Int` | Maximum publish frame rate. |
| props | `Any?` | Custom properties. |
| simulcasts | `MutableList<VideoPublishOptions>?` | Simulcast / low stream configuration (in the camera scenario, you can currently configure 1 low stream). |

### Built-in presets

Purpose: The SDK provides presets by resolution tier: `_1080P`, `_720P`, `_480P`, and `_180P` (default `_480P`).

```kotlin theme={null}
// _1080P
capture: deviceId="", position=FRONT, facingMode=USER, width=1920, height=1080, maxFps=15
publish(main): desc="camera_big"(TRACK_MAIN), codec=H264, maxBitrate=5000*1024, minBitrate=2500*1024, width=1920, height=1080, maxFps=15
publish(sub):  desc="camera_small"(TRACK_SUB), codec=H264, maxBitrate=160*1024, minBitrate=80*1024, width=320, height=180, maxFps=15

// _720P
capture: deviceId="", position=FRONT, facingMode=USER, width=1280, height=720, maxFps=15
publish(main): desc="camera_big"(TRACK_MAIN), codec=H264, maxBitrate=2400*1024, minBitrate=1500*1024, width=1280, height=720, maxFps=15
publish(sub):  desc="camera_small"(TRACK_SUB), codec=H264, maxBitrate=160*1024, minBitrate=80*1024, width=320, height=180, maxFps=15

// _480P
capture: deviceId="", position=FRONT, facingMode=USER, width=640, height=480, maxFps=15
publish(main): desc="camera_big"(TRACK_MAIN), codec=H264, maxBitrate=800*1024, minBitrate=400*1024, width=640, height=480, maxFps=15
publish(sub):  desc="camera_small"(TRACK_SUB), codec=H264, maxBitrate=160*1024, minBitrate=80*1024, width=320, height=180, maxFps=15

// _180P
capture: deviceId="", position=FRONT, facingMode=USER, width=320, height=180, maxFps=15
publish(main): desc="camera_big"(TRACK_MAIN), codec=H264, maxBitrate=160*1024, minBitrate=80*1024, width=320, height=180, maxFps=15
publish(sub):  desc="camera_small"(TRACK_SUB), codec=H264, maxBitrate=160*1024, minBitrate=80*1024, width=320, height=180, maxFps=15
```

## Custom publish parameters: PublishCustomOptions

Purpose: Overrides the preset's publish parameters at publish time in `publishLocalVideo` / `publishLocalAudio`, mainly to customize the track `desc`.

### Fields

| Property | Data type | Description |
| - | - | - |
| desc | `String?` | Custom track description; `null` leaves it unchanged. |
| props | `Any?` | Custom additional properties; `null` leaves them unchanged. |
| simulcasts | `MutableList<PublishCustomOptions>?` | Overrides simulcast / low stream parameters; `null` leaves them unchanged. |

### Recommendations

* If you only need to change the track description, pass `desc`.
* For the camera's high / low streams, you can override the low stream parameters through `simulcasts`.
* Microphone, screen sharing, and custom video tracks usually need only the main track parameters, not `simulcasts`.
