GStreamer&的视频转换GNonLin无法正常工作 [英] Video Transitions with GStreamer & GNonLin not working

查看:137
本文介绍了GStreamer&的视频转换GNonLin无法正常工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在尝试将2个视频与gstreamer结合在一起, 使用gstreamer&在它们之间的短暂过渡(如smpte) gnonlin在python中.但是我无法使gnloperation/smpte过渡正常工作.

目标

下面是一个程序.我希望它播放一个文件的前4秒,并在2秒开始播放到另一个文件的快速过渡(持续2秒). (因此第二个文件将在整个播放过程中播放2秒钟,但在2秒钟的转换过程中将被显示"),并且在转换完成后,应显示第二个文件的2秒钟.

这基于 Python中的另一个gstreamer/gnonlin脚本.我在 gstreamer-devel列表上问了这个问题(和再次),并在这里尝试. /p>

问题

转换尚未完成.过渡过程持续约0.5秒,然后视频1播放约1.5秒,然后视频2切入.我尝试更改控制器的结束位置(例如更改为controller.set("position", 0.5 * gst.SECOND, 0.0)),然后 过渡过程在0.5秒内完成,但是一旦过渡过程完成,视频1就会再次开始播放一小段时间,然后视频2就会开始播放.

考虑到视频转换可能被限制为0.5秒,我将gnloperation更改为0.5秒,但是仍然存在相同的未完成问题,只是转换仅播放了大约0.3秒,这是整个视频播放过程的一部分1踢了一点,然后播放了视频2.

脚本

#! /usr/bin/python
import gst, gobject
gobject.threads_init()

comp  = gst.element_factory_make("gnlcomposition", "composition")

gsrc1 = gst.element_factory_make("gnlfilesource")
gsrc1.props.location = "file:///home/rory/helmetcam/dingle-tom/vshort01.mov"
gsrc1.props.start          = 0
gsrc1.props.duration       = 4 * gst.SECOND
gsrc1.props.media_start    = 0
gsrc1.props.media_duration = 4 * gst.SECOND
gsrc1.props.priority       = 3
comp.add(gsrc1)


gsrc2 = gst.element_factory_make("gnlfilesource")
gsrc2.props.location = "file:///home/rory/helmetcam/dingle-tom/vshort02.mov"
gsrc2.props.start          = 2 * gst.SECOND
gsrc2.props.duration       = 6 * gst.SECOND
gsrc2.props.media_start    = 0
gsrc2.props.media_duration = 2 * gst.SECOND
gsrc2.props.priority       = 2
comp.add(gsrc2)


bin = gst.Bin()
alpha1 = gst.element_factory_make("alpha")
queue = gst.element_factory_make("queue")
smpte  = gst.element_factory_make("smptealpha")
smpte.props.type = 21
mixer  = gst.element_factory_make("videomixer")

bin.add(alpha1, queue, smpte, mixer)
alpha1.link(mixer)
queue.link(smpte)
smpte.link(mixer)

controller = gst.Controller(smpte, "position")
controller.set_interpolation_mode("position", gst.INTERPOLATE_LINEAR)
controller.set("position", 0, 1.0)
controller.set("position", 2.0 * gst.SECOND, 0.0)

bin.add_pad(gst.GhostPad("sink1", alpha1.get_pad("sink")))
bin.add_pad(gst.GhostPad("sink2", queue.get_pad("sink")))
bin.add_pad(gst.GhostPad("src",   mixer.get_pad("src")))

op = gst.element_factory_make("gnloperation")
op.add(bin)
op.props.start          = 2 * gst.SECOND
op.props.duration       = 2 * gst.SECOND
op.props.media_start    = 0
op.props.media_duration = 2 * gst.SECOND
op.props.priority       = 1
comp.add(op)

# create the backend
color= gst.element_factory_make("ffmpegcolorspace")
enc = gst.element_factory_make("theoraenc")
mux = gst.element_factory_make("oggmux")
sink = gst.element_factory_make("filesink")
sink.props.location = "./transitions-between-two.ogv"
pipeline = gst.Pipeline()
pipeline.add(comp, color, enc, mux, sink)
color.link(enc)
enc.link(mux)
mux.link(sink)

def on_pad(comp, pad, elements):
    convpad = elements.get_compatible_pad(pad, pad.get_caps())
    pad.link(convpad)
comp.connect("pad-added", on_pad, color)

# now run the pipeline
loop = gobject.MainLoop(is_running=True)
bus = pipeline.get_bus()
bus.add_signal_watch()
def on_message(bus, message, loop):
    if message.type == gst.MESSAGE_EOS:
        loop.quit()
    elif message.type == gst.MESSAGE_ERROR:
        print message
        loop.quit()
bus.connect("message", on_message, loop)
pipeline.set_state(gst.STATE_PLAYING)
loop.run()
pipeline.set_state(gst.STATE_NULL)

解决方案

问题似乎出在第二个源文件的属性中.

代替:

gsrc2.props.start          = 2 * gst.SECOND
gsrc2.props.duration       = 6 * gst.SECOND
gsrc2.props.media_start    = 0
gsrc2.props.media_duration = 2 * gst.SECOND
gsrc2.props.priority       = 2

尝试:

gsrc2.props.start          = 2 * gst.SECOND
gsrc2.props.duration       = 4 * gst.SECOND
gsrc2.props.media_start    = 0
gsrc2.props.media_duration = 4 * gst.SECOND
gsrc2.props.priority       = 2

这似乎对我来说是预期的.

I've been trying to combine 2 videos together with gstreamer with a short transition (like smpte) between them using gstreamer & gnonlin in python. However I can't get the gnloperation/smpte transition to work.

Goal

Below is a programme. I want it to play the first 4 sec of one file, and at 2 sec to start doing a smpte transition (that lasts for 2 seconds) to another file. (so the second file will start playing 2 seconds into the whole thing but be 'revealed' over the course of the 2 second transition), and after the transition is finished, the 2 sec of the 2nd file on it's own should be shown.

This is based on another gstreamer/gnonlin script in python. I have asked this question on the gstreamer-devel list (and again), and am trying here.

Problem

The transition doesn't finish. The transition runs for about 0.5 seconds, then video 1 plays for ~ 1.5 sec and then video 2 cuts in. I've tried changing the end position of the controller (e.g. to controller.set("position", 0.5 * gst.SECOND, 0.0)), and the transition completes in the 0.5 sec, but as soon as the transition finish, video 1 starts playing again for a little bit, then video 2 starts playing.

Thinking that maybe the video transition is limited to 0.5 sec, I changed the gnloperation to 0.5 sec, however the same non-finishing problem persists, except that the transition only plays for about 0.3 sec, and part of the way through video 1 kicks in for a little bit, and then video 2 plays.

Script

#! /usr/bin/python
import gst, gobject
gobject.threads_init()

comp  = gst.element_factory_make("gnlcomposition", "composition")

gsrc1 = gst.element_factory_make("gnlfilesource")
gsrc1.props.location = "file:///home/rory/helmetcam/dingle-tom/vshort01.mov"
gsrc1.props.start          = 0
gsrc1.props.duration       = 4 * gst.SECOND
gsrc1.props.media_start    = 0
gsrc1.props.media_duration = 4 * gst.SECOND
gsrc1.props.priority       = 3
comp.add(gsrc1)


gsrc2 = gst.element_factory_make("gnlfilesource")
gsrc2.props.location = "file:///home/rory/helmetcam/dingle-tom/vshort02.mov"
gsrc2.props.start          = 2 * gst.SECOND
gsrc2.props.duration       = 6 * gst.SECOND
gsrc2.props.media_start    = 0
gsrc2.props.media_duration = 2 * gst.SECOND
gsrc2.props.priority       = 2
comp.add(gsrc2)


bin = gst.Bin()
alpha1 = gst.element_factory_make("alpha")
queue = gst.element_factory_make("queue")
smpte  = gst.element_factory_make("smptealpha")
smpte.props.type = 21
mixer  = gst.element_factory_make("videomixer")

bin.add(alpha1, queue, smpte, mixer)
alpha1.link(mixer)
queue.link(smpte)
smpte.link(mixer)

controller = gst.Controller(smpte, "position")
controller.set_interpolation_mode("position", gst.INTERPOLATE_LINEAR)
controller.set("position", 0, 1.0)
controller.set("position", 2.0 * gst.SECOND, 0.0)

bin.add_pad(gst.GhostPad("sink1", alpha1.get_pad("sink")))
bin.add_pad(gst.GhostPad("sink2", queue.get_pad("sink")))
bin.add_pad(gst.GhostPad("src",   mixer.get_pad("src")))

op = gst.element_factory_make("gnloperation")
op.add(bin)
op.props.start          = 2 * gst.SECOND
op.props.duration       = 2 * gst.SECOND
op.props.media_start    = 0
op.props.media_duration = 2 * gst.SECOND
op.props.priority       = 1
comp.add(op)

# create the backend
color= gst.element_factory_make("ffmpegcolorspace")
enc = gst.element_factory_make("theoraenc")
mux = gst.element_factory_make("oggmux")
sink = gst.element_factory_make("filesink")
sink.props.location = "./transitions-between-two.ogv"
pipeline = gst.Pipeline()
pipeline.add(comp, color, enc, mux, sink)
color.link(enc)
enc.link(mux)
mux.link(sink)

def on_pad(comp, pad, elements):
    convpad = elements.get_compatible_pad(pad, pad.get_caps())
    pad.link(convpad)
comp.connect("pad-added", on_pad, color)

# now run the pipeline
loop = gobject.MainLoop(is_running=True)
bus = pipeline.get_bus()
bus.add_signal_watch()
def on_message(bus, message, loop):
    if message.type == gst.MESSAGE_EOS:
        loop.quit()
    elif message.type == gst.MESSAGE_ERROR:
        print message
        loop.quit()
bus.connect("message", on_message, loop)
pipeline.set_state(gst.STATE_PLAYING)
loop.run()
pipeline.set_state(gst.STATE_NULL)

解决方案

It looks like the problem is in the properties of your second source file.

in stead of:

gsrc2.props.start          = 2 * gst.SECOND
gsrc2.props.duration       = 6 * gst.SECOND
gsrc2.props.media_start    = 0
gsrc2.props.media_duration = 2 * gst.SECOND
gsrc2.props.priority       = 2

try:

gsrc2.props.start          = 2 * gst.SECOND
gsrc2.props.duration       = 4 * gst.SECOND
gsrc2.props.media_start    = 0
gsrc2.props.media_duration = 4 * gst.SECOND
gsrc2.props.priority       = 2

This seems to work as expected for me.

这篇关于GStreamer&的视频转换GNonLin无法正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