Gstreamer 带Gst.parse_launch()的InterpolationControlSource

Gstreamer 带Gst.parse_launch()的InterpolationControlSource,gstreamer,python-gstreamer,gstreamer-1.0,Gstreamer,Python Gstreamer,Gstreamer 1.0,我的应用程序(Python)加载Gstreamer库,解析并启动一个管道规范,该规范将SRT文件中的字幕合成到MP4文件中准备好的视频上,然后创建一个控制源,该控制源绑定到链接到字幕图像源的videomixer元素的sink pad的“alpha”属性 首先,我写了一本小册子,它像一个冠军一样工作。如果您可以在X-windows服务器上运行它(例如在Unix或Linux中),您将在绿色背景上看到一个黑色正方形。一秒钟后,黑色方块在几秒钟内逐渐消失 我的应用程序有一个更复杂的管道。以下是相关代码的

我的应用程序(Python)加载Gstreamer库,解析并启动一个管道规范,该规范将SRT文件中的字幕合成到MP4文件中准备好的视频上,然后创建一个控制源,该控制源绑定到链接到字幕图像源的videomixer元素的sink pad的“alpha”属性

首先,我写了一本小册子,它像一个冠军一样工作。如果您可以在X-windows服务器上运行它(例如在Unix或Linux中),您将在绿色背景上看到一个黑色正方形。一秒钟后,黑色方块在几秒钟内逐渐消失

我的应用程序有一个更复杂的管道。以下是相关代码的摘要:

pipeline_spec = '''
videomixer name=mixer ! ... other stuff downstream
filesrc location=sample_videos/my-video.mp4 ! decodebin name=demuxer ! mixer.sink_0
filesrc location=subtitles.srt ! subparse ! textrender ! mixer.sink_1
demuxer. ! audioconvert ! audioresample ! faac ! muxer.
'''

self.pipeline = Gst.parse_launch(pipeline_spec)
mixer = self.pipeline.get_by_name('mixer')
#vidpad = mixer.get_static_pad('sink_0')
srtpad = mixer.get_static_pad('sink_1')
self.logger.debug([ pad.name for pad in mixer.pads ])

cs = GstController.InterpolationControlSource()
cs.set_property('mode', GstController.InterpolationMode.LINEAR)
binding = GstController.DirectControlBinding.new(srtpad, 'alpha', cs)
cs.add_control_binding(binding)

with open(srtfilepath) as srtfile:
    for timestamps in parsesrt.parse(srtfile):
        start, end = timestamps
        self._set_subtitle_fade(alpha_cs, start, end)

def _set_fade_effect(self, controlsource, start, duration, alpha_begin, alpha_end):
    controlsource.set(start, alpha_begin)
    controlsource.set(start + duration, alpha_end)
    self.logger.debug('set fade-{0} from {1} to {2}'.format('in' if alpha_begin < alpha_end else 'out', start, start + duration))

def _set_subtitle_fade(self, controlsource, start_subtitle, end_subtitle):
    self._set_fade_effect(controlsource, start_subtitle, self.DURATION_FADEIN, 0, 1)
    self._set_fade_effect(controlsource, end_subtitle - self.DURATION_FADEOUT, self.DURATION_FADEOUT, 1, 0)
我不知道为什么会这样,也不知道这是否会带来不同

当我在web服务器上运行应用程序并在浏览器中签入时,字幕会出现,但不会淡入或淡出

我检查了时间戳,它们看起来不错。它们的单位是纳秒(10^9)


那么,我还没有找到什么石头呢

第一个原型和第二个原型之间的另一大区别是
videotestsrc
更改为
filesrc!decodebin
gst\u parse\u launch
不会立即将
decodebin
连接到
videomixer
。将会发生的是:

  • 管道被解析,但decodebin在对其解复用之前不知道filesrc的内容。它可以是音频、Powerpoint演示文稿、PGP签名或任何东西。因此,它最初不返回src焊盘

  • 你在管道上演奏
    decodebin
    开始从filesrc接收数据,将内容标识为mp4,并对其进行解复用。它发现它的视频内容与
    videomixer
    的pad匹配,并连接到第一个打开的pad

所以你可能需要做的是在decodebin上监听pad added事件,检查它是否是正确的pad,然后进行绑定

def decodebin_pad_added(self, decodebin, pad):
  #return if pad is wrong type

  #make the binding to the pad

decodebin.connect("pad_added", decodebin_pad_added)
您可以通过在相关元件上运行
gst-inspect-1.0
并检查焊盘来了解此行为。您可以看到decodebin有一个“有时”pad模板,而子parse上有一个常量pad:

subparse:
Pads:
...
  SRC: 'src'
    Implementation:
      Has custom eventfunc(): gst_sub_parse_src_event
      Has custom queryfunc(): gst_sub_parse_src_query
      Has custom iterintlinkfunc(): gst_pad_iterate_internal_links_default
    Pad Template: 'src'

decodebin:
Pad Templates:
  SRC template: 'src_%u'
    Availability: Sometimes
    Capabilities:
      ANY

谢谢@mpr!我会试试看,然后再打给你。gst-decodebin显示了各种有用的优点,比如pad附加信号。但你们有什么版本的gst插件库呢。我的版本没有为subparse.src pad显示“custom eventfunc()”。我用的是1.8.1版的插件,我用的是1.6版。我不确定您是否需要担心这些自定义函数,认为它们只是信息。我想将我的控制源连接到接收渲染字幕文本的视频混合器接收器。我为videomixer上添加的pad设置了一个监听器,但该监听器只被调用一次,并且pad.get_name()==>“sink_0”。但应该有第二个水槽,“水槽1”。我是否遗漏了其他内容?我猜您没有为sink_1添加
pad
事件,因为您是在管道解析和连接事件侦听器之后添加事件侦听器的。对于这个,也许您可以使用
gst\u element\u get\u static\u pad()
按名称获取它。
def decodebin_pad_added(self, decodebin, pad):
  #return if pad is wrong type

  #make the binding to the pad

decodebin.connect("pad_added", decodebin_pad_added)
subparse:
Pads:
...
  SRC: 'src'
    Implementation:
      Has custom eventfunc(): gst_sub_parse_src_event
      Has custom queryfunc(): gst_sub_parse_src_query
      Has custom iterintlinkfunc(): gst_pad_iterate_internal_links_default
    Pad Template: 'src'

decodebin:
Pad Templates:
  SRC template: 'src_%u'
    Availability: Sometimes
    Capabilities:
      ANY