GET /stream — MJPEG 实时视频流
获取摄像头的 MJPEG 实时视频流。浏览器可直接将此端点作为 <img> 标签的 src 使用。
注意:MJPEG 流运行在 端口 81(独立TCP服务器),而Web界面运行在端口80。流URL为
http://<设备IP>:81/stream
认证:无需认证
源码:mjpeg_stream_handler(mjpeg_streamer.c)
响应头:
Content-Type: multipart/x-mixed-replace; boundary=frame
Access-Control-Allow-Origin: *
响应体格式:
流式响应由连续的 JPEG 帧组成,每帧格式如下:
\r\n--frame\r\n
Content-Type: image/jpeg\r\n
Content-Length: <帧数据字节数>\r\n
\r\n
<JPEG 二进制数据>\r\n
限制:
- 最多支持 2 个并发客户端连接
- 超过连接数限制时返回
503 Service Unavailable,响应体:Max stream connections reached - 帧率由配置项
fps控制(默认 10 FPS) - 每帧 JPEG 数据以 4096 字节分块发送
- 客户端断开连接时自动释放资源
cURL 示例:
# 将一帧保存为 JPEG(超时后自动断开)
curl --max-time 1 http://192.168.4.1:81/stream > frame.jpg 2>/dev/null
HTML 嵌入示例:
<!-- 最简用法:直接嵌入 img 标签 -->
<img src="http://192.168.4.1:81/stream" style="width: 100%;" alt="实时画面">
<!-- 带自动重连的完整页面 -->
<!DOCTYPE html>
<html>
<head>
<title>实时画面</title>
</head>
<body>
<img id="stream" src="/stream" style="max-width: 100%;"
onerror="setTimeout(() => this.src='/stream?t='+Date.now(), 3000)">
</body>
</html>
JavaScript 播放控制示例:
const img = document.getElementById('stream');
function startStream() {
img.src = 'http://<设备IP>:81/stream?t=' + Date.now();
}
function stopStream() {
img.src = ''; // 断开流连接
}
// 断线自动重连
img.onerror = () => {
setTimeout(startStream, 3000);
};
GET /api/audio — HTTP 分块音频流
通过 HTTP 分块传输获取实时 G.711 μ-law 音频流。网页预览页面使用此接口进行实时音频监听。
认证:无需认证
来源:audio_stream_handler (web_server.c)
响应头:
Content-Type: application/octet-stream
Transfer-Encoding: chunked
Access-Control-Allow-Origin: *
响应体:G.711 μ-law 编码音频字节流(8 kHz,单声道,20ms 帧 = 160 字节/帧)。
客户端解码:浏览器通过查找表将 μ-law 解码为 16 位 PCM,通过 Web Audio API(AudioContext 8 kHz 采样率)播放。
DSP 管线(固件端):
- I2S PDM 采集(DSR_16S,1.024 MHz PDM 时钟,硬件抗混叠)
- DC 偏移去除(IIR 滤波器,α≈0.999)
- 频谱减法降噪(256 点 FFT,Wiener 增益,最小统计量噪声估计)
- 软件增益(4×)+ 硬限幅
- 带迟滞的噪声门(开门@300,关门@150)
- G.711 μ-law 编码
cURL 示例:
# 采集 3 秒音频
curl --max-time 3 http://<设备IP>/api/audio > audio.g711 2>/dev/null