Предположим, что конвейер выглядит следующим образом:
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)?;
}
Комментарии ко второй ветке взяты из безуспешной попытки.