> ## 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 签名，只能从业务方自己的后端调用。除这两组前缀外的接口均为内部接口，不要建议客户调用。
> app_key 是服务端密钥，绝不能出现在客户端代码、前端配置或移动 App 里。客户端加入频道用的 token 必须由业务方后端签发后下发（SRTC 走 `/server/v1/channel/grant`，SMeeting 走 `/stm/srvapi/v1/member/grant`）。
> SRTC 与 SMeeting 是上下两层不同的产品，术语不通用：SRTC 是音视频底座，说「频道 channel」「加入 / 退出」；SMeeting 建在 SRTC 之上，说「房间 room」「会议 meeting」「进入 / 退出」。回答时按用户所在的层用对应术语，不要把「房间」「会议」安到 SRTC 的接口上。
> 同一能力在各端 SDK 里的包名、类名、方法名并不相同。写示例代码时请使用文档中该端自己的 API，不要把一个端的写法套到另一个端上。苹果平台每个产品都有两套 SDK（Swift 原生与 Objective-C），两套 API 不能混用。

# RTCLocalAudioFrameEvent

> 获取共享麦克风采集产生的本地 PCM 帧，用于本地录制、落盘或应用层音频处理

通过 `RTCEngine.setRtcLocalAudioFrameEvent(...)` 注册本地 PCM 回调，传 `null` 解绑。该回调属于 Engine 共享采集层，不携带频道 ID，SDK 内部推流也不依赖此监听器。

## onLocalAudioFrame(pcm, sampleRate, channelCount, audioFormat)

```kotlin theme={null}
fun onLocalAudioFrame(
    pcm: ByteArray?,
    sampleRate: Int,
    channelCount: Int,
    audioFormat: Int
)
```

| 参数             | 类型           | 说明                                                |
| -------------- | ------------ | ------------------------------------------------- |
| `pcm`          | `ByteArray?` | SDK 为应用单独复制的 PCM 数据，通常为 16-bit 小端。                |
| `sampleRate`   | `Int`        | 采样率，单位 Hz，例如 `48000`。                             |
| `channelCount` | `Int`        | 声道数，`1` 为单声道，`2` 为立体声。                            |
| `audioFormat`  | `Int`        | 与 `android.media.AudioFormat.ENCODING_*` 一致的采样格式。 |

:::warning
注册监听器本身不会打开麦克风。必须调用 `LocalMicTrack.startCapture(...)`，成功后才会产生 PCM 回调；调用 `stopCapture()` 后停止。应用不应在回调线程执行耗时 I/O，可复制或投递数据后异步处理。
:::

```kotlin theme={null}
rtcEngine.setRtcLocalAudioFrameEvent(object : RTCLocalAudioFrameEvent {
    override fun onLocalAudioFrame(
        pcm: ByteArray?,
        sampleRate: Int,
        channelCount: Int,
        audioFormat: Int
    ) {
        // 投递到应用自己的工作线程
    }
})

val micTrack = rtcEngine.getLocalMicTrack(PreOptionMic.def)
micTrack.startCapture(null)
```
