# 代码变更：BUG-fcf18718-350b-49ca-a430-9582e554efda

## 修改文件

### `src/h5/input/video/VideoInputVideoFrame.ts`

#### 修改 1：构造函数（行 ~34）

**修改内容**：创建 processor 前 clone track

```typescript
// 修改前
this.track = stream.getVideoTracks()[0];

// 修改后
// bugfix: clone track 避免多实例共享同一 track 时多个 processor 竞争帧数据导致黑屏
this.track = stream.getVideoTracks()[0].clone();
```

#### 修改 2：`updateNode` 方法（行 ~185）

**修改内容**：更新输入时停止旧 cloned track，新 track 也用 clone

```typescript
// 修改前
this.track = src.getVideoTracks()[0];

// 修改后
// bugfix: 停止旧的 cloned track，释放资源
if (this.track) {
  this.track.stop();
}
// bugfix: clone track 避免多实例共享同一 track 时多个 processor 竞争帧数据
this.track = src.getVideoTracks()[0].clone();
```

#### 修改 3：`destroy` 方法（行 ~228）

**修改内容**：destroy 时停止 cloned track

```typescript
destroy() {
  this.stopSizeMonitoring();
  this.sizeChangeCallbacks = [];
  // bugfix: 停止 cloned track，释放对原始 track 帧数据的消费
  if (this.track) {
    this.track.stop();
  }
}
```

## 修改原因

多个 SDK 实例共享同一个 MediaStreamTrack 时，每个实例都会对该 track 创建 `MediaStreamTrackProcessor`。多个 processor 竞争消费同一 track 的帧数据，导致部分实例的 generator 虽然 readyState=live 但实际无帧写入 → 黑屏。

通过 `track.clone()` 让每个实例获得独立的 track 副本，各自的 processor 独立消费互不干扰。

## 兼容性说明

- `MediaStreamTrack.clone()` 是标准 API，所有现代浏览器均支持
- clone 后的 track 保留原始 track 的所有 settings（deviceId、width、height、frameRate 等）
- clone track 在 stop() 时不会影响原始 track，原始 track 由客户自行管理
- `CameraInputVideoFrame` 不需要修改，因为它自己创建的流不存在多实例共享问题
- `updateNode` 中停止旧 clone 确保不会泄露资源
