2017-02-13 86 views
1

我想拍摄一个视频文件并覆盖淡入和淡出的字幕。如何动态修改videomixer水槽垫alpha值

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

到目前为止,我已经成功地把一个流水线composits由textrender元素绘制到与videomixer元素的原始视频流的字幕流。不幸的是,textrender和它的姐妹元素textoverlay没有淡入/淡出功能。

该videomixer水槽垫有一个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_1“sink_1”。

一旦我已经得到那么多,我将能够从接收计时器事件的事件处理程序中动态修改该alpha值吗?视频混合器元件是否会立即响应该键盘属性的变化?有没有其他人做到这一点?

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

回答

1

是的,它会工作

该videomixer垫动态响应变化;我已经完成了alpha和position属性。该垫的属性可以改变使用

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

我使用C,但您的Python策略访问箱和垫的声音正确。我的gstreamer代码根据来自udp套接字的输入做出响应,但是计时器事件可以很好地工作。例如,如果你想改变alpha值每100ms,你可以做这样的事情

g_timeout_add_seconds (100, alpha_changer_cb, loop); 

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

+0

太棒了。谢谢。我想知道是否有更有效的方法来完成这个没有回调。该网站的每位访问者都将查看相同的视频和配乐,但应该看到该访问者独有的自定义字幕。然而,字幕的时间从不变化,所以渐变效果应该总是在相同的地方发生。可能有一种方法可以实现这一点,第三个轨道控制字幕的不透明度,而不影响原始视频(底层)?我应该开始一个新的问题吗? –

+1

我不是专家,但肯定有更有效的方法来做到这一点,没有回调;我的gstreamer的大部分体验都是带有实时视频,所以我对时间事件不太熟悉。第三首曲目听起来像是正确的想法,你当然可以控制第三首曲目而不会影响原始图层。您可能已经熟悉它了,但gstreamer应用程序手册非常有用,并且有一些非常好的示例:https://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/manual.pdf也许检查一下项目以及https://github.com/voc/voctomix –