IoTLabs

Nghiên cứu, Sáng tạo và Thử nghiệm

Series ESP-WebRTC: Video H.264 Hardware Encode Trên ESP32-P4 — Hiệu Năng Thực Tế

Video là phần tốn tài nguyên nhất trong WebRTC. Trên ESP32-P4, hardware H.264 encoder là tính năng quan trọng nhất — bài này giải thích hoạt động của nó và cách khai thác tối đa.

Tại Sao H.264, Không Phải MJPEG?

MJPEG (Motion JPEG) là encode từng frame như ảnh JPEG độc lập. Đơn giản nhưng:

  • Không có inter-frame compression — mỗi frame là file JPEG đầy đủ
  • Bandwidth rất cao: 640×480@15fps tốn ~2–4 Mbps
  • Không phải codec chuẩn của WebRTC (browser support hạn chế)

H.264 (AVC) dùng predictive coding — chỉ encode phần thay đổi giữa các frame:

  • Bandwidth thấp hơn 10–20×: 640×480@30fps chỉ cần ~200–500 kbps
  • Chuẩn WebRTC được hỗ trợ đầy đủ trên mọi browser
  • Chất lượng cao hơn cùng bitrate

Nhược điểm của H.264: encode phức tạp hơn nhiều — đây là lý do ESP32-P4 có hardware encoder.

Hardware Encoder Của ESP32-P4

ESP32-P4 tích hợp hardware H.264 encoder (HW-H264) với:

Tính NăngGiá Trị
ProfilesBaseline, Main
Max Resolution1920×1080
Max Frame Rate60fps (ở 720p)
Bitrate ControlCBR, VBR
GOP SizeConfigurable
CPU Overhead~3–5%

So sánh với software encode trên ESP32-S3:

MetricHW H.264 (ESP32-P4)SW MJPEG (ESP32-S3)
Resolution1080p@30fps480p@15fps
CPU encode~5%~70%
Bandwidth500kbps3Mbps
Latency~33ms/frame~66ms/frame
Chất lượngXuất sắcTrung bình

📷 [Hình minh hoạ: Biểu đồ CPU usage: HW H.264 vs SW MJPEG theo resolution]

Pixel Processing Accelerator (PPA)

Trước khi video vào H.264 encoder, frame cần được xử lý: scale, color convert (camera thường output YUV422, encoder cần YUV420), rotate.

PPA của ESP32-P4 làm tất cả bằng hardware:

Camera raw (YUV422) → PPA (scale + convert) → YUV420 → HW H.264 Encoder → Bitstream

Không có PPA, bước color convert phải dùng CPU — tốn thêm 15–25% CPU cho từng frame.

Cấu Hình Video Pipeline

Trong esp-webrtc-solution, pipeline video được cấu hình qua esp_capture:

#include "esp_capture.h"
#include "esp_capture_video.h"

// Cấu hình camera source
esp_capture_video_cfg_t video_cfg = {
    .type       = ESP_CAPTURE_VIDEO_TYPE_DVP,  // Hoặc MIPI_CSI
    .width      = 1280,
    .height     = 720,
    .fps        = 25,
    .fmt        = ESP_CAPTURE_VIDEO_FMT_YUV422,
};

// Cấu hình H.264 encoder
esp_capture_h264_cfg_t h264_cfg = {
    .profile    = ESP_CAPTURE_H264_PROFILE_BASELINE,
    .width      = 1280,
    .height     = 720,
    .fps        = 25,
    .bitrate    = 1000000,  // 1Mbps
    .gop_size   = 25,       // I-frame mỗi 1 giây
    .qp_min     = 10,
    .qp_max     = 51,
};

esp_capture_handle_t cap;
esp_capture_init(&cap);
esp_capture_add_video_source(cap, &video_cfg);
esp_capture_add_h264_encoder(cap, &h264_cfg);

Tuning Bitrate Cho Mạng Yếu

WebRTC có adaptive bitrate — tự giảm chất lượng khi network congestion. Nhưng bạn cần set giới hạn hợp lý:

// Cấu hình trong esp_webrtc
esp_webrtc_video_cfg_t v_cfg = {
    .codec        = ESP_WEBRTC_VIDEO_CODEC_H264,
    .min_bitrate  = 200000,   // 200kbps — tối thiểu
    .max_bitrate  = 2000000,  // 2Mbps — tối đa
    .start_bitrate = 800000,  // 800kbps — bắt đầu ở mức trung bình
};

Với mạng Wi-Fi nhà (20–50Mbps), 1–2Mbps là phù hợp. Với 4G LTE (~10Mbps), 500kbps–1Mbps.

GOP Size và Latency

GOP (Group of Pictures) là số frame giữa hai I-frame (keyframe). I-frame là frame đầy đủ, P-frame chỉ chứa delta.

  • GOP nhỏ (GOP=10 ở 25fps = 0.4 giây): recovery nhanh khi packet loss, nhưng bitrate tăng
  • GOP lớn (GOP=100 ở 25fps = 4 giây): bitrate thấp hơn, nhưng nếu mất I-frame phải chờ lâu

Cho WebRTC real-time, GOP 1–2 giây là hợp lý:

.gop_size = 25,  // 25fps × 1 giây = 1 I-frame/giây

I-Frame On Demand

WebRTC có thể yêu cầu I-frame ngay lập tức khi cần (ví dụ sau packet loss). esp-webrtc-solution handle điều này tự động qua RTCP PLI (Picture Loss Indication):

Browser → RTCP PLI → ESP32
ESP32 → force I-frame ngay lập tức

Hardware encoder của ESP32-P4 generate I-frame on demand cực nhanh (~1ms), không làm gián đoạn stream.

Resolution Recommendation

Use CaseResolutionFPSBitrate
Video doorbell720p (1280×720)15500kbps
Security camera1080p (1920×1080)251.5Mbps
Intercom480p (854×480)25300kbps
Low-bandwidth demo360p (640×360)15150kbps

Bài tiếp theo: Kết Nối Camera DVP và Micro — Pipeline Từ Capture Đến Transmit