预计阅读时间:10 分钟
原来家庭监控这么简单!
想要在家安装摄像头监控,但市面上的产品动辄几百上千?别急,今天教你用超低成本DIY一个功能强大的家庭监控系统,不仅能实时查看视频,还支持远程访问,安全性拉满!
🤔 为什么要自己DIY?
现在的市面摄像头虽然功能强大,但价格不菲,而且很多都有云存储费用。更重要的是,你无法掌控摄像头拍到的数据去了哪里。
自己动手做一个,不仅能省钱,更重要的是——数据掌控在自己手中!而且整个制作过程并不难,跟着我一步步来,你也能轻松搞定。
📦 准备工作:你需要这些材料
硬件清单(总计约120-330元)
- USB摄像头 💰 20-30元
- 普通的USB摄像头就行,分辨率建议720P以上
-
网上随便找个几十块的就行,不用买太贵的
-
Linux主机 💰 100-300元
- 选择多样:
- 家庭低功耗主机
- NAS主机
- N1盒子(推荐,性价比高)
- 只要能跑Python代码的Linux设备都可以
软件准备
- Python:核心编程语言
- Android Studio:开发手机APP用的
- Trae:AI编码工具(不懂安卓开发也没问题,有AI帮忙)
💻 软件准备
- Python:核心编程语言
- Android Studio:开发手机APP用的
- Trae:AI编码工具(不懂安卓开发也没问题,有AI帮忙)
💡 推荐工具:开发者的瑞士军刀
在开发过程中,经常需要各种转换、加密、编码等工具,推荐一个超好用的开发工具网站:liufly.top
这是一个免费的开发工具集,功能超级丰富:
🔐 加密与安全类:Token生成器、Hash文本(MD5/SHA1-SHA512等)、Bcrypt加密对比、UUID/ULID生成、RSA密钥对生成、BIP39助记词生成、OTP代码生成校验、IBAN验证解析
🔄 编码转换类:Base64字符串/文件编码解码、整数进制转换(十进制/十六进制/二进制等)、罗马数字转换、ASCII二进制/Unicode互转、URL编码解码、HTML实体转义
📝 格式转换类:YAML/JSON/TOML/XML两两互转、Markdown转HTML、JSON转CSV、Docker run转Docker Compose、Outlook Safelink解码
✏️ 文本处理类:大小写转换、文本转北约音标、字符串混淆、文本差异对比、ASCII艺术生成、Numeronym生成(如i18n)、Lorem Ipsum生成、文本统计(字符/字数)
🌐 网络与设备类:URL解析、HTTP状态码查询、IPv4子网计算/地址转换/范围扩展、MAC地址查询/生成、IPv6 ULA生成、设备信息获取、Basic Auth生成
🛠️ 开发辅助类:密码强度分析、PDF签名校验、JWT解析、Git速查表、Crontab生成、Regex测试/速查表、Chmod权限计算、User-Agent解析
🏠 生活与办公类:QR码/WiFi QR码生成、SVG占位图生成、摄像头录制、Emoji选择器、手机号解析格式化、邮箱标准化
🔢 计算与统计类:数学计算
工具多到数不完,全部免费使用,强烈推荐收藏!👉 立即访问 liufly.top
🚀 开始制作:五步搞定
第一步:连接硬件 ✅
这一步最简单——把USB摄像头插到主机上就行!
确保插好后,主机能识别到摄像头设备。
第二步:编写服务端代码 📝
我们需要写一段Python代码,让摄像头开始工作并传输视频。
import cv2
import socket
import pickle
import struct
import threading
import time
import lz4.block
import zlib
import select
def handle_client(client_socket: socket):
strip = client_socket.getpeername()
logtime = time.asctime(time.localtime(time.time()))
print(logtime, strip, "已连接,等待认证...")
command = ""
try:
command = client_socket.recv(1024).decode()
except Exception as e:
print(logtime, "指令解析不正确", str(e))
client_socket.close()
return
if command != "************":
print(command)
print(logtime, "指令不正确", client_socket.getpeername())
client_socket.close()
return
print(logtime, strip, "认证通过")
running = [True]
try:
while running[0]:
_, frame = camera.read()
watermark_text = time.asctime(time.localtime(time.time()))
font = cv2.FONT_HERSHEY_SIMPLEX
font_scale = 1
color = (0, 0, 255)
thickness = 2
text_size, _ = cv2.getTextSize(watermark_text, font, font_scale, thickness)
text_position = (10, frame.shape[0] - 10)
cv2.putText(frame, watermark_text, text_position, font, font_scale, color, thickness)
height, width, _ = frame.shape
print(f"图像形状: {frame.shape}")
qdata = frame.tobytes()
data = zlib.compress(qdata)
data_size = struct.pack(">i", len(data))
client_socket.sendall(data_size)
client_socket.sendall(data)
time.sleep(0.04)
key = cv2.waitKey(1) & 0xFF
if key == 27:
running[0] = False
break
except Exception as e:
logTime = time.asctime(time.localtime(time.time()))
print(logTime, "与客户端通信时出现错误:", str(e))
finally:
logTime = time.asctime(time.localtime(time.time()))
print(logTime, "新客户端已断开:", strip)
client_socket.close()
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(('0.0.0.0', 9030))
server_socket.listen(5)
print("等待客户端连接...")
camera = None
for index in range(10):
print(f"尝试打开摄像头 index: {index}")
cap = cv2.VideoCapture(index)
if cap.isOpened():
camera = cap
print(f"成功打开摄像头 index: {index}")
break
else:
cap.release()
if camera is None:
print("无法打开任何摄像头")
exit(1)
camera.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
camera.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
camera.set(cv2.CAP_PROP_CONVERT_RGB, 0.0)
camera.set(cv2.CAP_PROP_FORMAT, cv2.CV_8UC1)
camera.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('Y', 'U', 'Y', 'V'))
try:
while True:
try:
client_socket, address = server_socket.accept()
client_thread = threading.Thread(target=handle_client, args=(client_socket,))
client_thread.start()
except Exception as e:
logtime = time.asctime(time.localtime(time.time()))
print(logtime, "与客户端通信时出现错误:", str(e))
except KeyboardInterrupt:
pass
finally:
server_socket.close()
camera.release()
cv2.destroyAllWindows()
这段代码做了什么?
- 📷 控制摄像头采集画面
- 🔐 添加了认证机制,只有输入正确密码才能连接
- ⏰ 自动在画面上添加时间水印
- 📡 通过网络将视频传输给手机客户端
- 🛡️ 使用多线程处理多个客户端连接
第三步:启动服务 ▶️
代码写好后,直接运行:
python CCTV.py
看到"等待客户端连接..."的提示,说明服务已经启动成功了!
第四步:开发手机APP 📱
如果你不会安卓开发,别担心!我们有AI助手帮忙。
操作步骤:
- 用Android Studio创建一个空白的安卓应用
- 打开Trae(AI编码工具),加载刚才创建的项目
- 把Python服务端代码发给AI,告诉它:"帮我把这个Python代码改成安卓客户端"
- AI会自动生成对应的安卓代码
- 如果遇到bug,直接把错误信息反馈给AI,它会帮你修正
- 最后让AI打包一个debug安装包,就可以安装到手机上了
整个过程就像和程序员对话一样简单!
第五步:配置网络(可选) 🌐
局域网使用: 如果你的手机和家庭摄像头在同一个WiFi下,直接就能连接,不用额外配置。
远程访问: 想在公司也能看到家里的画面?需要:
- 向宽带运营商申请公网IP(通常是免费的,打客服电话就能开通)
- 在路由器上设置端口转发,把9030端口转发给你的主机
- 配置好后, anywhere, anytime 都能查看家里情况
⚠️ 重要提示:关于视频流量
这里要说明一个技术细节:
由于我使用的主机不支持硬件编码,只能用CPU软编码,所以没有做H264或H265这种高效的视频编码格式。这意味着——网络传输会消耗较多流量。
优化方案:
如果你用的是N1盒子这类支持硬件编码的设备,可以用ffmpeg进行硬编码,流量消耗会大大降低,视频也更流畅。
✨ 效果展示
打开APP,你就能看到:

