ESP32-CAM ทำหน้าที่เป็น MJPEG Streaming Server สำหรับหลายคลায์เอนต์พร้อมกัน
Overview: ESP32 และ MJPEG Streaming คืออะไร
ไปเที่ยว Smart Home Store ใหม่ ๆ ไหม? เห็นกล้องวิดีโอมิติสัก 10-20 ตัว ป้ายบอกว่า "24/7 Streaming" ใช่ไหม
นี่คือ IoT ยุคนี้ - ทำให้อุปกรณ์ถ่ายทำและส่งข้อมูลกลับมาเรียลไทม์ เพื่อให้คนหลายคนดูได้พร้อม ๆ กัน ผ่านมือถือ แท็บเล็ต หรือคอมพิวเตอร์
ESP32 คือ Microcontroller ตัวเล็ก ราคาถูก (100-200 บาท) ที่มี WiFi และ Bluetooth ในตัว
เมื่อต่อกับ ESP32-CAM (กล้องขนาดเล็ก) มันก็ทำได้สิ่งเดียวกัน - ถ่ายรูป บีบอัด และส่ง Stream ไปยังโทรศัพท์ของคุณและเพื่อน ๆ พร้อมกัน
MJPEG (Motion JPEG) คือวิธีการส่งวิดีโอแบบหนึ่ง - ส่งรูปถ่ายหลาย ๆ ภาพต่อเนื่องกัน (15-30 frame ต่อวินาที) จากนั้นลิวจอกมารวมเป็นวิดีโอ
มันเหมือน flip book - แต่ละหน้าคือรูป JPEG ต่างกัน เมื่อเปิดเร็ว มันก็ดูเหมือนวิดีโอ
Things: อุปกรณ์ที่ต้องใช้
ถ้าจะเริ่มต้น โปรเจกต์ ESP32-CAM MJPEG Streaming ต้องเตรียมอะไรบ้าง:
-
ESP32-CAM Module - บอร์ดที่มีกล้อง 2MP + WiFi ในตัว
-
USB-to-Serial Adapter - สำหรับ Upload Code ครั้งแรก (CH340 หรือ CP2102)
-
Jumper Wires - สาย DuPont สำหรับต่อวงจร
-
Power Supply - 5V 2A (ต้องแรงพอ ESP32-CAM หิว) บางคน ใช้ Power Bank ได้
-
Arduino IDE หรือ PlatformIO - สำหรับเขียนและ Upload Code
-
WiFi Network - สำหรับให้ ESP32-CAM ติดต่อกับมือถือ/คอมพิวเตอร์
ราคารวมประมาณ 500-800 บาท - ไม่แพง ถ้าเทียบกับว่าได้โปรเจกต์ IoT แท้ ๆ มา
Story: ทำไมเรื่องนี้สำคัญ
ไม่นานมานี้ โพลที่ว่า "นักเรียน/นักศึกษาที่สนใจ IoT" หรือ "Smart Home" พุ่งสูงขึ้นอย่างนั้น
บ่อย ๆ คนถามว่า "อยากเรียนโปรเจกต์ CCTV แบบ Smart Home ได้ไหม" "ถ่ายทำและส่ง Stream ผ่าน WiFi ได้ยังไง"
ปัญหาคือ - ที่แรก ก็ยาก ที่ที่สอง ก็ราคาแพง ที่ที่สาม ก็ยังไม่เข้าใจ Multi-Client Streaming คืออะไร
เลยเป็นที่มาของบทความนี้ - เราต้องการแสดงให้เห็นว่า "การส่ง Streaming ไปยังหลายคนพร้อมกัน" อาจจะยากกว่าที่คิด และต้องใช้วิทยาการเพิ่มเติม
Background: MJPEG คืออะไร ทำไมถึงเป็น Standard
ก่อนที่จะไปเข้าโรงถ่ายทำ เรามาอ่าน "หลักการ" ของ MJPEG ให้เข้าใจก่อน
MJPEG = Motion JPEG
ไม่ได้เก็บวิดีโอเป็นไฟล์ mp4 หรือ h.264 แบบเดิม
แต่ส่ง JPEG Images ที่เก็บบีบอัดแยกกัน ทีละ 1 ภาพ ในลำดับต่อเนื่องกัน
ลิวจอกมารวมรูปทั้งหมด เป็นวิดีโอต่อเนื่อง (Playback)
ทำไมถึงใช้ MJPEG?
-
เรียบง่าย - ไม่ต้อง Codec ที่ซับซ้อน (H.264, VP9)
-
ประหยัดทรัพยากร - ใช้พลังประมวลผล (CPU/GPU) น้อย บน Microcontroller เล็ก ๆ
-
รองรับกว้าง - เบราว์เซอร์เดิม รองรับ MJPEG ได้เลย ไม่ต้องติดตั้ง Plugin
-
ยืดหยุ่น - เปลี่ยนคุณภาพรูป (Quality) และจำนวน Frame ต่อวินาที ได้ง่าย
เลยถ้าคุณเข้าเว็บกล้อง CCTV เดิม ๆ และเห็น ".mjpeg" หรือ "mjpg_streamer" ก็คือนี่แหละ - ข่าวเก่ามิ้ว แต่ยังใช้กันอยู่เยอะ เพราะ "มันทำงาน"
Challenge #1: Single Client Problem
คุณขึ้น Arduino IDE เขียน Code ง่าย ๆ ให้ ESP32-CAM ส่ง Stream ออกมา
ตอนแรก ดี ครับ - เปิดบราว์เซอร์ไปที่ http://192.168.1.100:81 ก็เห็นวิดีโอ real-time
แต่พอ - สมมติว่ามีคนที่สองพยายามเข้าดู Stream เดียวกัน ทันใด นั้น
❌ เฉพาะคนแรกเท่านั้นที่ได้ Stream ชัดเจน
❌ คนที่สองเข้า - ช้า/สะดุด หรือ Connection Reset
❌ ESP32-CAM ไม่มีทรัพยากรพอ (RAM, CPU) ที่จะส่ง Stream ให้หลายคน พร้อมกัน
นี่คือปัญหาแรก - "Single Client Streaming" - ESP32-CAM Code เดิม ไม่ได้ออกแบบมาให้หลายคนเข้าดูพร้อมกัน
Streaming to More Than One Client: วิธีแก้ปัญหา
ดังนั้น ดรัม Anatoli Arkhipenko (ผู้เขียนบทความต้นฉบับ) เขียน Code ใหม่ - เพื่อให้ ESP32-CAM รองรับ Multi-Client Streaming
วิธีการคิด:
-
ใช้ Task หลายตัว - แทนที่จะให้ Core เดียวส่ง Stream ให้ Client หนึ่งตัว มันแบ่งเป็น Task ขนาน (Concurrent)
-
Circular Buffer - แทนที่จะ Capture → Send รอบ ๆ ไป มันเก็บรูป ล่าสุดไว้ใน Buffer
-
Multi-Threading - Client แต่ละคน ได้ Thread ตัวเอง อ่านจาก Buffer เดียวกัน ส่งไปให้ Client นั้น
ผลที่ได้:
✓ คนที่ 1 ดูได้
✓ คนที่ 2 ดูได้
✓ คนที่ 3, 4, 5... ดูได้ (ถึงเท่านี้ ESP32-CAM ไหว)
✓ ทุกคนเห็นวิดีโอเดียวกัน เกือบ Real-time
ใน Code ของ Anatoli - เขาใช้ FreeRTOS Task (ระบบปฏิบัติการจริง ๆ บน ESP32) เพื่อแยก "Capture Thread" กับ "Client Streaming Threads"
Capture Thread ยังถ่ายรูปแบบตั้งแต่เดิม แต่เมื่อไม่มี Client ใครเข้ามา มันเก็บรูปล่าสุดไว้ แล้ว Client หลายตัวอ่านจากที่เดียวนั้น
Challenge #2 & Cherry on Top: ปัญหาและความเก่ง
ปัญหาต่อมา - Bandwidth & Performance
พอเปิด Multi-Client Streaming ได้แล้ว ปัญหา ใหม่ เกิด
❌ WiFi Bandwidth - ถ้า 5 คนเข้ามา ต้องส่งข้อมูล 5x เพื่อให้ 5 คนดู
❌ Quality vs Speed - ถ้าเพิ่มขนาด Frame หรือ Quality ของรูป JPEG ก็ช้าลง
❌ Latency - เวลา Delay ระหว่างการถ่ายรูปกับการแสดงบนจอ (อาจ 500ms - 2s)
ความเก่งของ Anatoli's Solution:
✓ Efficient Buffering - ใช้ Circular Buffer ไม่มีการ Copy ข้อมูลซ้ำ ๆ
✓ Quality Adjustment - ปรับคุณภาพ JPEG ได้โดยตรง เพื่อลด Bandwidth
✓ Frame Rate Control - ควบคุมจำนวน Frame ต่อวินาที ตามสภาวะ
✓ Connection Management - จัดการ Client ที่หลุด/ปิด Connection โดยอัตโนมัติ
Challenge #3: ใช้ Drivers ใหม่
ปัญหาสุดท้าย - Compatibility กับ Sensor ต่าง ๆ
ESP32-CAM มี Sensor หลายรุ่น - OV2640 (เดิม), OV3660 (ใหม่), OV5640 (แพง)
ปัญหา: Code เดิม บางทีอ่าน Sensor ไม่ออก หรือ Feature บางอย่าง ใช้ไม่ได้
วิธีแก้: ใช้ ESP32-CAM Drivers ใหม่ (esp32-camera library เวอร์ชั่นล่าสุด)
Drivers ใหม่มี Support สำหรับ Sensor รุ่นใหม่ และให้ control มากขึ้น (Brightness, Contrast, Face Detection)
ใน Hackster Project นี้ - ข้อมูล Reference หลักของ Anatoli ใช้ Driver เวอร์ชั่นล่าสุด เพื่อให้ Compatible กับ Board ต่าง ๆ มากขึ้น
Practical Application: ใช้งานจริง ๆ
ออกแบบแล้ว ปัญหากำจัดแล้ว - ตอนนี้ลองใช้มันจริง ๆ ดู
-
Home Security Monitoring - เปิด MJPEG Stream บนเว็บ ดูกล้องที่บ้านจากมือถือ เมื่อไหร่ก็ได้
-
Smart Pet Camera - ดูสัตว์เลี้ยงขณะไป ออฟฟิศ หลายคน (ครอบครัว) ดูได้พร้อมกัน
-
Classroom Live Stream - ครู Livestream บทเรียนให้นักศึกษา (ที่บ้านหรือ Quarantine) ดูแบบ Real-time
-
Wildlife Camera - ถ่ายนก แมลง สัตว์ป่า ส่ง Stream ไปยังแอปพลิเคชัน Tracking
-
Industrial Monitoring - เฝ้าระวัง Machine หรือ Assembly Line ตั้ง 1-3 กล้อง ดูได้จากห้องควบคุมหรือบนมือถือ
Step-by-step ก็ง่าย:
- ติดตั้ง Arduino IDE + ESP32 Board (ติดตั้ง Library)
- Download Code จาก GitHub ของ Anatoli
- ใส่ WiFi SSID & Password
- Upload Code ลงไป
- เปิดบราว์เซอร์ → http://[IP Address]:81
- เสร็จ - ดูวิดีโอได้แล้ว
ตัวอย่างการทำงานของ Multi-Client MJPEG Streaming บน ESP32-CAM
Enjoy: สุดท้าย เพลิดเพลินกับโปรเจกต์ของคุณ
พอเข้าใจขั้นตอนและปัญหาแล้ว เวลาเล่นโปรเจกต์ของคุณเอง
ที่พูดเจอบ่อยที่สุด: "อ่านแล้วฟังดูยากเหมือนกัน - แล้วฉันจะเริ่มตรงไหน?"
คำตอบ: ก็เริ่มจากตัวอย่าง (Example Code) ของ Anatoli ตรง ๆ ลอง Upload ลงไป ดูว่ามันทำงานยังไง หลังจากนั้นค่อยปรับแต่ง (Tweak) ตามต้องการของคุณ
อย่าหนีจากการลอง - ความผิดพลาดแรก ๆ คือการเรียนรู้ที่ดีที่สุด
และเมื่อเสร็จแล้ว? ขึ้นรูป Showcase ได้เลย - โปรแกรม GitHub, Blog, Portfolio ของคุณ
ใครรู้ว่า - อาจจะ "Multi-Client MJPEG Streaming" นี้จะกลายเป็น Foundation ของโปรเจกต์ใหญ่ ๆ ในอนาคต
อยากสร้างโปรเจกต์ ESP32-CAM Streaming เองบ้าง?
ติดต่อ Globalbyteshop เพื่อขอคำแนะนำในการเลือก Sensor รุ่นต่าง ๆ และ ได้รับ Code Example พร้อมใช้
สอบถามเพิ่มเติมได้ที่: Globalbyteshop LINE Community