Атрибути для кожного кадру.
Деякі камери описують кожен кадр у потоці даних, який його передає: номер послідовності, мітку часу захоплення, назву каналу. Neat може передавати вибраний набір цих значень під час декодування та повертати їх для кадру, якому вони належать, у Sample.
Sample::attributes — це просте відображення рядків у рядки. Neat копіює його, зберігає зв’язок із відповідним кадром і очищає, коли буфер призначення повторно використовується. Він ніколи не розбирає, не об’єднує та не переінтерпретує значення. Ключі та значення повинні бути дійсним форматом UTF-8 і не можуть містити вбудований нульовий байт, оскільки GStreamer не може зберегти їх у рядковому представленні.
Що гарантується?
Обрані заголовки окремих частин багатокомпонентного повідомлення залишаються пов’язаними з відповідними декодованими кадрами через шлях за замовчуванням для
HttpMjpegDecodedInput, чергу/гілку та матеріалізовані межі Core Sample-to-GStreamer.
Це вся суть цієї версії. Все, що виходить за її межі, перелічено в розділі Непідтримувані шляхи., і Neat не зможе створити граф, а натомість просто видалить атрибути.
Увімкнення режиму запису
За замовчуванням функція захоплення вимкнена. Щоб її ввімкнути, потрібно вказати назви заголовків, які ви хочете використовувати.
#include "nodes/groups/HttpMjpegDecodedInput.h"
simaai::neat::nodes::groups::HttpMjpegDecodedInputOptions opt;
opt.url = "http://camera.local/stream";
opt.header_capture.headers = {"Image-Index", "Image-Time"};
auto source = simaai::neat::nodes::groups::HttpMjpegDecodedInput(opt);
Перечитуючи їх:
simaai::neat::Sample sample;
if (run.pull(1000, sample) == simaai::neat::PullStatus::Ok) {
const auto it = sample.attributes.find("image-index");
if (it != sample.attributes.end()) {
// it->second is the value this frame was sent with.
}
}
Те саме відбувається в Python, де attributes є динамічною структурою даних — призначення елементів впливає на
основний Sample, і призначення словника замінює його вміст:
import pyneat
opt = pyneat.HttpMjpegDecodedInputOptions()
opt.url = "http://camera.local/stream"
opt.header_capture.headers = ["Image-Index", "Image-Time"]
source = pyneat.groups.http_mjpeg_decoded_input(opt)
# ... later, on a pulled sample:
index = sample.attributes.get("image-index")
sample.attributes["image-index"] = "42" # reaches the Sample
sample.attributes = {"image-time": "..."} # replaces the whole map