我的应用程序(在 Python 中)加载 Gstreamer 库,解析并启动管道规范,该规范将 SRT 文件中的字幕合成到 MP4 文件中准备好的视频之上,然后创建一个与“alpha”属性绑定的控制源链接到字幕图像源的videomixer元素的 sink pad 。
首先,我写了一个小型的概念验证,它的工作原理就像一个冠军。如果您可以使用 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)
两个管道之间的一个区别是,在第一个示例中,videomixer pad 是request pad。但在真正的应用程序中,它们变成了静态垫。并且日志语句中只存在“sink_1”。
DEBUG, ['src', 'sink_1']
我不确定为什么会这样,或者它是否有所作为。
当我在 Web 服务器中运行应用程序并在浏览器中签入时,会出现字幕,但不会淡入或淡出。
我检查了时间戳,它们看起来不错。它们以纳秒 (10^9) 为单位。
set fade-in from 2440000000 to 3440000000
set fade-out from 2375000000 to 4375000000
set fade-in from 7476000000 to 8476000000
...
那么,我还有什么石头没有翻过来?