Видеопереходы с GStreamer и GNonLin не работают - PullRequest
1 голос
/ 02 августа 2011

Я пытался объединить 2 видео вместе с gstreamer с помощью короткого перехода (например, smpte) между ними, используя gstreamer & gnonlin в python.Однако я не могу заставить работать gnloperation / smpte.

Цель

Ниже приведена программа.Я хочу, чтобы он воспроизводил первые 4 секунды одного файла, а через 2 секунды начинал делать переход smpte (который длится 2 секунды) в другой файл.(таким образом, второй файл начнет воспроизводиться через 2 секунды, но будет «раскрыт» в течение 2-секундного перехода), и после того, как переход будет завершен, должны быть показаны 2 секунды второго файла.

Это основано на другом скрипте gstreamer / gnonlin на python .Я задал этот вопрос по списку gstreamer-devel снова ) и пытаюсь здесь.

Проблема

Переход не происходитт закончить.Переход выполняется в течение примерно 0,5 секунды, затем видео 1 воспроизводится в течение ~ 1,5 секунды, а затем видео 2 включается. Я попытался изменить конечную позицию контроллера (например, на controller.set("position", 0.5 * gst.SECOND, 0.0)), и переход завершается в течение 0,5 секунды., но как только переход завершается, видео 1 начинает воспроизводиться снова немного, затем начинается воспроизведение видео 2.

Думая, что, возможно, переход видео ограничен 0,5 с, я изменил операцию на 0,5 сТем не менее, сохраняется та же самая проблема с окончанием, за исключением того, что переход воспроизводится только в течение приблизительно 0,3 с, и часть видео 1 начинает работать немного, а затем воспроизводится видео 2.

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)

1 Ответ

2 голосов
/ 06 августа 2011

Похоже, проблема в свойствах вашего второго исходного файла.

вместо:

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

Это кажетсяработать как положено для меня.

...