2017-02-13 1 views
1

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

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

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

Подставка для видеомикшера имеет свойство alpha. На данный момент я установил значение альфа-диапазона для пэда с именем 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-файл отдельно, чтобы определить, когда начинаются и заканчиваются затухания.)

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

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

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

ответ

1

Да, это будет работать.

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

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

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

g_timeout_add_seconds (100, alpha_changer_cb, loop); 

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

+0

Это фантастика. Спасибо. Мне интересно, есть ли более эффективный способ сделать это без обратных вызовов. Каждый посетитель сайта будет просматривать одно и то же видео и саундтрек, но должен видеть пользовательские субтитры, уникальные для этого посетителя. Тем не менее, время субтитров никогда не меняется, поэтому эффекты затухания всегда должны происходить в тех же местах. Может ли быть способ сделать это с третьей дорожкой, которая контролирует непрозрачность субтитров, не затрагивая исходное видео (нижний слой)? Должен ли я начать новый вопрос? –

+1

Я не эксперт, но есть определенно более эффективные способы сделать это без обратных вызовов; большая часть моего опыта gstreamer - это видео в реальном времени, поэтому я не слишком хорошо знаком с событиями времени. Третий трек звучит как правильная идея, и вы можете конечно контролировать третий трек, не влияя на исходный уровень. Возможно, вы уже знакомы с ним, но руководство по приложению gstreamer чрезвычайно полезно и имеет некоторые очень хорошие примеры: https://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/manual.pdf Возможно, проверьте это а также https://github.com/voc/voctomix –

Смежные вопросы