App Inventor 2 网络摄像头调用教程 - 通过API查看实时监控画面

« 返回首页

概述

通过网络摄像头(IP Camera)的HTTP API获取实时画面是App Inventor可以实现的。

方案对比

方案 协议 延迟 难度
HTTP快照 HTTP GET 1-3秒 ⭐⭐
MJPEG流 HTTP Stream ⭐⭐⭐
RTSP流 RTSP 极低 ❌ App Inventor不支持
WebView嵌入 HTTP ⭐⭐

方案一:HTTP快照(最简单)

大多数网络摄像头提供HTTP快照接口:

常见摄像头快照URL

品牌 快照URL 说明
通用MJPEG http://IP:port/snapshot.jpg HTTP截图
Hikvision http://IP/Streaming/channels/1/picture 海康威视
Dahua http://IP/cgi-bin/snapshot.cgi 大华
ESP32-CAM http://IP/capture ESP32摄像头

积木块代码

设 摄像头IP = "192.168.1.100"
设 摄像头端口 = "8080"
设 快照URL = "http://" & 摄像头IP & ":" & 摄像头端口 & "/snapshot.jpg"
设 刷新间隔 = 1000  ' 1秒刷新

当 按钮_开始监控.被点击
  设 Clock_刷新.计时器间隔 = 刷新间隔
  设 Clock_刷新.启用计时器 = true

当 Clock_刷新.计时
  ' 方法1:直接设置Image的URL
  设 Image_画面.图片 = 快照URL & "?t=" & Clock1.获取毫秒数(Clock1.当前时间())
  ' 添加时间戳防止缓存

带认证的摄像头

当 Clock_刷新.计时
  设 Web_摄像头.请求头 = [
    "Authorization: Basic " & 调用 Base64编码(用户名 & ":" & 密码)
  ]
  调用 Web_摄像头.执行Get请求(快照URL)

方案二:WebView嵌入MJPEG流

很多摄像头支持MJPEG流,可以直接在WebView中显示:

当 Screen1.初始化
  设 MJPEG_URL = "http://192.168.1.100:8080/video"
  设 WebView_摄像头.主页地址 = MJPEG_URL

带HTML包装

<!-- camera.html -->
<img src="http://192.168.1.100:8080/video" style="width:100%">
<script>
setInterval(function(){
  var msg = window.AppInventor.getWebViewString();
  if(msg && msg.startsWith("URL:")){
    document.querySelector('img').src = msg.substring(4);
    window.AppInventor.setWebViewString("");
  }
},100);
</script>
当 按钮_切换摄像头.被点击
  设 WebView_摄像头.WebView字符串 = "URL:http://192.168.1.101:8080/video"

方案三:ESP32-CAM专用

ESP32-CAM是常见的DIY网络摄像头方案:

ESP32-CAM端(Arduino代码)

// ESP32-CAM WebServer提供HTTP快照
#include "esp_camera.h"
#include <WiFi.h>
// ... 标准ESP32-CAM配置代码
// 访问 http://ESP32_IP/capture 获取JPEG快照
// 访问 http://ESP32_IP/stream 获取MJPEG流

App Inventor端

设 ESP32_IP = "192.168.1.50"

当 按钮_拍照.被点击
  设 Image_画面.图片 = "http://" & ESP32_IP & "/capture"

当 按钮_视频流.被点击
  设 WebView_视频.主页地址 = "http://" & ESP32_IP & "/stream"

控制ESP32-CAM

当 按钮_开灯.被点击
  调用 Web1.执行Get请求("http://" & ESP32_IP & "/led/on")

当 按钮_关灯.被点击
  调用 Web1.执行Get请求("http://" & ESP32_IP & "/led/off")

实战案例:多路监控

设 摄像头列表 = [
  创建字典("name" → "前门", "url" → "http://192.168.1.100:8080/snapshot.jpg"),
  创建字典("name" → "后院", "url" → "http://192.168.1.101:8080/snapshot.jpg"),
  创建字典("name" → "车库", "url" → "http://192.168.1.102:8080/snapshot.jpg")
]
设 当前摄像头 = 1

当 按钮_切换.被点击
  设 当前摄像头 = (当前摄像头 模 列表长度(摄像头列表)) + 1
  设 摄像头 = 列表第当前摄像头项(摄像头列表)
  标签_名称.文本 = 从字典 摄像头 获取 "name"
  设 Image_画面.图片 = (从字典 摄像头 获取 "url") & "?t=" & Clock1.获取毫秒数(Clock1.当前时间())

常见问题

Q1: 画面加载很慢?

  • 降低摄像头分辨率(如640x480)
  • 确保手机和摄像头在同一局域网
  • 增大刷新间隔(1-3秒)

Q2: 无法连接摄像头?

  • 确认IP地址正确
  • 确认手机和摄像头在同一网络
  • 检查防火墙设置
  • 尝试在浏览器中直接访问URL

Q3: RTSP流怎么播放?

App Inventor不支持RTSP协议。解决方案:

  • 使用摄像头提供的HTTP快照/MJPEG接口
  • 使用FFmpeg中转RTSP为HTTP流
  • 使用VLC作为中转服务器

总结

方案 推荐度 延迟 适用
HTTP快照定时刷新 ⭐⭐⭐⭐ 1-3秒 静态监控
WebView + MJPEG ⭐⭐⭐⭐⭐ 实时监控
ESP32-CAM专用 ⭐⭐⭐⭐ DIY项目

版权声明:MIT App Inventor 官方文档采用 CC BY-SA 4.0 授权,本文档由 ai2claw 🐝 整理。

文档反馈