InterpolationControlSource与Gst.parse_launch()

时间:2017-03-13 21:51:39

标签: gstreamer python-gstreamer gstreamer-1.0

我的应用程序(在Python中),加载Gstreamer库,解析并启动一个管道规范,该规范在来自MP4文件的准备好的视频之上复制来自SRT文件的字幕,然后创建一个绑定到''的控制源。 视频混合器元素的接收器垫的alpha'属性,链接到字幕图像源。

首先,我写了一个小proof-of-concept,就像一个冠军。如果您可以使用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)

两个流水线之间的一个区别在于,在第一个示例中,视频混合器垫是请求垫。但在真正的应用程序中,它们变成了静态垫。并且日志语句中只存在“sink_1”。

DEBUG, ['src', 'sink_1']

我不确定为什么会这样或是否有所作为。

当我在网络服务器中运行应用程序并在浏览器中签入时,会显示字幕,但它们不会淡入或淡出。

我检查了时间戳,看起来很棒。它们以纳秒为单位(10 ^ 9)。

set fade-in from 2440000000 to 3440000000
set fade-out from 2375000000 to 4375000000
set fade-in from 7476000000 to 8476000000
...

那么我遗弃了什么石头?

1 个答案:

答案 0 :(得分:0)

第一个和第二个原型之间的另一个重大差异是videotestsrc更改为filesrc ! decodebingst_parse_launch无法立即将decodebinvideomixer联系起来。会发生什么:

  • 解析了管道,但是解码器不知道filesrc的内容,直到它解复用它为止。它可以是音频或Powerpoint演示文稿或PGP签名或任何东西。所以它最初没有返回src pad。

  • 你玩管道。 decodebin开始从filesrc接收数据,将内容标识为mp4,并将其解复用。它发现它的视频内容与videomixer的打击垫相匹配,并与第一个打开的打击垫连接。

所以你可能需要做的就是在decodebin上监听pad添加的事件,检查它是否是正确的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有一个&#34;有时&#34; pad模板与subparse上出现的常量垫相对应:

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