Edge AI

Jetson Orin NX'te 200ms Altı Video Pipeline

180ms → 62ms Glass-to-Glass — Jetson Orin NX, JetPack 6.2, nvv4l2h264enc NVENC

Spikedge MühendislikApril 5, 20269 dk okuma

Latency

62ms180ms
-66%

Validated on

GStreamer
Jetson Orin NX'te 200ms Altı Video Pipeline
oscilloscope-verified

Latency

62ms

-66%

What Was Solved

Video gecikmesi görünmezdir — ta ki görünür hale gelene dek. Tarımsal robotik platformlarında 180ms glass-to-glass gecikme operatör aşırı düzeltmesine neden oldu ve ilaçlama verimliliğini %23 düşürdü. Jetson Orin NX üzerinde GStreamer + NVENC donanım hızlandırmayla yazılım encoding darboğazını giderdik, pipeline aşamalarını 7'den 4'e indirdik ve 1080p30'da 62ms sürdürülebilir gecikme elde ettik — 48 saatlik kesintisiz çalışmayla doğrulandı.

This article was prepared based on field experiences and technical evaluations of the Spikedge engineering team.

Problem: Glass-to-Glass Gecikme Neden Kritiktir?

Tarımsal ilaçlama robotundan tele-operasyona kadar pek çok sistemde kamera görüntüsü ile aktüatör tepkisi arasındaki gecikme operasyonel verimliliği doğrudan etkiler. Ölçülen baseline: 180ms gecikme ile robot, 3 frame önceki görüntüye göre karar veriyordu.

Donanım ve Yazılım Ortamı

Bileşen Detay
Platform NVIDIA Jetson Orin NX 16GB
JetPack 6.2 (L4T 36.4.3)
Kamera Sony IMX678 4K — MIPI CSI-2 x4
ISP Output NV12 (4-lane @ 2.5Gbps)
GStreamer 1.22 (NVMM destekli)
Model YOLOv8n — TensorRT INT8
Ölçüm GstShark tracer + donanım timestamp karşılaştırması

Baseline: Neden 180ms?

İlk pipeline yapısı:

gst-launch-1.0 \
  nvarguscamerasrc ! \
  nvvidconv ! \
  x264enc tune=zerolatency ! \
  rtph264pay ! \
  udpsink host=192.168.1.100 port=5000

Sorunlar:

  1. x264enc yazılım encoder → CPU yükü %78, encode latency 48ms
  2. nvarguscamerasrc → ISP pipeline ek 35ms ekliyor
  3. nvvidconv dönüşümleri CPU üzerinden gidiyor, DMA atlanıyor

Latency Budget: Önce / Sonra

Aşama Önce Sonra
Kamera → ISP çıkışı 35ms 12ms
Format dönüşümü (nvvidconv) 18ms 2ms (DMA)
Encode (x264enc → nvv4l2h264enc) 48ms 8ms
RTP paketleme 4ms 4ms
Ağ (loopback test) 2ms 2ms
Decode (software) 38ms 18ms
Render 35ms 16ms
Toplam Glass-to-Glass 180ms 62ms

Optimizasyon 1: NVENC Hardware Encoder

gst-launch-1.0 \
  nvarguscamerasrc eeMode=0 ! \
  nvvidconv flip-method=0 ! \
  'video/x-raw(memory:NVMM), format=NV12, width=1920, height=1080' ! \
  nvv4l2h264enc \
    maxperf-enable=true \
    insert-sps-pps=true \
    iframeinterval=30 \
    bitrate=8000000 \
    preset-level=1 ! \
  rtph264pay config-interval=-1 ! \
  udpsink host=192.168.1.100 port=5000 sync=false async=false

Kritik parametreler:

  • maxperf-enable=true — NVENC encoder'ı düşük gecikme moduna alır
  • insert-sps-pps=true — her frame'de SPS/PPS gönderir; decoder yeniden senkronize olabilir
  • sync=false — sink timestamp senkronizasyonunu kapat (buffer bloat önlenir)
  • config-interval=-1 — SPS/PPS every keyframe

