原来家庭监控这么简单-DIY家庭摄像头


预计阅读时间:10 分钟

原来家庭监控这么简单!

想要在家安装摄像头监控,但市面上的产品动辄几百上千?别急,今天教你用超低成本DIY一个功能强大的家庭监控系统,不仅能实时查看视频,还支持远程访问,安全性拉满!


🤔 为什么要自己DIY?

现在的市面摄像头虽然功能强大,但价格不菲,而且很多都有云存储费用。更重要的是,你无法掌控摄像头拍到的数据去了哪里。

自己动手做一个,不仅能省钱,更重要的是——数据掌控在自己手中!而且整个制作过程并不难,跟着我一步步来,你也能轻松搞定。


📦 准备工作:你需要这些材料

硬件清单(总计约120-330元)

  1. USB摄像头 💰 20-30元
  2. 普通的USB摄像头就行,分辨率建议720P以上
  3. 网上随便找个几十块的就行,不用买太贵的

  4. Linux主机 💰 100-300元

  5. 选择多样:
    • 家庭低功耗主机
    • NAS主机
    • N1盒子(推荐,性价比高)
  6. 只要能跑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助手帮忙。

操作步骤:

  1. Android Studio创建一个空白的安卓应用
  2. 打开Trae(AI编码工具),加载刚才创建的项目
  3. 把Python服务端代码发给AI,告诉它:"帮我把这个Python代码改成安卓客户端"
  4. AI会自动生成对应的安卓代码
  5. 如果遇到bug,直接把错误信息反馈给AI,它会帮你修正
  6. 最后让AI打包一个debug安装包,就可以安装到手机上了

整个过程就像和程序员对话一样简单!

第五步:配置网络(可选) 🌐

局域网使用: 如果你的手机和家庭摄像头在同一个WiFi下,直接就能连接,不用额外配置。

远程访问: 想在公司也能看到家里的画面?需要:

  1. 向宽带运营商申请公网IP(通常是免费的,打客服电话就能开通)
  2. 在路由器上设置端口转发,把9030端口转发给你的主机
  3. 配置好后, anywhere, anytime 都能查看家里情况

⚠️ 重要提示:关于视频流量

这里要说明一个技术细节:

由于我使用的主机不支持硬件编码,只能用CPU软编码,所以没有做H264或H265这种高效的视频编码格式。这意味着——网络传输会消耗较多流量

优化方案:

如果你用的是N1盒子这类支持硬件编码的设备,可以用ffmpeg进行硬编码,流量消耗会大大降低,视频也更流畅。


✨ 效果展示

打开APP,你就能看到:

  • 实时的高清视频画面
  • 画面右下角显示当前时间(红色水印)
  • 连接稳定,延迟很低
  • 多台设备可以同时观看

🎯 总结

通过这个DIY项目,我们用不到300元的成本,打造了一个功能完整的家庭监控系统:

✅ 实时视频监控
✅ 远程访问
✅ 安全认证
✅ 时间水印
✅ 多客户端支持

最重要的是,数据完全在自己掌控中,不用担心隐私泄露。


💡 进阶玩法

等你熟练后,还可以尝试:

  • 📹 添加录像功能,自动保存到本地
  • 🔔 加入运动检测,画面变化时发送通知
  • 🎤 添加音频双向传输
  • 🤖 集成AI识别,自动检测人、动物等

📝 写在最后

这个项目适合有一定编程基础的朋友。如果你是零基础,也可以先从简单的Python学习开始,一步步来。

最重要的是——动手尝试!遇到问题不要怕,AI助手随时帮你解决。

祝你DIY成功!🎉


🔮 下期预告

固定视角的监控已经能满足基本需求,但如果能自由控制摄像头方向,那体验就上了一个档次!

下期我们将教大家:

🔹 3D打印云台外壳(或用纸板手工制作)
🔹 SG90舵机控制上下左右转动
🔹 在手机APP上添加控制按钮
🔹 实现全方位无死角监控

材料成本不超过100元,让摄像头"活"起来!

敬请期待!📺


本文由 liubei 原创,转载请注明出处。

📖相关推荐