- 实时的高清视频画面
- 画面右下角显示当前时间(红色水印)
- 连接稳定,延迟很低
- 多台设备可以同时观看
🎯 总结
通过这个DIY项目,我们用不到300元的成本,打造了一个功能完整的家庭监控系统:
✅ 实时视频监控
✅ 远程访问
✅ 安全认证
✅ 时间水印
✅ 多客户端支持
最重要的是,数据完全在自己掌控中,不用担心隐私泄露。
💡 进阶玩法
等你熟练后,还可以尝试:
- 📹 添加录像功能,自动保存到本地
- 🔔 加入运动检测,画面变化时发送通知
- 🎤 添加音频双向传输
- 🤖 集成AI识别,自动检测人、动物等
📝 写在最后
这个项目适合有一定编程基础的朋友。如果你是零基础,也可以先从简单的Python学习开始,一步步来。
最重要的是——动手尝试!遇到问题不要怕,AI助手随时帮你解决。
祝你DIY成功!🎉
🔮 下期预告
固定视角的监控已经能满足基本需求,但如果能自由控制摄像头方向,那体验就上了一个档次!
下期我们将教大家:
🔹 3D打印云台外壳(或用纸板手工制作)
🔹 SG90舵机控制上下左右转动
🔹 在手机APP上添加控制按钮
🔹 实现全方位无死角监控
材料成本不超过100元,让摄像头"活"起来!
敬请期待!📺
本文由 liubei 原创,转载请注明出处。