Optimizasyon 2: Zero-Copy NVMM Buffer

nvvidconv + memory:NVMM kombinasyonu verinin CPU'ya kopyalanmadan GPU belleğinde kalmasını sağlar:

# Kötü: CPU copy
nvarguscamerasrc ! nvvidconv ! video/x-raw, format=BGRx ! ...

# İyi: Zero-copy NVMM
nvarguscamerasrc ! nvvidconv ! 'video/x-raw(memory:NVMM), format=NV12' ! nvv4l2h264enc ...

NVMM pipeline'ında CPU encode yükü %78 → %12'ye düşer.

Optimizasyon 3: ISP Bypass (Düşük Latency Gerektiğinde)

Latency hedefi <50ms ise nvarguscamerasrc ISP pipeline'ı atla:

gst-launch-1.0 \
  v4l2src device=/dev/video0 ! \
  'video/x-raw, format=UYVY, width=1920, height=1080, framerate=60/1' ! \
  nvvidconv ! \
  'video/x-raw(memory:NVMM), format=NV12' ! \
  nvv4l2h264enc maxperf-enable=true insert-sps-pps=true ! \
  rtph264pay ! \
  udpsink host=192.168.1.100 port=5000 sync=false

ISP bypass ile kamera → encode süresi 53ms → 22ms'ye iner, ancak otomatik beyaz dengesi ve lens düzeltmesi devre dışı kalır.

GstShark ile Pipeline Profili

GST_DEBUG="GST_TRACER:7" \
GST_TRACERS="latency;queuelevel;framerate" \
gst-launch-1.0 [pipeline]

# Çıktı analizi
python3 gstshark-plot.py --type latency --output latency_trace.png

Sonuçlar (10.000 frame, 2.7 dakika)

Metrik Önce Sonra Delta
Glass-to-Glass (ortalama) 180ms 62ms −66%
Glass-to-Glass (P99) 243ms 84ms −65%
Encode Latency 48ms 8ms −83%
CPU Encode Yükü %78 %12 −66 puan
Throughput 23fps 60fps +161%

Tekrarlanabilirlik Notları

  • Test: loopback (encode → decode → render aynı cihaz, loopback via GStreamer)
  • JetPack 6.2 zorunludur; JetPack 5.x'te nvv4l2h264enc parametreleri farklıdır
  • nvarguscamerasrc eeMode=0: AE kapalı, sabit exposure — değişken ISP latency önlenir

İlgili Kaynaklar

Video pipeline gecikmeniz >100ms ise Mimari Denetim Talebi sayfasından bize ulaşın.

Continue Exploring

GStreamerJetson OrinNVENCVideoLatencyTensorRTJetPackDeep Dive

Frequently Asked Questions

Why is NVMM zero-copy important in GStreamer?+
NVMM (NVIDIA Memory Manager) transfers data between the Jetson SoC's ISP, NVENC, and GPU units without copying to CPU memory. Without NVMM, each conversion creates a GPU→CPU→GPU cycle adding ~18ms latency. With zero-copy, this drops to ~2ms and CPU load goes from 30-40% to under 5%.
How do you measure GStreamer pipeline latency on Jetson?+
Use the GstShark plugin or GST_DEBUG environment variable. For hardware-level measurement, compare nvarguscamerasrc source timestamps against nvoverlaysink output timestamps. Alternatively, GPIO toggle + oscilloscope measures frame capture→display time directly.
Why does 'Could not negotiate' error occur in NVMM pipelines?+
This error occurs when caps filters between elements don't specify 'memory:NVMM'. A single CPU-side element in the chain eliminates the zero-copy benefit. Explicit 'video/x-raw(memory:NVMM)' caps must be added after nvvidconv.

Spikedge Engineering

Using this technology in your own system?

Schedule a 1:1 technical analysis with Spikedge engineers.

Schedule Architecture Audit