我想拍摄视频文件并叠加淡入和淡出的字幕。
我刚刚开始学习如何与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但是他们没有告诉我这是否会在管道运行后运行。
答案 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)