如何动态修改videomixer sink pad alpha值

时间:2017-02-13 22:04:41

标签: gstreamer-1.0

我想拍摄视频文件并叠加淡入和淡出的字幕。

我刚刚开始学习如何与Gstreamer合作。

到目前为止,我已经设法将一个管道组合在一起,该管道将 textrender 元素绘制的字幕流合成到具有 videomixer 元素的原始视频流上。不幸的是,textrender及其姐妹元素 textoverlay 没有淡入/淡出功能。

视频混合器接收器垫具有alpha属性。现在,我已将名为videomixer.sink_1的pad的alpha值设置为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

我正在寻找一种方法来随时间动态修改该alpha值,以便我可以在适当的时间使字幕组件淡入淡出。 (我将分别解析SRT文件,以确定何时淡入淡出开始和结束。)

我正在研究GstBin C API(我的实际代码是Python)。我想在使用Gst.parse_launch()创建管道后,我可以使用gst_get_bin_by_name()获取任何命名元素,然后使用该值访问pad" sink_1"。

一旦我走得那么远,我能否从接收定时器事件的事件处理程序动态修改该alpha值?视频混合器元件会立即响应该pad属性的变化吗?还有其他人这样做过吗?

我在这里找到了部分答案:https://stackoverflow.com/a/17331845/270511但是他们没有告诉我这是否会在管道运行后运行。

2 个答案:

答案 0 :(得分:1)

是的,它会起作用

视频混合器垫动态响应变化;我用alpha和position属性完成了这个。可以使用

更改打击垫属性
    g_object_set (mix_sink_pad, "alpha", 0.5, NULL);

我正在使用C,但是用于访问bin和pad声音的python策略是正确的。我的gstreamer代码根据来自udp套接字的输入做出响应,但是计时器事件将完美地运行。例如,如果您想每100毫秒更改一次alpha值,可以执行类似这样的操作

    g_timeout_add_seconds (100, alpha_changer_cb, loop);

然后,您可以使用回调中的g_object_set更改alpha属性;它会动态更新,看起来非常流畅。

答案 1 :(得分:1)

我让这个工作。您可以在这篇文章中阅读:https://westside-consulting.blogspot.com/2017/03/getting-to-know-gstreamer-part-4.html