# WebRTC Demo

## 简介

本示例介绍如何使用WebRTC协议在K230板子上实现实时视频推流到浏览器。通过以下示例，您将学习如何使用libpeer库的API接口搭建WebRTC服务，将板端摄像头采集的画面经硬件H.264编码后实时推流到浏览器，实现低延迟的局域网视频传输。

- **WebRTC LAN Camera**: 介绍如何将板子上的sensor画面通过WebRTC协议推流到浏览器，同时支持LCD/HDMI本地预览。板端内置HTTP信令服务器和Web UI页面，浏览器访问即可一键连接查看实时画面。

## 使用说明

### 代码位置

- **WebRTC Demo**：`/src/rtsmart/examples/mpp/sample_webrtc`

假设 demo 已正确编译，启动开发板后进入 `/sdcard/app/examples/mpp` 目录，您将看到以下可执行文件：

- `sample_webrtc.elf`：对应 WebRTC LAN Camera demo

确保该文件存在并且已正确编译，以便在开发板上运行相应的示例程序。

### 编译配置

使用 `make menuconfig` 启用 libpeer 和 sample_webrtc：

```text
RT-Smart UserSpace Libraries Configuration  →  Enable Build libpeer (WebRTC)  = Y
RT-Smart UserSpace Examples Configuration   →  Enable MPP examples           = Y
                                               →  Enable Build sample_webrtc   = Y
```

## 示例

### 示例1: WebRTC LAN Camera

该示例介绍了如何使用WebRTC协议实时将板子上的sensor画面推流到浏览器。板端启动HTTP信令服务器，浏览器访问内置Web页面即可自动完成SDP协商并建立WebRTC连接，实现实时视频传输。

#### 架构说明

```text
VICAP (摄像头)
  ├── CHN0 ──bind──> VO (LCD/HDMI 预览)
  └── CHN1 ──bind──> VENC (H.264) ──> WebRTC ──> 浏览器
                                          ▲
                                   HTTP 信令 (offer/answer)
```

数据流程：

1. VICAP采集摄像头画面，CHN0绑定到VO用于本地预览，CHN1绑定到VENC进行H.264编码。
2. VENC输出的H.264码流帧通过 `peer_connection_send_video()` 发送到WebRTC对端。
3. HTTP信令服务器处理浏览器的SDP offer/answer交换，完成WebRTC连接建立。

#### 参数说明

| 参数名 | 描述 | 参数范围 | 默认值 |
|:--|:--|:--|:--|
| p | HTTP服务器端口 | - | 8080 |
| s | CSI设备号 | 0-2 | 2 |
| c | 显示接口类型 | 605274512=LCD, 757006876=HDMI | LCD (605274512) |
| W | 视频编码宽度 | `[128, 1920]` | 1280 |
| H | 视频编码高度 | `[64, 1080]` | 720 |
| b | 视频编码码率 (kbps) | - | 2000 |

#### 运行程序

启动WebRTC demo后，串口输出将显示一个URL地址。在浏览器中打开该URL即可查看板端实时画面。

```shell
./sample_webrtc.elf -p 8080 -s 2 -c 605274512 -W 1280 -H 720 -b 2000
```

确保浏览器设备与板端在同一局域网下。按下 `ctrl+c` 退出程序。

```text
msh /sdcard/app/examples/mpp>./sample_webrtc.elf -p 8080 -s 2 -c 605274512 -W 1280 -H 720 -b 2000
vb_set_config ok
debug: _ai_i2s_set_pitch_shift : semitones = 0
kd_mpi_venc_init start 0
venc[0] 1280*720 size:462848 cnt:30 srcfps:30 dstfps:30 rate:4000 rc_mode:1 type:96 profile:3
kd_mpi_venc_init end
set output err, set default format ISP_PIX_FMT_YUV420SP
[tuning] dev: 0
acq_win.width: 1920
acq_win.height: 1080
pipe_ctrl: 4294967289
sensor_fd: 12
sensor_type: 7
sensor_name: ov5647_csi0
database_name: ov5647-1920x1080
buffer_num: 0
buffer_size: 0
[tuning] chn: 0
out_win.width: 1280
out_win.height: 720
bit_width: 0
pix_format: 5
buffer_num: 6
buffer_size: 1382400
yraw_size: 0
uv_size: 0
v_size: 0
block_type: 1
wait_time: 500
chn_enable: 1
isp_3dnr_en is 0 g_isp_dev_ctx[dev_num].dev_attr.pipe_ctrl.bits.dnr3_enable is 1
VsiCamDeviceCreate hw:0-vt:0 created!
kd_mpi_isp_set_output_chn_format, width(1920), height(1080), pix_format(5)
[dw] init, version Feb 17 2025 00:06:56
[dw] open dewarp config file error
[dw] load config /bin/ov5647-1920x1080.bin failed, bypass
[dw] enter kd_mpi_sys_mmz_alloc((k_u64*)&settings->lut_phy_addr, &settings->lut_user_virt_addr, "dewarp/lut", "anonymous", settings->lut_size)
[dw] enter dev_fds[dev_num] < 0
[dw] enter ioctl(dev_fds[dev_num], K_DWVIOC_SETUP, settings)
[dw] split: 0 8191 8191 8191
[dw] LUT: 121x69=33396 phy(130ac000)
[dw] input:     1920x1080@YUV420SP align 0 bit 8
[dw] output[0]: 1280x720@YUV420SP align 12 bit 8 crop(0,0,0,0)

========================================
  libpeer LAN Camera Demo
========================================
  CSI: 2, Connector: 605274512
  Encode: 1280x720 @ 2000kbps H264
  Open in browser:
  http://10.100.228.46:8080
========================================

State: PEER_CONNECTION_NEW
```

在浏览器中打开 `http://10.100.228.46:8080`，页面将自动发起WebRTC连接请求。连接成功后串口输出：

```text
State: PEER_CONNECTION_CHECKING
State: PEER_CONNECTION_CONNECTED
```

此时浏览器页面将显示板端摄像头的实时画面。

#### 浏览器要求

Chrome/Edge 默认启用 mDNS 隐私保护，会隐藏本地 IP 导致 WebRTC 连接失败。页面会自动检测并提示。

修复方式（任选其一）：

1. 地址栏输入 `chrome://flags/#enable-webrtc-hide-local-ips-with-mdns` → 设为 **Disabled** → 重启
2. 启动参数加 `--disable-features=WebRtcHideLocalIpsWithMdns`
3. 使用 Firefox（默认未启用 mDNS）

#### 重连说明

浏览器页面支持重连：当WebRTC连接断开后，点击页面上的重连按钮即可发起新的SDP协商，无需刷新页面或重启板端程序。

```{admonition} 提示
有关 WebRTC 模块的具体接口，请参考[API文档](../../api_reference/middleware/multimedia_middleware.md)
```
