Задержка одной ветви тройника на n секунд в конвейере GStreamer - PullRequest
0 голосов
/ 03 августа 2020

Предположим, что конвейер выглядит следующим образом:

videotestsrc +-> timeoverlay +-> tee +-> queue +-> autovideosink
                                     |
                                     +-> queue +-> autovideosink

Первая ветвь tee должна действовать как сквозная, просто позволяя сэмплам течь по остальной части конвейера. Вторая ветвь должна быть очень похожей, с той лишь разницей, что она должна иметь задержку в n секунд относительно первой ветви.

К сожалению, я не смог добиться этого самостоятельно.

Я пробовал установить свойства max-size-* и min-threshold-time для queue (как предложено в этот ответ) второй ветви, но это не сработало.

I также пытался изменить время работы второй ветви через queue.get_sink_pads().first().unwrap().set_offset(-5000000000), но, увы, это тоже не сработало.

Я также попытался прикрепить контактный датчик и повторно поставить метку буферов, проходящих через приемную площадку queue второй ветви будет n секунд в будущем, надеясь, что они будут сохранены на queue до тех пор, пока время работы конвейера не сравняется, но это также не сработало (я предполагаю, что это не сработало потому что, хотя элемент tee создает отдельные ветки, буферы по-прежнему используются через ссылку).

Я приложил ниже фрагмент кода, показывающий ход выполнения. (честно говоря, это немного).

Можно ли добиться такого поведения, не создавая плагин с нуля?

Чтобы попробовать реализовать это поведение, я начал с создания экземпляров базовых c элементов ...

let videotestsrc = ElementFactory::make("videotestsrc", None)?;
let timeoverlay = ElementFactory::make("timeoverlay", None)?;
let tee = ElementFactory::make("tee", None)?;

... затем я создал экземпляр конвейера ...

let pipeline = Pipeline::new(None);
pipeline.add(&videotestsrc)?;
pipeline.add(&timeoverlay)?;
pipeline.add(&tee)?;

... затем я создал ветки ...

{
    let queue = ElementFactory::make("queue", None)?;
    let autovideosink = ElementFactory::make("autovideosink", None)?;

    pipeline.add(&queue)?;
    pipeline.add(&autovideosink)?;

    tee.link(&queue)?;
    queue.link(&autovideosink)?;
}

{
    let queue = ElementFactory::make("queue", None)?;
    let autovideosink = ElementFactory::make("autovideosink", None)?;

    // queue.set_property_from_str("leaky", "downstream");
    // queue.set_property("max-size-buffers", &0u32)?;
    // queue.set_property("max-size-bytes", &0u32)?;
    // queue.set_property("max-size-time", &0u64)?;
    // queue.set_property("min-threshold-time", &5000000000u64)?;

    pipeline.add(&queue)?;
    pipeline.add(&autovideosink)?;

    tee.link(&queue)?;
    queue.link(&autovideosink)?;
}

Комментарии ко второй ветке взяты из безуспешной попытки.

1 Ответ

1 голос
/ 04 августа 2020

Я также пытался изменить время работы второй ветви через queue.get_sink_pads (). First (). Unwrap (). Set_offset (-5000000000), но, увы, это тоже не сработало.

Это почти решение: установите положительное значение, и оно должно работать. Сейчас вы переносите это в прошлое. И, кроме того, убедитесь, что: а) установлено смещение на исходной панели очереди и б) что очередь может содержать, по крайней мере, столько данных, сколько смещение, которое вы устанавливаете.

...