1

我想拍摄一个视频文件并覆盖淡入淡出的字幕。

我刚刚开始学习如何使用 Gstreamer。

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

videomixer sink pad 确实具有 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() 获取任何命名元素,然后使用该值访问焊盘“sink_1”。

一旦我做到了这一点,我是否能够从接收计时器事件的事件处理程序中动态修改该 alpha 值?videomixer 元素会立即响应该垫属性的变化吗?有没有其他人这样做过?

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

4

2 回答 2

1

是的,它会起作用

videomixer pad 动态响应变化;我已经用 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 属性;它会动态更新,看起来很流畅。

于 2017-02-14T11:27:36.083 回答
1

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

于 2017-03-29T18:37:20.803 回答