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:
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连接,实现实时视频传输。
架构说明#
VICAP (摄像头)
├── CHN0 ──bind──> VO (LCD/HDMI 预览)
└── CHN1 ──bind──> VENC (H.264) ──> WebRTC ──> 浏览器
▲
HTTP 信令 (offer/answer)
数据流程:
VICAP采集摄像头画面,CHN0绑定到VO用于本地预览,CHN1绑定到VENC进行H.264编码。
VENC输出的H.264码流帧通过
peer_connection_send_video()发送到WebRTC对端。HTTP信令服务器处理浏览器的SDP offer/answer交换,完成WebRTC连接建立。
参数说明#
参数名 |
描述 |
参数范围 |
默认值 |
|---|---|---|---|
p |
HTTP服务器端口 |
- |
8080 |
s |
CSI设备号 |
0-2 |
2 |
c |
显示接口类型 |
605274512=LCD, 757006876=HDMI |
LCD (605274512) |
W |
视频编码宽度 |
|
1280 |
H |
视频编码高度 |
|
720 |
b |
视频编码码率 (kbps) |
- |
2000 |
运行程序#
启动WebRTC demo后,串口输出将显示一个URL地址。在浏览器中打开该URL即可查看板端实时画面。
./sample_webrtc.elf -p 8080 -s 2 -c 605274512 -W 1280 -H 720 -b 2000
确保浏览器设备与板端在同一局域网下。按下 ctrl+c 退出程序。
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连接请求。连接成功后串口输出:
State: PEER_CONNECTION_CHECKING
State: PEER_CONNECTION_CONNECTED
此时浏览器页面将显示板端摄像头的实时画面。
浏览器要求#
Chrome/Edge 默认启用 mDNS 隐私保护,会隐藏本地 IP 导致 WebRTC 连接失败。页面会自动检测并提示。
修复方式(任选其一):
地址栏输入
chrome://flags/#enable-webrtc-hide-local-ips-with-mdns→ 设为 Disabled → 重启启动参数加
--disable-features=WebRtcHideLocalIpsWithMdns使用 Firefox(默认未启用 mDNS)
重连说明#
浏览器页面支持重连:当WebRTC连接断开后,点击页面上的重连按钮即可发起新的SDP协商,无需刷新页面或重启板端程序。
提示
有关 WebRTC 模块的具体接口,请参考API文档
