Hi all,
I've been trying to combine 2 videos together with gstreamer with a short transition (like smpte) between them. Since I can't get it working with ges-launch, I'm trying to do raw gnonlin stuff in python. I want to make a video programme/script that takes a list of short videos, and combines them all into one big long video with ~2sec video transition between them. Now I'm trying to get a video transition working with 2 files. Below is my attempt. 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), and after the transition play 2 sec of the 2nd file on it's own. It only plays 2 sec of the first file and then freezes, doing nothing for ages until i manually kill it. If I don't add the operation to the gnlcomposition (i.e. I comment out the line "comp.add(op)"), then it works. It plays 2 sec of first file, then a few seconds of the second, then stops and the programme exits normally. I get no output on the command line (until I have to close the window), I get no output if I run it with GST_DEBUG=1 or GST_DEBUG=2. (with GST_DEBUG=3 I get about 1300 lines of output, do you want that?) Is there anything I'm doing wrong? I'm quite new to gstreamer. Thanks for your help, Rory McCann. The files can be downloaded from: http://www.technomancy.org/download/vshort01.mov http://www.technomancy.org/download/vshort02.mov ===== BEGIN 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 = 4 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) wipe = gst.element_factory_make("smpte") wipe.props.type = 234 wipe.props.duration = 2 * gst.SECOND op = gst.element_factory_make("gnloperation") op.add(wipe) 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") sink = gst.element_factory_make("autovideosink") pipeline = gst.Pipeline() pipeline.add(comp, color, sink) color.link(sink) def on_pad(comp, pad, elements): print "pad added" 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) ==== END SCRIPT ===== _______________________________________________ gstreamer-devel mailing list [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
I couldn't get the gnonlin/gnloperation/smpte workign, but based on this
http://notes.brooks.nu/gstreamer-video-crossfade-example/ I have had some success with putting in a videomixer and smptealpha. It doesn't hang, but 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. If I used videomixer2 rather than videmixer, it segfaults. I saved the below script to a file (rather than autovideosink it), since my laptop gets a bit sluggish when playing. Here's the result file http://www.technomancy.org/download/transitions-between-two.ogv Does anyone have any advise on what I'm doing wrong, or how to make it to proper transitions? Rory =====BEGIN 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) =====END SCRIPT==== _______________________________________________ gstreamer-devel mailing list [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
Free forum by Nabble | Edit this page |