Skip to content

Cum să extragi date din pipeline cu appsink în GStreamer

DodaTech Updated 2025-01-15 1 min read

In this tutorial, you'll learn about Cum să extragi date din pipeline cu appsink în GStreamer. We cover key concepts, practical examples, and best practices.

În acest ghid vei învăța cum să extragi date dintr-un pipeline folosind elementul appsink în GStreamer. Appsink permite aplicațiilor să primească buffer-e de date de la un pipeline GStreamer, fiind esențial pentru procesare personalizată în cod.

The Wrong Way

Folosirea appsink fără a configura capabilitățile sau fără a consuma buffer-ele:

import gi
gi.require_version('Gst', '1.0')
from gi.repository import Gst

Gst.init(None)
pipeline = Gst.parse_launch("videotestsrc ! appsink name=sink")
pipeline.set_state(Gst.State.PLAYING)
# Nu se citesc buffer-ele — pipeline-ul se blochează

Pipeline-ul se blochează când buffer-ele umplu appsink-ul.

The Right Way

Citirea corectă a buffer-elor din appsink:

import gi
gi.require_version('Gst', '1.0')
from gi.repository import Gst

Gst.init(None)
pipeline = Gst.parse_launch("videotestsrc num-buffers=10 ! appsink name=sink emit-signals=true")
pipeline.set_state(Gst.State.PLAYING)

appsink = pipeline.get_by_name("sink")
for _ in range(10):
    sample = appsink.emit("pull-sample")
    if sample:
        buf = sample.get_buffer()
        print(f"Buffer primit: dimensiune={buf.get_size()}, durata={buf.duration}")

pipeline.set_state(Gst.State.NULL)

Output:

Buffer primit: dimensiune=307200, durata=33333333
Buffer primit: dimensiune=307200, durata=33333333
...

Prevenție

  • Setează emit-signals=true pentru a primi notificări când buffer-ele sunt disponibile
  • Folosește pull-sample pentru a extrage buffer-e blocant
  • Pentru non-blocant, folosește semnalul new-sample
  • Specifică caps pe appsink pentru a controla formatul datelor primite
  • Consumă buffer-ele suficient de rapid pentru a preveni blocarea pipeline-ului

Greșeli Comune

  1. Fără consum de buffer-e — neconsumarea buffer-elor blochează pipeline-ul
  2. Pull-sample fără verificarepull-sample poate returna None la finalul streamului
  3. Caps nepotrivite — formatul buffer-elor poate fi diferit de cel așteptat
  4. Memorie neeliberată — buffer-ele trebuie procesate și eliberate rapid

FAQ

### Cum citesc buffer-e non-blocant din appsink?

Conectează-te la semnalul new-sample al appsink-ului. Semnalul este emis de fiecare dată când un nou buffer este disponibil.

Pot configura appsink să emită semnale în thread-ul principal?

Da, setează emit-signals=true și sync=true pentru a primi semnale sincronizate cu clock-ul pipeline-ului.

Care este diferența dintre appsink și fakesink?

Fakesink consumă buffer-ele și le ignorează. Appsink le pune la dispoziția aplicației pentru procesare personalizată.

Construit de dezvoltatorii Doda Browser, DodaZIP și Durga Antivirus Pro. Uneltele DodaTech se integrează perfect cu GStreamer pentru productivitate și securitate sporite.

Built by the developers of DodaTech

Doda Browser, DodaZIP & Durga Antivirus Pro