API | เสร็จสมบูรณ์
RTSP2JPG
แปลงสตรีม RTSP จากกล้องวงจรปิดให้กลายเป็นภาพ JPEG ผ่าน HTTP API ใช้ง่าย สเกลง่าย เชื่อมกับระบบอื่นได้ทันที
พอทำระบบกล้องไปหลายโปรเจคแล้ว ทั้งพวก AI ตรวจจับคน, ระบบเปิดปิดไฟอัตโนมัติ, รวมถึง dashboard ที่แสดงภาพจากกล้องแบบ snapshot กับ realtime ผมก็เจอปัญหาเดิมๆ ซ้ำแล้วซ้ำอีก
คือเวลาที่ผมอยากได้ภาพ snapshot จากกล้องที่ชัดๆ หน่อย มันกลับเป็นเรื่องยากเหลือเกิน เพราะถ้าใช้ onvif snapshot ภาพมันไม่ชัดเลย (ก็ตรงตัวนะ snapshot มันคงไม่ได้ชัดขนาดนั้น แต่ผมก็อยากให้มันชัดไง…)
กล้องส่วนใหญ่จะใช้ RTSP stream สำหรับสตรีมวิดีโอ อันนี้แหละชัดกว่า onvif snapshot เยอะ วิธีที่จะเอามาใช้ก็คือเขียนโปรแกรมดึงภาพล่าสุดจาก RTSP stream แล้วเสิร์ฟเป็น JPEG ผ่าน HTTP API
เลยทำ RTSP2JPG ขึ้นมา เอาไว้ใช้ในโปรเจคอื่นๆ ด้วย มันเป็น microservice ตัวเล็กๆ ที่ทำหน้าที่แค่ “ดึงภาพล่าสุดจากกล้อง RTSP แล้วเสิร์ฟเป็น JPEG ผ่าน HTTP API” แค่นั้นเอง แต่โคตรมีประโยชน์จริงๆ
มันทำงานยังไงนะ?
หลักการมันง่ายมาก ผู้ใช้ส่ง RTSP URL ของกล้องมา RTSP2JPG ก็จะไปต่อ stream แล้วดึง frame ล่าสุด frame ที่ได้จะถูกแปลงเป็น JPEG แล้ว cache ไว้ (ไม่ต้อง decode ใหม่ทุกครั้ง) พอมีใครมาเรียล API /snapshot/{camera_id} ก็จะได้ภาพล่าสุดไปเลย
ผมใช้ FastAPI ทำ API, ใช้ OpenCV หรือ FFmpeg/GStreamer สำหรับ decode (สลับ backend ได้), จัดการข้อมูลกล้องกับ token ใน SQLite, แล้วใส่ .env ให้ config ง่าย
ใครจะ deploy ด้วย Docker ก็ทำได้ในคำสั่งเดียว — docker compose up -d
เคสที่ผมเคยเอาไปใช้
ผมเอาไปใช้ในโปรเจกต์ AI ตรวจจับคนในห้องเรียน เพื่อสั่งเปิด-ปิดไฟอัตโนมัติ อันนี้ไม่ได้รันแบบ Frame by Frame ขนาดนั้น รันแค่ every 3 sec แต่ๆๆ ก็ยังต้องการภาพที่ชัดพอจะ detect คนได้ดี onvif snapshot มันไม่ค่อยพอเว้ย ก็เลยทำ snapshot จาก RTSP2JPG นี่แหละ
อีกเคสคือหน้าหลักของ dashboard ที่โชว์ภาพ snapshot จากหลายกล้องพร้อมกันบนเว็บ ได้ภาพที่ชัดกว่า onvif snapshot พอสมควร
แล้วก็ใช้กับ ESP32 ที่ต่อกล้องราคาถูกจากจีน เอาไปใช้ในระบบ IoT อันนี้สะดวกมาก เพราะ ESP แค่ HTTP GET ก็เอาภาพจากกล้องมาใช้ได้แล้ว ไม่ต้องรู้จัก RTSP ด้วยซ้ำ
ทำไมมันถึงได้ผล?
ผมเคยเห็นโค้ดที่คนเขียนไปดึง RTSP แล้วเปิดปิด stream ทุกครั้งที่ต้องการภาพ ผลลัพธ์คือใช้ CPU สูง, กล้องค้าง, latency สูง
แต่ RTSP2JPG ทำงานแบบ persistent connection เปิด stream ทิ้งไว้ในเบื้องหลัง แล้วเสิร์ฟภาพให้หลายระบบพร้อมกันได้เลย ไม่ว่า backend, frontend, AI model หรือแม้แต่ ESP ก็ใช้ได้หมด
เอาจริงๆ ใครๆ ก็ทำได้แหละเรื่องแบบนี้ แค่ต้องเขียนโปรแกรมลากยาวหน่อย จัดการ edge case ต่างๆ แต่นี่ผมเขียนไว้ให้แล้ว 555
สรุป
RTSP2JPG ไม่ได้ซับซ้อนอะไรมาก แต่มันทำให้อะไรหลายอย่างที่เคยยุ่งยาก กลายเป็นเรื่องง่าย มันทำให้ RTSP ซึ่งปกติเอาไปใช้ยากๆ กลายเป็น HTTP ที่ใครก็ใช้ได้
ใครอยากลองใช้ ลองปรับแต่ง หรือจะเอาไปต่อยอดระบบตัวเอง ลุยเลยครับ โค้ดอยู่ใน GitHub ผมเปิด public ไว้ให้แล้ว