Как динамически изменить альфа-значение панели раковины видеомикшера

Я хочу взять видеофайл и наложить субтитры, которые появляются и исчезают.

Я только начинаю учиться работать с Gstreamer.

На данный момент мне удалось собрать конвейер, объединяющий поток субтитров, нарисованный элементом textrender, с исходным видеопотоком с помощью элемента videomixer. К сожалению, textrender и родственный ему элемент textoverlay не имеют функции постепенного появления/исчезновения.

Панель раковины видеомикшера имеет альфа-свойство. На данный момент я установил альфа-значение пэда с именем videomixer.sink_1 на 1,0. Вот версия этого конвейера для командной строки:

#!/bin/bash

gst-launch-1.0 \
    filesrc location=sample_videos/my-video.mp4 ! decodebin ! mixer.sink_0 \
    filesrc location=subtitles.srt ! subparse ! textrender !  mixer.sink_1 \
    videomixer name=mixer sink_0::zorder=2 sink_1::zorder=3 sink_1::ypos=-25 sink_1::alpha=1 \
        ! video/x-raw, height=540 \
        ! videoconvert ! autovideosink

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

Я изучаю GstBin C API (фактический код написан на Python). Я думаю, что после создания конвейера с помощью Gst.parse_launch() я могу получить любой именованный элемент с помощью gst_get_bin_by_name(), а затем использовать это значение для доступа к панели «sink_1».

Как только я зайду так далеко, смогу ли я динамически изменять это альфа-значение из обработчика событий, который получает события таймера? Будет ли элемент видеомикшера мгновенно реагировать на изменения свойств этой площадки? Кто-нибудь еще сделал это?

Здесь я нашел частичные ответы: https://stackoverflow.com/a/17331845/270511, но они не говорят меня, если это будет работать после запуска конвейера.


person Lawrence I. Siden    schedule 13.02.2017    source источник


Ответы (2)


Да, это сработает.

Пэды видеомикшера динамически реагируют на изменения; Я сделал это как со свойствами альфы, так и с позицией. Свойства пэда можно изменить с помощью

    g_object_set (mix_sink_pad, "alpha", 0.5, NULL);

Я использую C, но ваша стратегия Python для доступа к корзине и блокноту звучит правильно. Мой код gstreamer отвечает на основе входных данных из сокета udp, но события таймера будут работать отлично. Например, если вы хотите изменять альфа-значение каждые 100 мс, вы можете сделать что-то вроде этого.

    g_timeout_add_seconds (100, alpha_changer_cb, loop);

Затем вы можете изменить альфа-свойство, используя g_object_set в обратном вызове; он будет обновляться динамически и выглядит очень гладко.

person Geige V    schedule 14.02.2017
comment
Это чудесно. Спасибо. Мне интересно, есть ли более эффективный способ сделать это без обратных вызовов. Каждый посетитель сайта будет просматривать одно и то же видео и звуковую дорожку, но должен видеть индивидуальные субтитры, уникальные для этого посетителя. Однако синхронизация субтитров никогда не меняется, поэтому эффекты затухания всегда должны происходить в одних и тех же местах. Может ли быть способ сделать это с помощью третьей дорожки, которая контролирует непрозрачность субтитров, не затрагивая исходное видео (нижний слой)? Должен ли я начать новый вопрос? - person Lawrence I. Siden; 14.02.2017
comment
Я не эксперт, но определенно есть более эффективные способы сделать это без обратных вызовов; большая часть моего опыта работы с gstreamer связана с живым видео, поэтому я не слишком хорошо знаком с синхронизированными событиями. Третья дорожка звучит как правильная идея, и вы, безусловно, можете управлять третьей дорожкой, не затрагивая исходный слой. Возможно, вы уже знакомы с ним, но руководство по применению gstreamer чрезвычайно полезно и содержит несколько очень хороших примеров: gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/ Возможно, стоит также ознакомиться с этим проектом github.com/voc/voctomix - person Geige V; 15.02.2017
comment
как вы получили mix_sink_pad здесь? g_object_set (mix_sink_pad, альфа, 0,5, NULL); - person EJL; 01.07.2020

Я заставил это работать. Вы можете прочитать об этом в этом сообщении: https://westside-consulting.blogspot.com/2017/03/getting-to-know-gstreamer-part-4.html

person Lawrence I. Siden    schedule 29.03.2017
comment
Понравился пост в блоге, обязательно буду использовать его в качестве справочного материала для будущих проектов gstreamer. - person Geige V; 06.04.2017